diff --git a/README.md b/README.md
index c850ab7030a5f47a0429638b55f24efcd9541bfe..2bf9fbb76d8a139e6cdd19c8e39cf88f6f2d0340 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-Web service cadastre
\ No newline at end of file
+Module vMap for Vitis
\ No newline at end of file
diff --git a/_install/apache.conf b/_install/apache.conf
deleted file mode 100755
index da7bc6a88eba746b6b0fbb13ce9f8c53f4ada9c5..0000000000000000000000000000000000000000
--- a/_install/apache.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-
-	<Directory "[VASDIRECTORY]/public/cadastre">
-		Require all denied
-	</Directory>
\ No newline at end of file
diff --git a/_install/dependency.xml b/_install/dependency.xml
old mode 100755
new mode 100644
index 441f55462c883ee248dcb8eff5f16392358f9896..d1fc083e1c4f850ca273dba6cd29a3512ef7cb5e
--- a/_install/dependency.xml
+++ b/_install/dependency.xml
@@ -1,10 +1,30 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- WS GTF -->
+<!-- WS vMap -->
 <installer>
+	<schema>
+		<name>s_vmap</name>
+		<dependenciesCollection>
+			<dependency>
+				<nature>schema</nature>
+				<name>s_vitis</name>
+				<object>vitis</object>
+			</dependency>
+			<dependency>
+				<name>postgis</name>
+				<version>2.0</version>
+				<nature>extern-pre</nature>
+			</dependency>
+		</dependenciesCollection>
+	</schema>
 	<dependenciesCollection>
 		<dependency>
 			<nature>framework</nature>
 			<name>vitis</name>
 		</dependency>
+		<dependency>
+			<name>phantomjs</name>
+			<nature>extern-post</nature>
+			<location>phantomjs-2.1.1</location>
+		</dependency>
 	</dependenciesCollection>
 </installer>
diff --git a/module/css/fonts.css b/module/css/fonts.css
new file mode 100755
index 0000000000000000000000000000000000000000..4c7dbd94ca34cf2429c7edd17727298502205791
--- /dev/null
+++ b/module/css/fonts.css
@@ -0,0 +1,339 @@
+@font-face {
+    font-family: 'icomoon';
+    src:    url('fonts/icomoon.eot?27z5ev');
+    src:    url('fonts/icomoon.eot?27z5ev#iefix') format('embedded-opentype'),
+        url('fonts/icomoon.ttf?27z5ev') format('truetype'),
+        url('fonts/icomoon.woff?27z5ev') format('woff'),
+        url('fonts/icomoon.svg?27z5ev#icomoon') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'icomoon' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-street-view:before {
+    content: "\f21d";
+}
+.icon-point:before {
+    content: "\f111";
+}
+.icon-table:before {
+    content: "\f0ce";
+}
+.icon-comment:before {
+    content: "\f0e5";
+}
+.icon-block:before {
+    content: "\e06f";
+}
+.icon-remove_circle:before {
+    content: "\e080";
+}
+.icon-remove_circle_outline:before {
+    content: "\e081";
+}
+.icon-gps_fixed:before {
+    content: "\e0a3";
+}
+.icon-gps_off:before {
+    content: "\e0a5";
+}
+.icon-location_searching:before {
+    content: "\e0a7";
+}
+.icon-format_list_bulleted:before {
+    content: "\e0db";
+}
+.icon-scale_bar:before {
+    content: "\e0f0";
+}
+.icon-keyboard_arrow_down:before {
+    content: "\e10f";
+}
+.icon-keyboard_arrow_left:before {
+    content: "\e110";
+}
+.icon-keyboard_arrow_right:before {
+    content: "\e111";
+}
+.icon-keyboard_arrow_up:before {
+    content: "\e112";
+}
+.icon-crop:before {
+    content: "\e153";
+}
+.icon-rotate_90_degrees_ccw:before {
+    content: "\e1a9";
+}
+.icon-rotate_left:before {
+    content: "\e1aa";
+}
+.icon-rotate_right:before {
+    content: "\e1ab";
+}
+.icon-tonality:before {
+    content: "\e1b8";
+}
+.icon-transform:before {
+    content: "\e1b9";
+}
+.icon-layers:before {
+    content: "\e1d3";
+}
+.icon-layers_clear:before {
+    content: "\e1d4";
+}
+.icon-pin_drop:before {
+    content: "\e1f6";
+}
+.icon-cancel:before {
+    content: "\e205";
+}
+.icon-vpn_lock:before {
+    content: "\e233";
+}
+.icon-input:before {
+    content: "\e2a4";
+}
+.icon-language:before {
+    content: "\e2a8";
+}
+.icon-bus:before {
+    content: "\e600";
+}
+.icon-climbing:before {
+    content: "\e601";
+}
+.icon-cycling:before {
+    content: "\e602";
+}
+.icon-database2:before {
+    content: "\e603";
+}
+.icon-paint:before {
+    content: "\e604";
+}
+.icon-public-transport:before {
+    content: "\e605";
+}
+.icon-draw-infos:before {
+    content: "\e606";
+}
+.icon-database:before {
+    content: "\e607";
+}
+.icon-info:before {
+    content: "\e608";
+}
+.icon-measure:before {
+    content: "\e609";
+}
+.icon-add-feature:before {
+    content: "\e60a";
+}
+.icon-edit:before {
+    content: "\e60b";
+}
+.icon-polygon:before {
+    content: "\e60c";
+}
+.icon-compass:before {
+    content: "\e60d";
+}
+.icon-original-position:before {
+    content: "\e60e";
+}
+.icon-add-rectangle:before {
+    content: "\e610";
+}
+.icon-coordinates:before {
+    content: "\e611";
+}
+.icon-selection:before {
+    content: "\e612";
+}
+.icon-walking:before {
+    content: "\e613";
+}
+.icon-layers2:before {
+    content: "\e614";
+}
+.icon-line:before {
+    content: "\e615";
+}
+.icon-tree:before {
+    content: "\e616";
+}
+.icon-options:before {
+    content: "\e617";
+}
+.icon-show-infos:before {
+    content: "\e618";
+}
+.icon-print:before {
+    content: "\e619";
+}
+.icon-map:before {
+    content: "\e61a";
+}
+.icon-draw:before {
+    content: "\e61b";
+}
+.icon-circle:before {
+    content: "\e61c";
+}
+.icon-cadastre:before {
+    content: "\e61d";
+}
+.icon-user:before {
+    content: "\e61f";
+}
+.icon-users:before {
+    content: "\e620";
+}
+.icon-user-plus:before {
+    content: "\e621";
+}
+.icon-user-minus:before {
+    content: "\e622";
+}
+.icon-user-check:before {
+    content: "\e623";
+}
+.icon-user-tie:before {
+    content: "\e624";
+}
+.icon-key:before {
+    content: "\e625";
+}
+.icon-lock:before {
+    content: "\e627";
+}
+.icon-unlocked:before {
+    content: "\e628";
+}
+.icon-magic-wand:before {
+    content: "\e629";
+}
+.icon-tree2:before {
+    content: "\e62a";
+}
+.icon-eye:before {
+    content: "\e62b";
+}
+.icon-eye-plus:before {
+    content: "\e62c";
+}
+.icon-eye-minus:before {
+    content: "\e62d";
+}
+.icon-eye-blocked:before {
+    content: "\e62e";
+}
+.icon-pointer:before {
+    content: "\e630";
+}
+.icon-pushpin:before {
+    content: "\e631";
+}
+.icon-location:before {
+    content: "\e632";
+}
+.icon-map3:before {
+    content: "\e633";
+}
+.icon-map2:before {
+    content: "\e634";
+}
+.icon-binoculars:before {
+    content: "\e635";
+}
+.icon-search:before {
+    content: "\e636";
+}
+.icon-zoom-in:before {
+    content: "\e637";
+}
+.icon-zoom-out:before {
+    content: "\e638";
+}
+.icon-enlarge:before {
+    content: "\e639";
+}
+.icon-shrink:before {
+    content: "\e63a";
+}
+.icon-enlarge2:before {
+    content: "\e63b";
+}
+.icon-shrink2:before {
+    content: "\e63c";
+}
+.icon-cog:before {
+    content: "\e642";
+}
+.icon-stats-dots:before {
+    content: "\e643";
+}
+.icon-stackoverflow:before {
+    content: "\e644";
+}
+.icon-shopping_basket:before {
+    content: "\e900";
+}
+.icon-file-code:before {
+    content: "\f010";
+}
+.icon-file-text:before {
+    content: "\f011";
+}
+.icon-mirror:before {
+    content: "\f024";
+}
+.icon-clippy:before {
+    content: "\f035";
+}
+.icon-graph:before {
+    content: "\f043";
+}
+.icon-versions:before {
+    content: "\f064";
+}
+.icon-milestone:before {
+    content: "\f075";
+}
+.icon-link-external:before {
+    content: "\f07f";
+}
+.icon-file-binary:before {
+    content: "\f094";
+}
+.icon-puzzle:before {
+    content: "\f0c0";
+}
+.icon-fold:before {
+    content: "\f0cc";
+}
+.icon-object-group:before {
+    content: "\f247";
+}
+.icon-object-ungroup:before {
+    content: "\f248";
+}
+.icon-map-signs:before {
+    content: "\f277";
+}
+
diff --git a/module/css/fonts/icomoon.eot b/module/css/fonts/icomoon.eot
new file mode 100755
index 0000000000000000000000000000000000000000..4f6df06fce8176a92fb4950fbd5be2b04a8c7d97
Binary files /dev/null and b/module/css/fonts/icomoon.eot differ
diff --git a/module/css/fonts/icomoon.svg b/module/css/fonts/icomoon.svg
new file mode 100755
index 0000000000000000000000000000000000000000..63f4b26a0020e6c29bdae4162d22866c500f9332
--- /dev/null
+++ b/module/css/fonts/icomoon.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe06f;" glyph-name="block" d="M512 75.524q140 0 241 101t101 241q0 120-72 210l-480-480q90-72 210-72zM170 417.524q0-120 72-210l480 480q-90 72-210 72-140 0-241-101t-101-241zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
+<glyph unicode="&#xe080;" glyph-name="remove_circle" d="M726 375.524v84h-428v-84h428zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
+<glyph unicode="&#xe081;" glyph-name="remove_circle_outline" d="M512 75.524q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM298 459.524h428v-84h-428v84z" />
+<glyph unicode="&#xe0a3;" glyph-name="gps_fixed" d="M512 119.524q124 0 211 87t87 211-87 211-211 87-211-87-87-211 87-211 211-87zM894 459.524h88v-84h-88q-14-134-110-230t-230-110v-88h-84v88q-134 14-230 110t-110 230h-88v84h88q14 134 110 230t230 110v88h84v-88q134-14 230-110t110-230zM512 587.524q70 0 120-50t50-120-50-120-120-50-120 50-50 120 50 120 120 50z" />
+<glyph unicode="&#xe0a5;" glyph-name="gps_off" d="M694 181.524l-418 418q-62-82-62-182 0-124 87-211t211-87q100 0 182 62zM128 747.524l54 54 714-714-54-54-88 88q-90-74-200-86v-88h-84v88q-134 14-230 110t-110 230h-88v84h88q12 110 86 200zM894 459.524h88v-84h-88q-10-78-42-136l-64 64q22 54 22 114 0 124-87 211t-211 87q-60 0-114-22l-64 64q62 32 136 42v88h84v-88q134-14 230-110t110-230z" />
+<glyph unicode="&#xe0a7;" glyph-name="location_searching" d="M512 119.524q124 0 211 87t87 211-87 211-211 87-211-87-87-211 87-211 211-87zM894 459.524h88v-84h-88q-14-134-110-230t-230-110v-88h-84v88q-134 14-230 110t-110 230h-88v84h88q14 134 110 230t230 110v88h84v-88q134-14 230-110t110-230z" />
+<glyph unicode="&#xe0db;" glyph-name="format_list_bulleted" d="M298 715.524h598v-84h-598v84zM298 375.524v84h598v-84h-598zM298 119.524v84h598v-84h-598zM170 217.524q24 0 41-16t17-40-17-40-41-16-40 16-16 40 16 40 40 16zM170 737.524q26 0 45-18t19-46-19-46-45-18-45 18-19 46 19 46 45 18zM170 481.524q26 0 45-18t19-46-19-46-45-18-45 18-19 46 19 46 45 18z" />
+<glyph unicode="&#xe0f0;" glyph-name="scale_bar" d="M768 545.524h86v-256h-684v256h86v-170h512v170z" />
+<glyph unicode="&#xe10f;" glyph-name="keyboard_arrow_down" d="M316 595.524l196-196 196 196 60-60-256-256-256 256z" />
+<glyph unicode="&#xe110;" glyph-name="keyboard_arrow_left" d="M658 243.524l-60-60-256 256 256 256 60-60-196-196z" />
+<glyph unicode="&#xe111;" glyph-name="keyboard_arrow_right" d="M366 231.524l196 196-196 196 60 60 256-256-256-256z" />
+<glyph unicode="&#xe112;" glyph-name="keyboard_arrow_up" d="M316 271.524l-60 60 256 256 256-256-60-60-196 196z" />
+<glyph unicode="&#xe153;" glyph-name="crop" d="M298 203.524h684v-84h-172v-172h-84v172h-428q-34 0-59 25t-25 59v428h-172v84h172v172h84v-684zM726 289.524v342h-342v84h342q34 0 59-25t25-59v-342h-84z" />
+<glyph unicode="&#xe1a9;" glyph-name="rotate_90_degrees_ccw" d="M826 645.524q112-112 112-271t-112-271q-110-112-272-112-98 0-184 48l64 62q54-26 120-26 124 0 212 88 86 86 86 210t-86 212q-88 88-212 88v-138l-180 180 180 182v-138q162 0 272-114zM158 379.524l156-156 156 156-156 156zM314 655.524l276-276-276-276-278 276z" />
+<glyph unicode="&#xe1aa;" glyph-name="rotate_left" d="M554 755.524q126-16 213-112t87-226-87-226-213-112v86q92 16 153 87t61 165-61 165-153 87v-166l-194 190 194 194v-132zM302 147.524l62 62q46-34 106-44v-86q-96 12-168 68zM260 375.524q10-58 42-106l-60-60q-56 74-68 166h86zM304 565.524q-36-52-44-106h-86q12 90 70 166z" />
+<glyph unicode="&#xe1ab;" glyph-name="rotate_right" d="M720 269.524q34 46 44 106h86q-12-92-68-166zM554 165.524q60 10 106 44l62-62q-72-56-168-68v86zM850 459.524h-86q-10 60-44 106l62 60q56-74 68-166zM664 693.524l-194-190v166q-92-16-153-87t-61-165 61-165 153-87v-86q-126 16-213 112t-87 226 87 226 213 112v132z" />
+<glyph unicode="&#xe1b8;" glyph-name="tonality" d="M842 331.524q4 12 8 44h-296v-44h288zM778 203.524q24 34 30 44h-254v-44h224zM554 79.524q64 8 124 40h-124v-40zM554 503.524v-44h296q-4 32-8 44h-288zM554 631.524v-44h254q-6 10-30 44h-224zM554 755.524v-40h124q-60 32-124 40zM470 79.524v676q-126-16-213-112t-87-226 87-226 213-112zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
+<glyph unicode="&#xe1b9;" glyph-name="transform" d="M426 587.524v86h256q34 0 60-26t26-60v-256h-86v256h-256zM938 161.524h-170v-86h86l-128-128-128 128h84v86h-340q-34 0-60 26t-26 60v340h-170v86h170v86h-86l128 128 128-128h-84v-512h596v-86z" />
+<glyph unicode="&#xe1d3;" glyph-name="layers" d="M512 247.524q-18 14-163 127t-221 171l384 298 384-298q-76-58-220-170t-164-128zM512 137.524l314 246 70-54-384-298-384 298 70 54z" />
+<glyph unicode="&#xe1d4;" glyph-name="layers_clear" d="M140 887.524l798-800-54-54-160 162-212-164-384 298 70 54 314-246 150 118-60 60-90-68q-18 14-163 127t-221 171l138 108-180 180zM896 545.524q-54-42-172-134l-336 336 124 96zM846 289.524l-62 62 50 38 62-60z" />
+<glyph unicode="&#xe1f6;" glyph-name="pin_drop" d="M214 75.524h596v-84h-596v84zM426 587.524q0-34 26-59t60-25q36 0 61 25t25 59-26 60-60 26-60-26-26-60zM768 587.524q0-86-64-203t-128-191l-64-74q-28 30-71 82t-114 176-71 210q0 106 75 181t181 75 181-75 75-181z" />
+<glyph unicode="&#xe205;" glyph-name="cancel" d="M726 263.524l-154 154 154 154-60 60-154-154-154 154-60-60 154-154-154-154 60-60 154 154 154-154zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
+<glyph unicode="&#xe233;" glyph-name="vpn_lock" d="M426 35.524v84q-34 0-59 25t-25 59v44l-206 204q-8-32-8-76 0-130 86-227t212-113zM808 417.524h86q2-14 2-42 0-178-125-303t-301-125q-178 0-303 125t-125 303q0 176 125 301t303 125q62 0 128-20v-108q0-34-26-60t-60-26h-86v-84q0-18-12-31t-30-13h-86v-84h256q18 0 31-13t13-31v-128h42q62 0 82-58 88 94 88 230 0 28-2 42zM904 759.524v20q0 30-21 52t-51 22-51-22-21-52v-20h144zM938 759.524q18 0 31-13t13-31v-170q0-18-13-30t-31-12h-212q-18 0-31 12t-13 30v170q0 18 13 31t31 13v20q0 44 31 76t75 32 75-32 31-76v-20z" />
+<glyph unicode="&#xe2a4;" glyph-name="input" d="M470 247.524v128h-428v84h428v128l170-170zM896 801.524q34 0 60-25t26-61v-598q0-34-26-59t-60-25h-768q-34 0-60 25t-26 59v172h86v-172h768v600h-768v-172h-86v170q0 34 26 60t60 26h768z" />
+<glyph unicode="&#xe2a8;" glyph-name="language" d="M698 331.524h144q12 56 12 86t-12 86h-144q6-42 6-86t-6-86zM622 95.524q122 40 186 152h-126q-20-80-60-152zM612 331.524q6 42 6 86t-6 86h-200q-6-42-6-86t6-86h200zM512 77.524q56 82 82 170h-164q26-88 82-170zM342 587.524q20 80 60 152-122-40-186-152h126zM216 247.524q64-112 186-152-40 72-60 152h-126zM182 331.524h144q-6 42-6 86t6 86h-144q-12-56-12-86t12-86zM512 757.524q-56-82-82-170h164q-26 88-82 170zM808 587.524q-64 112-186 152 40-72 60-152h126zM512 843.524q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
+<glyph unicode="&#xe600;" glyph-name="bus" d="M905.232 773.828c-6.653 27.945-17.965 49.238-33.934 63.875s-39.257 27.945-69.864 39.922c-30.606 13.308-74.52 25.285-131.743 35.93s-109.454 15.969-156.694 15.969c-47.242 0-99.472-5.324-156.694-15.969s-101.136-22.622-131.743-35.93c-30.606-11.977-53.895-25.285-69.864-39.922s-26.614-35.93-31.938-63.875l-39.922-319.376v-445.131h61.879v-39.922c0-26.614 8.318-45.246 24.951-55.891s33.6-10.645 50.901 0 25.949 29.277 25.949 55.891v39.922h511.002v-39.922c0-26.614 10.314-45.246 30.94-55.891s40.92-10.645 60.881 0 29.942 29.277 29.942 55.891v39.922h61.879v445.131l-35.93 319.376zM300.413 852.674c5.324 9.981 14.639 14.971 27.945 14.971h409.201v-59.883h-409.201c-13.308 0-22.622 4.99-27.945 14.971s-5.324 19.961 0 29.942zM154.698 462.436l33.934 243.524c2.661 13.308 13.973 19.961 33.934 19.961h584.858c19.961 0 31.273-6.653 33.934-19.961l33.934-247.517c1.331-3.992 1.996-6.653 1.996-7.984 0-9.316-3.328-16.967-9.981-22.955s-15.304-8.982-25.949-8.982h-652.725c-10.645 0-19.296 3.328-25.949 9.981s-9.981 15.304-9.981 25.949c0 2.661 0.665 5.324 1.996 7.984zM260.491 164.019c-13.308-12.641-28.943-18.963-46.908-18.963s-33.6 6.322-46.908 18.963-19.961 27.945-19.961 45.91 6.653 33.269 19.961 45.91c13.308 12.641 28.943 18.963 46.908 18.963s33.6-6.322 46.908-18.963 19.961-27.945 19.961-45.91-6.653-33.269-19.961-45.91zM863.314 164.019c-13.308-12.641-28.943-18.963-46.908-18.963s-33.6 6.322-46.908 18.963-19.961 27.945-19.961 45.91 6.653 33.269 19.961 45.91 28.943 18.963 46.908 18.963 33.6-6.322 46.908-18.963 19.961-27.945 19.961-45.91-6.653-33.269-19.961-45.91z" />
+<glyph unicode="&#xe601;" glyph-name="climbing" d="M117.014 489.76c-5.548-9.708-9.014-20.11-10.401-31.204v-16.642l4.16-257.95-91.531-191.382c-2.773-6.936-4.853-13.867-6.241-20.802-1.388-15.257 2.428-29.469 11.441-42.645s21.843-20.457 38.485-21.843c26.35-4.16 46.458 5.546 60.327 29.123l97.771 210.105c2.773 5.546 4.16 10.401 4.16 14.562v168.5l151.858-66.568 24.963-156.018c5.548-24.963 21.497-39.525 47.846-43.685 15.254-2.775 29.471 0.695 42.645 10.401s21.15 22.188 23.923 37.444v16.642l-31.204 187.222c-2.773 19.413-13.174 33.284-31.204 41.605l-135.216 60.327 85.29 149.778 43.685-54.086c4.16-5.548 9.708-9.708 16.642-12.481l162.259-45.765c24.963-5.548 42.298 3.468 52.006 27.043 4.16 11.094 3.813 22.535-1.040 34.324s-12.829 19.762-23.923 23.923l-2.080 2.080-141.457 41.605-108.173 126.895c-16.642 18.029-36.752 29.123-60.327 33.284-47.153 6.933-82.517-9.708-106.092-49.926l-118.574-203.864zM585.069 119.475l-10.401-76.969-280.833-68.648 2.080-47.846h684.4c11.102 0 21.156 4.506 30.164 13.522 9.014 9.016 13.522 19.068 13.522 30.164l-2.080 917.388-93.611 22.883-52.006-241.308-91.531-37.444-79.049-222.586 74.889-170.58-20.802-64.488-174.74-54.086zM393.686 753.951c23.575 0 44.033 8.668 61.367 26.003 17.335 17.339 26.003 37.794 26.003 61.367 0 23.58-8.668 44.035-26.003 61.367-17.337 17.335-37.792 26.003-61.367 26.003-23.577 0-44.033-8.668-61.367-26.003s-26.003-37.792-26.003-61.367 8.668-44.033 26.003-61.367 37.792-26.003 61.367-26.003zM221.026 741.47c8.321 13.869 4.853 24.963-10.401 33.284l-41.605 24.963c-15.254 8.321-27.043 4.853-35.364-10.401l-128.975-222.586c-8.321-15.254-5.548-26.35 8.321-33.284l43.685-24.963c13.869-8.321 24.963-5.548 33.284 8.321l131.055 224.666z" />
+<glyph unicode="&#xe602;" glyph-name="cycling" d="M207.186 400.168c-57.129 0-105.943-20.972-146.441-62.915s-60.746-92.203-60.746-150.78 20.248-108.475 60.746-149.695 89.311-61.831 146.441-61.831 105.943 20.61 146.441 61.831 60.746 91.119 60.746 149.695-20.248 108.837-60.746 150.78-89.311 62.915-146.441 62.915zM326.508 64.982c-32.542-33.989-71.956-50.983-118.237-50.983s-86.057 16.994-119.322 50.983-49.898 74.847-49.898 122.576 16.633 88.587 49.898 122.576 73.040 50.983 119.322 50.983 85.695-16.994 118.237-50.983 48.814-74.847 48.814-122.576-16.271-88.587-48.814-122.576zM963.254 335.083c-40.498 41.943-89.311 62.915-146.441 62.915s-105.943-20.972-146.441-62.915-60.746-92.203-60.746-150.78 20.248-108.475 60.746-149.695 89.311-61.831 146.441-61.831 105.943 20.61 146.441 61.831 60.746 91.119 60.746 149.695-20.248 108.837-60.746 150.78zM935.051 62.812c-33.265-33.989-73.038-50.983-119.322-50.983-46.282 0-85.695 16.994-118.237 50.983s-48.814 74.847-48.814 122.576 16.271 88.587 48.814 122.576 71.956 50.983 118.237 50.983 86.057-16.994 119.322-50.983 49.898-74.847 49.898-122.576-16.633-88.587-49.898-122.576zM609.627 701.727c21.695 0 40.136 7.956 55.322 23.864s22.78 34.712 22.78 56.407-7.593 40.498-22.78 56.407-33.627 23.864-55.322 23.864-40.136-7.956-55.322-23.864-22.78-34.712-22.78-56.407 7.593-40.498 22.78-56.407 33.627-23.864 55.322-23.864zM757.153 506.473c13.017 0 22.417 5.424 28.203 16.271s5.786 21.695 0 32.542-15.186 16.271-28.203 16.271h-125.831l-82.441 136.678-6.508 8.678c-2.892 4.339-8.678 9.040-17.356 14.102s-18.078 7.593-28.203 7.593h-8.678c-4.339 1.447-10.847 0.362-19.525-3.254s-15.909-9.040-21.695-16.271l-164.881-169.22c-10.125-11.57-15.186-26.034-15.186-43.39 0-26.034 10.847-45.559 32.542-58.576l169.22-95.458v-180.068c0-13.017 3.977-23.864 11.932-32.542s18.441-13.017 31.458-13.017 23.502 4.339 31.458 13.017 11.932 19.525 11.932 32.542v223.458l2.169 10.847c0 5.786-2.892 13.379-8.678 22.78s-14.464 16.994-26.034 22.78l-97.627 52.068 106.305 104.136 49.898-80.271c8.678-14.464 19.525-21.695 32.542-21.695h143.186z" />
+<glyph unicode="&#xe603;" glyph-name="database2" d="M883.864 271.51c-46.608-75.358-195.442-130.534-371.864-130.534s-325.257 55.178-371.919 130.534c-9.842 16.033-15.094 7.464-15.094-0.387 0-7.962 0-110.685 0-110.685 0-107.258 173.271-218.386 387.013-218.386s387.013 111.128 387.013 218.331c0 0 0 102.724 0 110.685 0 7.907-5.308 16.476-15.149 0.443zM884.472 554.361c-45.889-66.622-195.275-115.551-372.472-115.551s-326.639 48.93-372.528 115.551c-9.454 13.711-14.485 6.248-14.485 0.11 0-6.248 0-130.312 0-130.312 0-97.416 173.271-176.312 387.013-176.312s387.013 78.951 387.013 176.312c0 0 0 124.065 0 130.312 0 6.137-5.086 13.6-14.541-0.11zM512 915.112c-213.741 0-387.013-65.239-387.013-145.572v-69.663c0-85.198 173.271-154.308 387.013-154.308s387.013 69.11 387.013 154.308v69.663c0 80.333-173.271 145.572-387.013 145.572z" />
+<glyph unicode="&#xe604;" glyph-name="paint" d="M977.171 594.435c-31.22 56.888-74.579 101.636-130.081 134.244s-117.593 56.543-186.276 71.805-145.343 22.894-229.984 22.894c-63.827 0-123.837-11.795-180.033-35.382s-101.984-52.726-137.366-87.415-63.132-70.071-83.252-106.146-30.179-67.99-30.179-95.74c0-56.888 13.876-102.677 41.626-137.366s67.99-52.033 120.715-52.033c55.502 0 96.087-7.978 121.756-23.935s38.504-44.055 38.504-84.293c0-54.114 18.039-99.209 54.114-135.285s81.171-54.114 135.285-54.114c165.116 0 291.73 37.463 379.837 112.39s132.163 163.73 132.163 266.407c0 79.089-15.61 147.079-46.829 203.967zM223.74 437.296c-13.181-13.181-29.138-19.772-47.87-19.772s-34.689 6.591-47.87 19.772-19.772 29.138-19.772 47.87 6.591 34.689 19.772 47.87c13.181 13.181 29.138 19.772 47.87 19.772s34.689-6.591 47.87-19.772 19.772-29.138 19.772-47.87-6.591-34.689-19.772-47.87zM363.187 579.865c-18.732 0-34.341 6.591-46.829 19.772s-18.732 29.138-18.732 47.87 6.244 34.689 18.732 47.87 28.098 19.772 46.829 19.772 34.689-6.591 47.87-19.772 19.772-29.138 19.772-47.87-6.591-34.689-19.772-47.87-29.138-19.772-47.87-19.772zM569.236 143.833c-15.959-15.957-35.037-23.935-57.236-23.935-22.201 0-41.278 7.978-57.236 23.935s-23.935 35.035-23.935 57.236 7.978 41.281 23.935 57.236c15.957 15.957 35.037 23.935 57.236 23.935 22.201 0 41.278-7.978 57.236-23.935s23.935-35.035 23.935-57.236-7.978-41.278-23.935-57.236zM627.512 599.638c-13.181-13.181-29.138-19.772-47.87-19.772s-34.689 6.591-47.87 19.772-19.772 29.138-19.772 47.87 6.591 34.689 19.772 47.87 29.138 19.772 47.87 19.772 34.689-6.591 47.87-19.772 19.772-29.138 19.772-47.87-6.591-34.689-19.772-47.87zM841.886 491.41c-13.181-13.181-29.138-19.772-47.87-19.772s-34.689 6.591-47.87 19.772-19.772 29.138-19.772 47.87 6.591 34.689 19.772 47.87 29.138 19.772 47.87 19.772 34.689-6.591 47.87-19.772 19.772-29.138 19.772-47.87-6.591-34.689-19.772-47.87z" />
+<glyph unicode="&#xe605;" glyph-name="public-transport" d="M404 704.524c-45.334 18.666-98.334 28-159 28s-113.666-9.334-159-28c-36-14.666-56-34-60-58l-26-174v-240h36c0-33.334 5.666-56.334 17-69s23-12.666 35 0 18 35.666 18 69h274c0-33.334 6-56.334 18-69s23.666-12.666 35 0 17 35.666 17 69h42v240l-28 174c-4 24-24 43.334-60 58zM110 687.524c2.666 10 6.666 15 12 15h226v-62h-226c-5.334 0-9.334 5.334-12 16s-2.666 21 0 31zM46 478.524l20 122c1.334 2.666 2.334 4 3 4s2.666-0.666 6-2 6.334-2 9-2h320c2.666 0 6 0.666 10 2 5.34 2.666 8.674 2 10-2l18-132 2 2c0-9.334-6.666-14-20-14h-360c-12 0-18 6-18 18v4zM105 312.524c-7.334-6.666-16-10-26-10s-18.666 3.334-26 10-11 15-11 25 3.666 18.334 11 25 16 10 26 10 18.666-3.334 26-10 11-15 11-25-3.666-18.334-11-25zM435 312.524c-7.334-6.666-16-10-26-10s-18.334 3.334-25 10-10 15-10 25 3.334 18.334 10 25 15 10 25 10 18.666-3.334 26-10 11-15 11-25-3.666-18.334-11-25zM916 230.524v4c16 6.666 30 14.666 42 24 10.666 8 18.666 21.334 24 40 1.334 5.336 2 10.67 2 16v372c0 10.666-2.666 20-8 28-5.334 10.672-11.334 19.338-18 26-6.666 5.334-16.666 11.334-30 18-2.666 1.334-6 2.666-10 4s-7.666 2.334-11 3l-5 1v-2h-268v2c-6.666-1.334-14-4-22-8-12-5.334-21.334-11.334-28-18-10.666-9.334-18-17.334-22-24-6.666-12-10-21.334-10-28v-378c0-5.334 2-12 6-20 2.666-5.334 6.666-12 12-20l16-16c5.334-5.334 11.334-9.334 18-12 1.334-1.334 6-3.334 14-6 5.334-1.334 8-2.668 8-4l-108-164h62l80 122h220l80-122h64l-108 162zM732 744.524h74c18.666 0 28-7 28-21s-9.334-21-28-21h-74c-18.666 0-28 7-28 21s9.334 21 28 21zM594 556.524v46c0 17.334 5.666 31.666 17 43s25 17 41 17h212c16 0 29.666-5.666 41-17 11.334-11.336 17-25.67 17-43v-46c0-16-5.666-29.666-17-41s-25-17-41-17h-212c-16 0-29.666 5.666-41 17s-17 25-17 41zM678 297.524c-8-8.666-18-13-30-13s-22 4.334-30 13-12 19-12 31c0 10.666 4 20 12 28s18 12 30 12 22-3.666 30-11 12-17.666 12-31c0-10.668-4-20.334-12-29zM860 297.524c-8 8.666-12 19-12 31s4.334 21.666 13 29 19 11 31 11 22-4 30-12 12-17.334 12-28c0-12-4-22.334-12-31s-18.334-13-31-13-23 4.334-31 13z" />
+<glyph unicode="&#xe606;" glyph-name="draw-infos" d="M865.715 560.463l-538.973-539.675-260.226-85.32 85.32 260.171 539.675 539.134 174.203-174.311zM707.603 604.687c8.317 8.261 8.317 17.28 0 26.784-3.996 4.158-8.749 6.209-14.040 6.209-5.184 0-9.288-2.052-12.637-6.209l-429.569-428.327c-4.211-4.211-6.209-8.749-6.209-13.987 0-5.184 2.052-9.881 6.209-13.987 3.294-3.401 7.883-4.914 13.716-4.914 4.968 0 9.288 1.459 13.068 4.914l429.46 429.516zM1000.823 800.113c14.634-14.526 21.816-32.022 21.816-52.596s-7.182-37.799-21.816-51.948l-74.034-74.034-174.366 174.257 74.142 74.195c14.58 14.472 31.968 21.653 52.218 21.653 20.358 0 37.853-7.236 52.326-21.653l35.532-34.344 34.181-35.532zM-1.361 687.524h108v-270h-108v270zM-1.361 876.522h108v-108h-108v108z" />
+<glyph unicode="&#xe607;" glyph-name="database" d="M73.11 710.215v73.071c0 26.325 19.555 50.739 58.897 73.245 39.11 22.391 92.568 40.325 160.028 53.343 67.286 13.19 140.762 19.787 219.966 19.787s152.681-6.538 220.024-19.787c67.576-13.017 120.801-30.952 160.028-53.343 39.458-22.506 58.897-46.921 58.897-73.245v-73.13c0-26.325-19.44-50.739-58.897-73.245-39.225-22.506-92.453-40.21-160.028-53.458-67.343-13.25-140.821-19.787-220.024-19.787s-152.681 6.538-220.024 19.787c-67.459 13.25-120.918 30.952-160.028 53.458-39.285 22.564-58.84 46.978-58.84 73.303zM73.11 490.654v97.197c45.3-31.994 107.264-56.177 185.658-72.55 78.625-16.374 162.92-24.647 253.234-24.647s174.782 8.273 253.234 24.647c78.51 16.374 140.473 40.556 185.658 72.55v-97.197c0-26.325-19.44-50.624-58.897-73.13-39.225-22.506-92.453-40.21-160.028-53.458-67.343-13.25-140.821-19.67-220.024-19.67s-152.681 6.422-220.024 19.67c-67.459 13.25-120.918 30.952-160.028 53.458-39.225 22.506-58.78 46.805-58.78 73.13zM73.11 271.323v97.024c45.3-31.994 107.264-56.177 185.658-72.55 78.625-16.374 162.92-24.531 253.234-24.531s174.782 8.158 253.234 24.531c78.51 16.374 140.473 40.556 185.658 72.55v-97.082c0-26.44-19.44-50.739-58.897-73.245-39.225-22.621-92.453-40.21-160.028-53.458-67.343-13.25-140.821-19.787-220.024-19.787s-152.681 6.538-220.024 19.787c-67.459 13.25-120.918 30.837-160.028 53.458-39.225 22.564-58.78 46.863-58.78 73.303zM73.11 51.762v97.197c45.3-32.11 107.264-56.177 185.658-72.666 78.625-16.257 162.92-24.531 253.234-24.531s174.782 8.273 253.234 24.531c78.51 16.489 140.473 40.556 185.658 72.666v-97.197c0-26.325-19.44-50.739-58.897-73.245-39.225-22.391-92.453-40.325-160.028-53.343-67.343-13.25-140.821-19.787-220.024-19.787s-152.681 6.538-220.024 19.787c-67.459 13.017-120.918 30.952-160.028 53.343-39.225 22.506-58.78 46.921-58.78 73.245z" />
+<glyph unicode="&#xe608;" glyph-name="info" d="M68.666 160.527c-45.644 78.352-68.609 164.057-68.609 256.997s22.965 178.531 68.609 256.997c45.815 78.295 107.985 140.579 186.394 186.224 78.467 45.815 164.227 68.666 256.997 68.666s178.531-22.85 256.997-68.666c78.409-45.644 140.579-107.928 186.394-186.224 45.644-78.467 68.609-164.057 68.609-256.997s-22.965-178.644-68.609-256.997c-45.815-78.409-107.985-140.579-186.394-186.224-78.467-45.815-164.227-68.666-256.997-68.666s-178.531 22.85-256.997 68.666c-78.467 45.644-140.636 107.813-186.394 186.224zM341.391 97.559c0-6.269 1.88-11.282 6.040-15.329 3.818-3.988 9.060-5.927 15.272-5.927h298.596c6.154 0 11.397 1.938 15.442 5.927s6.040 9.003 6.040 15.329v106.616c0 6.326-2.052 11.397-6.040 15.386s-9.232 5.927-15.442 5.927h-63.993v341.334c0 6.154-2.052 11.282-5.927 15.442-3.988 3.818-9.232 5.927-15.442 5.927h-213.234c-6.154 0-11.397-2.052-15.272-5.927-4.16-4.104-6.040-9.232-6.040-15.442v-106.731c0-6.154 1.88-11.282 6.040-15.272 3.818-4.045 9.060-6.040 15.272-6.040h63.993v-213.291h-63.993c-6.154 0-11.397-1.938-15.272-5.927-4.16-3.932-6.040-9.003-6.040-15.386v-106.616zM426.694 694.751c0-6.212 2.052-11.341 5.927-15.215 4.16-4.16 9.232-6.040 15.499-6.040h127.871c6.154 0 11.397 1.88 15.442 6.040 3.818 3.818 5.927 8.947 5.927 15.215v106.674c0 6.212-2.052 11.282-5.927 15.442-3.988 3.875-9.232 5.927-15.442 5.927h-127.871c-6.269 0-11.341-2.052-15.499-5.927-3.818-4.104-5.927-9.174-5.927-15.442v-106.674z" />
+<glyph unicode="&#xe609;" glyph-name="measure" d="M1024.001 603.705v93.091h-1024v-558.546h1024v232.728h-93.091v-139.636h-93.091v232.728h-93.091v-232.728h-93.091v139.636h-93.091v-139.636h-93.091v232.728h-93.091v-232.728h-93.091v139.636h-93.091v-139.636h-93.091v372.364z" />
+<glyph unicode="&#xe60a;" glyph-name="add-feature" d="M887.648 540.937l-465.399-465.959-224.681-73.666 73.666 224.633 465.959 465.492 150.455-150.501zM751.134 579.122c7.181 7.133 7.181 14.92 0 23.125-3.497 3.59-7.554 5.361-12.123 5.361-4.476 0-8.066-1.772-10.91-5.361l-370.893-369.821c-3.636-3.636-5.361-7.554-5.361-12.076 0-4.476 1.772-8.532 5.361-12.076 2.844-2.937 6.806-4.243 11.843-4.243 4.289 0 8.019 1.259 11.283 4.243l370.799 370.847zM1004.301 747.854c12.635-12.542 18.836-27.648 18.836-45.412s-6.248-32.636-18.836-44.852l-63.922-63.922-150.549 150.455 64.014 64.061c12.542 12.496 27.555 18.696 45.039 18.696 17.577 0 32.683-6.248 45.225-18.696l30.679-29.653 29.512-30.679zM372.129 697.267h-139.871v139.871h-93.248v-139.871h-139.871v-93.248h139.871v-139.871h93.248v139.871h139.871z" />
+<glyph unicode="&#xe60b;" glyph-name="edit" d="M830.99 408.194l107.108 106.536v-353.598c0-23.325-4.665-45.319-13.9-65.835-9.235-20.469-21.613-38.606-37.178-54.126-15.471-15.471-33.513-27.848-53.84-36.892-20.374-9.044-42.368-13.567-66.074-13.567h-596.615c-23.325 0-45.461 4.523-66.407 13.567-20.85 9.044-38.94 21.422-54.126 36.892-15.137 15.518-27.276 33.655-36.369 54.126-9.044 20.516-13.567 42.51-13.567 65.835v511.737c0 23.325 4.523 45.413 13.567 66.407 9.044 20.85 21.183 38.94 36.369 54.126 15.137 15.043 33.227 27.134 54.126 36.369 20.899 9.044 43.034 13.567 66.407 13.567h596.615c1.476 0 3.428-0.238 5.807-0.572 2.475-0.476 4.379-0.572 5.855-0.572l-106.013-106.013h-502.265c-17.471 0-32.371-6.235-44.652-18.708-12.472-12.281-18.66-27.229-18.66-44.605v-511.737c0-17.471 6.188-32.323 18.66-44.699 12.33-12.377 27.181-18.613 44.652-18.613h596.615c17.376 0 32.418 6.235 44.938 18.613 12.614 12.425 18.899 27.229 18.899 44.699v247.062zM894.78 591.848l-361.311-361.311-183.226-60.028 59.98 182.606 361.93 361.93 122.626-123.198zM783.245 622.933c6.665 6.618 6.665 12.995 0 19.374-6.712 5.903-13.091 5.903-19.47 0l-283.051-283.051c-6.618-6.712-6.618-13.139 0-19.47 2.284-2.951 5.379-4.427 9.425-4.427 3.713 0 6.712 1.476 8.949 4.427l284.145 283.146zM1008.6 778.312c9.997-10.758 15.043-22.945 15.281-36.892 0.142-13.805-4.951-26.181-15.281-36.892l-52.698-51.031-122.675 122.722 51.078 52.078c10.758 10.806 23.278 16.090 37.75 16.090 14.423 0 26.467-5.284 36.083-16.090l25.515-24.897 24.944-25.087z" />
+<glyph unicode="&#xe60c;" glyph-name="polygon" d="M726.539 792.968h10.244l26.925-47.896 78.79 78.79-42.909 76.376h-233.956v-107.271zM917.587 471.158h122.985l-143.528 255.57-78.79-78.79zM320.363 792.968h138.003v107.271h-200.863l-54.815-97.563 78.843-78.843zM736.785 42.080h-171.149v-107.271h233.956l42.909 76.376-78.79 78.79zM320.363 42.080l-38.832 69.136-78.843-78.843 54.815-97.563h200.863v107.271zM139.558 363.89h-122.985l131.62-234.385 78.79 78.843zM917.587 363.89l-99.332-176.78 78.79-78.79 143.528 255.57zM226.983 626.7l-78.79 78.843-131.62-234.385h122.985zM726.539 471.158h-160.905v160.905h-107.271v-160.905h-160.905v-107.271h160.905v-160.905h107.271v160.905h160.905z" />
+<glyph unicode="&#xe60d;" glyph-name="compass" d="M512-30.476c-247.424 0-448 200.576-448 448s200.576 448 448 448c247.424 0 448-200.576 448-448s-200.576-448-448-448zM512 769.524c0 0 128-281.28 128-352s-57.308-128-128-128c-70.692 0-128 57.28-128 128s128 352 128 352zM512 33.524c212.077 0 384 171.923 384 384s-171.923 384-384 384c-212.077 0-384-171.923-384-384s171.923-384 384-384zM512 353.524c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" />
+<glyph unicode="&#xe60e;" glyph-name="original-position" d="M512 619.934c-111.787 0-202.41-90.623-202.41-202.41s90.623-202.41 202.41-202.41 202.41 90.623 202.41 202.41-90.623 202.41-202.41 202.41zM512 303.746c-62.805 0-113.778 50.972-113.778 113.778s50.972 113.778 113.778 113.778 113.778-50.972 113.778-113.778-50.972-113.778-113.778-113.778zM0 929.524v-398.222h113.778v284.445h284.445v113.778h-284.445zM910.222 929.524h-284.445v-113.778h284.445v-284.445h113.778v398.222zM910.222 19.302h-284.445v-113.778h398.222v398.222h-113.778zM113.778 303.746h-113.778v-398.222h398.222v113.778h-284.445z" />
+<glyph unicode="&#xe610;" glyph-name="add-rectangle" d="M0 701.969h113.778v-113.778h-113.778v113.778zM1024 815.746v113.778h-113.778v-113.778zM0 474.412h113.778v-113.778h-113.778v113.778zM0 246.857h113.778v-113.778h-113.778v113.778zM455.112 929.524h113.778v-113.778h-113.778v113.778zM682.667 929.524h113.778v-113.778h-113.778v113.778zM0 929.524h113.778v-113.778h-113.778v113.778zM227.555 929.524h113.778v-113.778h-113.778v113.778zM910.222 474.412h113.778v-113.778h-113.778v113.778zM910.222-94.476h113.778v113.778h-113.778zM910.222 246.857h113.778v-113.778h-113.778v113.778zM682.667 19.302h113.778v-113.778h-113.778v113.778zM227.555 19.302h113.778v-113.778h-113.778v113.778zM455.112 19.302h113.778v-113.778h-113.778v113.778zM0 19.302h113.778v-113.778h-113.778v113.778zM910.222 701.969h113.778v-113.778h-113.778v113.778zM739.555 474.412h-170.667v170.667h-113.778v-170.667h-170.667v-113.778h170.667v-170.667h113.778v170.667h170.667z" />
+<glyph unicode="&#xe611;" glyph-name="coordinates" d="M338.014 462.906l43.287 88.017h72.89l-74.007-131.258 76.009-133.445h-73.635l-44.545 89.647-44.545-89.647h-73.448l75.822 133.445-73.82 131.258h72.704l43.287-88.017zM511.255 314.891c0 4.376 0.837 8.425 2.467 12.195s3.956 6.982 6.889 9.728 6.519 4.887 10.66 6.47 8.75 2.374 13.825 2.374c4.934 0 9.541-0.791 13.73-2.374s7.775-3.724 10.704-6.47 5.26-5.958 6.889-9.728 2.467-7.819 2.467-12.195-0.837-8.425-2.467-12.195-3.956-6.982-6.889-9.728-6.563-4.887-10.704-6.47-8.75-2.374-13.73-2.374c-5.074 0-9.682 0.791-13.825 2.374s-7.68 3.724-10.66 6.47-5.26 5.958-6.889 9.728-2.467 7.819-2.467 12.195zM686.358 435.956l48.734 114.92h68.887l-85.271-169.658v-95.092h-64.744v95.092l-85.085 169.658h68.561l48.919-114.92zM0 836.433v-325.817h93.091v232.727h232.727v93.091h-232.727zM930.909 836.433h-232.727v-93.091h232.727v-232.727h93.091v325.817zM930.909 91.707h-232.727v-93.091h325.817v325.817h-93.091zM93.091 324.433h-93.091v-325.817h325.817v93.091h-232.727z" />
+<glyph unicode="&#xe612;" glyph-name="selection" d="M0 701.969h113.778v-113.778h-113.778v113.778zM1024 815.746v113.778h-113.778v-113.778zM0 474.412h113.778v-113.778h-113.778v113.778zM0 246.857h113.778v-113.778h-113.778v113.778zM455.112 929.524h113.778v-113.778h-113.778v113.778zM682.667 929.524h113.778v-113.778h-113.778v113.778zM0 929.524h113.778v-113.778h-113.778v113.778zM227.555 929.524h113.778v-113.778h-113.778v113.778zM910.222 474.412h113.778v-113.778h-113.778v113.778zM910.222-94.476h113.778v113.778h-113.778zM910.222 246.857h113.778v-113.778h-113.778v113.778zM682.667 19.302h113.778v-113.778h-113.778v113.778zM227.555 19.302h113.778v-113.778h-113.778v113.778zM455.112 19.302h113.778v-113.778h-113.778v113.778zM0 19.302h113.778v-113.778h-113.778v113.778zM910.222 701.969h113.778v-113.778h-113.778v113.778z" />
+<glyph unicode="&#xe613;" glyph-name="walking" d="M621.866 767.023c44.867 0 81.319 36.451 81.319 81.319 0 44.98-36.451 81.319-81.319 81.319-44.924 0-81.319-36.337-81.319-81.319 0-44.867 36.394-81.319 81.319-81.319zM861.956 552.127l31.504 185.385-32.357 1.138-28.774-180.38h-135.115c0 0-92.806 169.461-92.976 169.689-13.023 23.771-48.564 32.414-73.869 31.333-30.083-1.308-54.080-24.339-63.805-51.863-0.17-0.568-96.73-276.995-96.73-276.995-0.91-2.672-1.649-5.346-2.331-8.018l-68.524-179.925-150.297-219.333c-17.515-25.533-10.919-60.393 14.558-77.964 9.668-6.654 20.7-9.781 31.617-9.781 17.8 0 35.428 8.53 46.29 24.339l153.994 224.906c2.672 3.867 4.435 7.449 6.084 11.772l39.124 102.644 61.131-119.704v-215.239c0-30.993 25.022-56.069 55.956-56.069 30.993 0 56.013 25.078 56.013 56.069v228.659c0 8.871-2.048 17.685-6.084 25.533l-74.211 145.294c1.195 2.787 2.446 5.686 3.469 8.53l57.151 163.605 28.832-52.544c8.928-16.32 25.875-26.33 44.469-26.33h148.989l-87.688-550.693 23.542-0.796 93.829 552.001c24.169 3.867 42.706 24.907 42.706 50.213 0.113 19.221-10.634 35.996-26.499 44.526zM311.376 712.717l97.411-33.665c16.492-5.686 34.518 3.127 40.261 19.676l13.705 39.636c5.743 16.548-3.014 34.631-19.619 40.319l-97.355 33.665c-16.548 5.801-34.575-3.014-40.319-19.562l-13.705-39.749c-5.743-16.548 3.127-34.518 19.619-40.319zM299.036 367.084c16.548-5.801 34.575 3.014 40.319 19.562l82.571 238.895c5.801 16.548-3.070 34.631-19.619 40.319l-147.113 50.895c-16.605 5.801-34.631-3.127-40.376-19.562l-82.571-238.895c-5.743-16.548 3.070-34.631 19.676-40.319l147.113-50.895z" />
+<glyph unicode="&#xe614;" glyph-name="layers2" d="M828.802 526.223l195.141 108.756-511.943 285.14-512-285.197 195.141-108.756-195.141-108.756 195.141-108.756-195.141-108.699 512-285.025 512 285.14-195.141 108.699 195.141 108.756-195.198 108.699zM512 1.488l-356.553 198.583 117.474 65.448 239.079-133.192 239.079 133.133 117.531-65.448-356.611-198.524zM712.304 330.335l-200.304-111.451-356.553 198.583 117.474 65.448 239.079-133.192 43.938 24.55 38.833 21.51 38.89 21.74 117.417 65.391 117.531-65.448-117.531-65.391-38.776-21.74zM512 833.56l356.611-198.64-356.611-198.64-356.552 198.642 356.553 198.64z" />
+<glyph unicode="&#xe615;" glyph-name="line" d="M0 929.524h113.778v-113.778h-113.778v113.778zM455.112 929.524h113.778v-113.778h-113.778v113.778zM0 701.969h113.778v-113.778h-113.778v113.778zM682.667 929.524h113.778v-113.778h-113.778v113.778zM910.222 929.524h113.778v-113.778h-113.778v113.778zM227.555 929.524h113.778v-113.778h-113.778v113.778zM0 474.412h113.778v-113.778h-113.778v113.778zM0 246.857h113.778v-113.778h-113.778v113.778zM0 19.302h113.778v-113.778h-113.778v113.778zM739.555 474.412h-170.667v170.667h-113.778v-170.667h-170.667v-113.778h170.667v-170.667h113.778v170.667h170.667z" />
+<glyph unicode="&#xe616;" glyph-name="tree" d="M981.713 290.323c11.431 0 21.41-4.165 29.693-12.448 8.38-8.38 12.595-18.697 12.595-30.856v-212.841c0-12.255-4.165-22.428-12.595-30.856-8.235-8.283-18.213-12.448-29.693-12.448h-213.81c-12.255 0-22.233 4.165-30.033 12.448-7.848 8.38-11.674 18.6-11.674 30.856v212.841c0 12.109 3.972 22.428 12.013 30.856 7.944 8.283 17.777 12.448 29.693 12.448h75.468v85.010c0 6.684-3.876 10.172-11.577 10.56h-287.872v-95.57h75.033c11.431 0 21.41-4.165 29.693-12.448 8.38-8.38 12.595-18.697 12.595-30.856v-212.841c0-12.255-4.165-22.428-12.595-30.856-8.283-8.283-18.213-12.448-29.693-12.448h-213.907c-11.577 0-21.41 4.165-29.79 12.448-8.283 8.38-12.448 18.6-12.448 30.856v212.841c0 12.109 4.165 22.428 12.448 30.856 8.38 8.283 18.213 12.448 29.79 12.448h74.935v95.57h-287.776c-7.362 0-11.093-3.536-11.093-10.56v-85.010h75.033c12.255 0 22.428-4.165 30.856-12.448 8.38-8.38 12.448-18.697 12.448-30.856v-212.841c0-12.255-4.069-22.428-12.448-30.856-8.38-8.283-18.6-12.448-30.856-12.448h-212.841c-12.109 0-22.428 4.165-30.856 12.448-8.283 8.38-12.448 18.6-12.448 30.856v212.841c0 12.109 4.165 22.428 12.448 30.856 8.38 8.283 18.697 12.448 30.856 12.448h73.917v85.010c0 20.393 7.46 37.734 22.33 52.266 14.726 14.387 32.309 21.653 52.701 21.653h287.776v96.636h-74.935c-11.577 0-21.41 3.972-29.79 11.916-8.283 8.089-12.448 18.165-12.448 30.274v213.955c0 11.431 4.165 21.41 12.448 29.693 8.38 8.38 18.213 12.448 29.79 12.448h213.907c11.431 0 21.41-4.069 29.693-12.448 8.38-8.283 12.595-18.261 12.595-29.693v-213.955c0-12.109-4.165-22.185-12.595-30.274-8.283-7.944-18.213-11.916-29.693-11.916h-75.033v-96.684h287.872c20.296 0 37.831-7.121 52.653-21.41 14.871-14.289 22.233-31.727 22.233-52.459v-85.010h74.983z" />
+<glyph unicode="&#xe617;" glyph-name="options" d="M24.473 2.423c-15.552 14.658-23.271 33.119-23.271 55.16 0 21.651 7.72 40.334 23.271 55.831l417.898 417.898c15.944-40.056 39.328-75.525 70.208-106.462 30.881-30.881 66.405-54.264 106.462-70.208l-418.513-418.57c-15.106-15.106-33.51-22.658-55.216-22.658-21.259 0-39.776 7.609-55.831 22.658l-65.007 66.349zM156.949 124.549c-7.72-7.888-11.637-17.063-11.637-27.693 0-10.574 3.916-19.803 11.637-27.525 7.832-7.776 17.008-11.693 27.693-11.693 10.574 0 19.803 3.916 27.581 11.693 7.832 7.72 11.637 16.95 11.637 27.525 0 10.629-3.803 19.803-11.637 27.693-7.776 7.72-17.008 11.637-27.581 11.637-10.685 0-19.859-3.971-27.693-11.637zM734.454 371.763c-75.69 0-140.475 27.020-194.181 80.725-53.816 53.816-80.67 118.546-80.67 194.236 0 75.748 26.852 140.475 80.67 194.292 53.705 53.761 118.489 80.67 194.181 80.67 23.721 0 48.56-3.468 74.574-10.126 25.902-6.714 47.999-16.225 65.957-28.643 6.546-4.42 9.845-10.238 9.845-17.12 0-7.049-3.3-12.754-9.845-17.286l-179.803-103.718v-137.51l118.489-65.566c2.070 1.176 18.182 11.134 48.504 29.707 30.21 18.629 58.014 35.134 83.077 49.79 25.175 14.49 39.665 21.762 43.356 21.762 6.041 0 10.909-2.014 14.376-6.155 3.413-3.971 5.203-9.12 5.203-15.329 0-15.887-4.754-37.707-14.099-65.007-19.3-54.824-52.867-99.301-100.979-133.537-48.057-34.070-100.923-51.189-158.655-51.189v0z" />
+<glyph unicode="&#xe618;" glyph-name="show-infos" d="M221.014 299.368c-6.122 10.548-9.033 20.855-9.033 31.099 0 10.124 2.971 20.551 9.033 31.099 41.951 68.747 98.514 123.976 169.505 165.684s145.982 62.565 224.976 62.565 153.985-20.855 224.976-62.565 127.554-96.998 169.505-165.684c6.001-10.548 9.033-20.976 9.033-31.099 0-10.246-3.092-20.551-9.033-31.099-41.951-69.051-98.514-124.339-169.505-165.867-70.99-41.649-145.982-62.321-224.976-62.321s-153.985 20.855-224.976 62.502c-70.99 41.71-127.554 96.998-169.505 165.684v0zM441.262 489.484c-68.93-35.161-126.097-88.147-171.625-159.017 39.951-61.533 89.966-110.517 150.105-147.073 60.199-36.435 125.431-54.622 195.755-54.622s135.494 18.248 195.693 54.622c60.138 36.556 110.214 85.54 150.165 147.073-45.649 70.87-102.697 123.854-171.625 159.017 18.368-31.343 27.584-65.049 27.584-101.363 0-55.592-19.642-103.061-59.352-142.526-39.346-39.467-86.995-59.289-142.466-59.289-55.652 0-103.061 19.763-142.466 59.289-39.648 39.406-59.352 86.934-59.352 142.526 0 36.254 9.275 70.021 27.584 101.363v0zM478.545 388.121c0-5.941 2.062-11.156 6.305-15.338 4.183-4.122 9.214-6.245 15.338-6.245 5.941 0 11.216 2.062 15.338 6.245 4.183 4.183 6.305 9.397 6.305 15.338 0 25.826 9.094 47.892 27.402 66.202 18.308 18.368 40.376 27.462 66.262 27.462 5.941 0 11.156 2.062 15.338 6.305s6.305 9.275 6.305 15.338c0 6.001-2.062 11.093-6.305 15.278-4.183 4.243-9.397 6.366-15.338 6.366-37.465 0-69.717-13.52-96.573-40.376-26.917-26.856-40.376-59.048-40.376-96.573zM-4.992 720.644h121.248v-303.12h-121.248v303.12zM-4.992 932.827h121.248v-121.248h-121.248v121.248z" />
+<glyph unicode="&#xe619;" glyph-name="print" d="M896.81 331.94c17.34 0 33.904-3.293 49.451-9.977 15.548-6.733 29.012-15.789 40.249-27.22 11.285-11.528 20.391-25.041 27.268-40.588 6.83-15.644 10.219-32.063 10.219-49.451v-192.332c0-14.434-7.12-21.651-21.651-21.651h-980.699c-14.53 0-21.651 7.217-21.651 21.651v192.332c0 17.34 3.39 33.759 10.219 49.451 6.926 15.548 16.226 29.061 27.752 40.588 11.672 11.43 25.38 20.537 40.927 27.22 15.499 6.683 31.967 9.977 49.451 9.977h768.458zM875.209 119.169c0 5.909-2.18 11.042-6.539 15.16-4.165 4.359-9.25 6.49-15.209 6.49h-682.876c-6.007 0-11.092-2.035-15.305-6.151-4.311-4.068-6.442-9.25-6.442-15.499v-21.214c0-5.86 2.131-10.801 6.442-14.725 4.214-3.875 9.3-5.812 15.305-5.812h682.876c5.957 0 11.092 1.84 15.209 5.569 4.359 3.729 6.539 8.718 6.539 14.966v21.214zM853.462 395.873h-682.876v406.122c0 11.43 4.068 21.408 12.495 29.787 8.283 8.331 18.598 12.545 30.805 12.545h361.756v-212.917c0-18.163 6.296-33.516 18.938-46.013 12.593-12.69 27.511-18.938 44.996-18.938h213.934v-170.586zM853.462 631.41h-213.934v212.917l213.934-212.917z" />
+<glyph unicode="&#xe61a;" glyph-name="map" d="M309.956 624.846v-37.967c4.74-0.895 11.315-0.626 20.169 1.342-3.936-7.961-12.79-17.665-20.169-27.636v-39.040c5.233-3.936 10.151-7.736 9.571-7.826 16.279 2.863 10.464-9.749 12.834-13.595-6.439 2.057-14.22 1.879-22.405 0.76v-311.609l160.321-71.462v350.024c-0.671 1.297-0.939 2.281-0.715 2.728-0.134-0.358-0.269-0.582 0 0 0.447 0.939 0.179 0.402 0 0 0.224 0.447 0.447 0.76 0.715 1.073v185.052l-80.005 35.641c-16.144-0.939-30.41-4.338-36.044-10.464-5.858-6.484-30.231-33.451-44.273-57.018zM409.681 382.776c-9.347-11.359-16.412-15.026-23.836-27.101-11.628-5.904-20.437 15.204-28.8-2.772-0.804-1.655 0.045-29.024-1.342-26.563-9.302-20.035 24.686 1.744-8.989-22.763-7.066-5.187 1.566-15.831-8.809-20.124-1.162 3.533-3.845 5.993-7.961 7.245-13.014-3.309 6.619 85.907 11.27 72.267-0.224-0.179 2.146 18.38 5.546 22.941 2.952 3.891 51.338-2.863 62.922-3.13zM211.213 503.118c3.936 3.891 9.436 6.574 15.295 8.183v-150.439c-21.063 1.208-0.358 5.724-11.672 22.092-17.843-5.59-88.008-25.982-91.811-15.384-12.477 35.106-6.171 74.459 45.525 73.833 21.823-0.269 17.888 6.082 11.583 16.904-3.801 6.619 25.804 39.622 31.081 44.81zM209.156 305.589c5.858 2.907 11.717 5.098 17.396 7.468v-123.785l-76.024-33.898c-5.68 7.916-7.423 17.083-1.118 22.987-5.277-4.92-51.876-0.939-83.179 9.391v50.176c10.912 7.468 22.807 11.895 32.78 3.13 8.050-7.021 41.723-6.932 27.95 5.233-8.587 7.558 12.879 41.276-7.29 43.915-28.889 3.756-10.196 44.497 15.16 39.13 13.998 14.311 28.665-3.891 34.39-10.509 25.535-0.089 29.158 2.236 39.935-13.237zM797.492 192.091v328.379c15.026 0.134 30.141-0.313 44.81-1.297 23.702-1.475 0.358-10.331 9.391-13.416 9.391-3.265 17.754 10.151 25.222-5.948 9.436-20.437-7.558-8.989 12.208-26.341 30.768-27.056-5.59-41.276 7.021-71.687 11.895 3.845 29.113 15.562 39.935 21.421-23.567 12.074 5.813 25.804 21.645 25.579v-206.562c-6.977-6.977-6.663-14.713 0-21.421v-53.753c-15.875-12.477-37.878-22.583-54.424-24.953l-25.311 11.315c-5.098 7.603-10.733 16.099-9.749 18.156-7.468 0.984-26.787 8.496-21.332 18.023-14.176-5.635-23.389-0.447-25.49 11.224-5.322 2.326-14.758-2.37-23.925-8.72zM708.276 499.853c1.342 0.626 3.399 0.939 5.769 1.162v-311.743l-127.989-56.973c-14.713 7.558-23.969 30.723-31.081 36.044-0.358-0.224-0.85-0.491-1.208-0.715v99.412c0.447-0.045 0.939-0.089 1.386-0.045-0.491 0-0.939 0.045-1.386 0.089v2.415c2.772 0.984 6.619 1.655 12.298 1.699 9.123 0.089 18.603-15.115 18.558-15.428 9.302-3.399 18.023-7.647 26.206-12.612 2.639 2.772 5.366 5.59 8.094 8.363 7.468-0.447 14.982-0.984 22.494-1.788 3.443 11.761 7.781 23.209 12.969 34.479-16.949-1.208-56.168-14.802-73.475-6.708-16.279 7.692 1.879 26.341-7.155 37.431-4.829-2.459-12.343-3.801-19.99-4.249v216.982c0.447-0.089 0.804-0.179 1.297-0.269 2.101 4.74 3.22 29.604 28.218 17.62 2.817-1.386 7.334-8.452 10.912-8.809 24.417 51.92 116.853-1.61 114.081-36.357zM780.231 808.243l-24.462 10.866-24.462-10.866-219.307-97.713-243.769 108.581-24.462-10.866-243.769-108.67v-683.634l268.231 119.582 243.769-108.67 24.462 10.866 219.307 97.803 268.231-119.582v683.679l-243.769 108.625zM48.968 667.866l194.801 86.846v-576.62l-194.801-86.802v576.575zM487.538 91.291l-194.801 86.802v576.62l194.801-86.846v-576.575zM536.462 667.866l194.845 86.846v-576.62l-194.845-86.802v576.575zM975.032 91.291l-194.845 86.802v576.62l194.845-86.846v-576.575z" />
+<glyph unicode="&#xe61b;" glyph-name="draw" d="M855.916 574.88l-577.261-577.955-278.684-91.372 91.372 278.625 577.955 577.376 186.617-186.675zM686.648 622.185c8.907 8.847 8.907 18.506 0 28.684-4.337 4.452-9.369 6.65-15.036 6.65-5.552 0-10.005-2.197-13.532-6.65l-460.097-458.65c-4.51-4.51-6.65-9.369-6.65-14.979 0-5.552 2.197-10.582 6.65-14.979 3.527-3.643 8.442-5.262 14.689-5.262 5.32 0 9.947 1.562 13.994 5.262l459.982 459.922zM1000.608 831.471c15.672-15.557 23.364-34.293 23.364-56.327s-7.749-40.481-23.364-55.632l-79.285-79.285-186.675 186.617 79.401 79.458c15.557 15.499 34.178 23.189 55.864 23.189 21.802 0 40.538-7.749 56.095-23.189l38.053-36.78 36.548-38.053z" />
+<glyph unicode="&#xe61c;" glyph-name="circle" d="M764.865 751.356l68.599 68.599c-74.154 59.265-164.855 98.604-264.202 109.54v-97.001c72.837-9.963 139.603-38.651 195.603-81.139zM927.028 474.785h97.001c-10.995 99.347-50.275 190.050-109.597 264.202l-68.599-68.599c42.488-56.001 71.176-122.768 81.196-195.603zM454.739 832.552v96.944c-99.347-10.995-190.050-50.275-264.202-109.597l68.599-68.599c56.001 42.545 122.768 71.233 195.603 81.253zM927.028 360.263c-10.020-72.837-38.708-139.603-81.196-195.603l68.599-68.599c59.265 74.097 98.604 164.798 109.597 264.202h-97.001zM569.261 2.496v-97.001c99.347 10.995 190.050 50.275 264.202 109.597l-68.599 68.599c-56.001-42.488-122.768-71.176-195.603-81.196zM259.135 83.692l-68.599-68.599c74.097-59.265 164.798-98.604 264.202-109.597v97.001c-72.837 10.020-139.603 38.708-195.603 81.196zM96.972 360.263h-96.944c10.995-99.347 50.275-190.050 109.597-264.202l68.599 68.599c-42.545 56.001-71.233 122.768-81.253 195.603zM178.168 670.389l-68.599 68.599c-59.265-74.154-98.604-164.855-109.54-264.202h97.001c9.963 72.837 38.651 139.603 81.139 195.603zM741.044 474.785h-171.783v171.783h-114.523v-171.783h-171.783v-114.523h171.783v-171.783h114.523v171.783h171.783z" />
+<glyph unicode="&#xe61d;" glyph-name="cadastre" d="M1017.591 290.201c-8.466 21.606-33.959 32.756-55.751 24.336l-102.895-40.437-67.131 155.961 172.894 68.010c6.060 2.406 11.15 6.292 15.453 10.918 13.047 12.030 18.136 31.137 10.734 48.347l-47.607 110.667c-9.068 21.051-34.561 31.785-56.491 22.439-21.745-9.346-31.831-34.699-22.485-56.537l30.535-70.925-137.039-53.853-14.158 32.849c-9.114 21.236-35.208 31.831-56.537 22.485-21.745-9.346-31.831-34.653-22.485-56.491l13.094-30.35-17.674-6.94-33.543 77.958 36.411 14.342c10.688 4.21 19.108 12.306 23.688 22.809s4.812 22.208 0.602 32.941c-8.514 21.56-33.867 32.663-55.751 24.243l-38.955-15.314-26.834 62.366 129.405 50.893c22.069 8.698 32.941 33.727 24.243 55.797-8.466 21.514-33.681 32.756-55.797 24.197l-131.903-51.863-18.136 42.147c-9.16 21.143-35.208 31.692-56.537 22.439-21.745-9.392-31.831-34.699-22.485-56.445l17.072-39.649-102.016-40.065-34.699 80.594c-9.114 21.097-34.745 31.785-56.491 22.439-10.502-4.488-18.691-12.908-22.948-23.549s-4.072-22.346 0.462-32.895l33.589-78.096-99.61-39.187-65.235 66.993c-15.962 16.517-44.277 16.887-60.793 0.832-8.236-8.004-12.816-18.691-13-30.165-0.138-11.474 4.164-22.346 12.214-30.581l40.019-41.131-52.419-20.588c-21.976-8.744-32.803-33.727-24.151-55.843 8.56-21.606 34.745-32.432 55.751-24.197l85.916 33.773 51.309-52.743-166.556-65.42c-22.022-8.744-32.849-33.773-24.151-55.797 8.56-21.652 34.745-32.479 55.751-24.243l299.847 117.885 37.383-86.886 20.357-51.725-156.054-67.131-24.845 63.153c-8.514 21.514-33.45 32.756-55.797 24.197-16.517-6.616-27.204-22.3-27.204-39.973 0-5.228 0.972-10.548 3.008-15.73l25.77-65.697-39.649-17.072c-15.823-6.754-26.047-22.254-26.047-39.511 0-6.246 1.25-12.168 3.516-16.933 9.16-21.19 34.977-31.831 56.491-22.531l37.289 16.054 39.419-100.35c6.524-16.517 22.208-27.251 40.019-27.251 5.414 0 10.688 1.018 15.776 3.008 22.022 8.698 32.895 33.727 24.197 55.704l-40.483 102.895 156.054 67.131 67.964-172.802c8.466-21.652 34.191-32.756 55.704-24.336 22.069 8.698 32.987 33.681 24.336 55.751l-68.982 175.44 32.895 14.204c21.56 9.254 31.692 34.514 22.439 56.629-9.207 21.051-35.023 31.553-56.537 22.346l-30.304-13.047-12.63 32.109c-0.37 1.018-0.232 2.128-0.648 3.146l-6.708 15.499-1.666 4.302c-0.092 0.278-0.37 0.462-0.462 0.74l-34.561 80.224 102.016 40.113 48.117-111.824c2.314-5.32 5.69-9.994 9.762-13.834 11.844-15.314 33.82-22.208 49.735-15.546l57.693 22.624 67.178-155.961-63.153-24.845c-22.069-8.698-32.895-33.727-24.197-55.751 8.56-21.699 35.255-32.339 55.704-24.243l65.651 25.816 17.164-39.789c6.802-15.776 22.3-26.001 39.465-26.001 5.784 0 11.52 1.156 17.026 3.516 21.699 9.346 31.831 34.653 22.485 56.583l-16.008 37.197 100.258 39.465c10.688 4.164 19.154 12.306 23.734 22.809 4.58 10.41 4.812 22.115 0.602 32.756zM303.481 586.948l26.834-62.366-44.091-17.35-51.309 52.743 68.566 26.973zM410.4 556.089l-26.834 62.366 102.016 40.065 26.834-62.366-102.016-40.065z" />
+<glyph unicode="&#xe61f;" glyph-name="user" d="M576 222.912v52.78c70.498 39.728 128 138.772 128 237.832 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h896c0 128.968-166.898 235.64-384 253.388z" />
+<glyph unicode="&#xe620;" glyph-name="users" horiz-adv-x="1152" d="M768 158.912v52.78c70.498 39.728 128 138.772 128 237.832 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h896c0 128.968-166.898 235.64-384 253.388zM327.196 134.196c55.31 36.15 124.080 63.636 199.788 80.414-15.054 17.784-28.708 37.622-40.492 59.020-30.414 55.234-46.492 116.058-46.492 175.894 0 86.042 0 167.31 30.6 233.762 29.706 64.504 83.128 104.496 159.222 119.488-16.914 76.48-61.94 126.75-181.822 126.75-192 0-192-128.942-192-288 0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h279.006c14.518 12.91 30.596 25.172 48.19 36.672z" />
+<glyph unicode="&#xe621;" glyph-name="user-plus" d="M384 193.524c0 151.234 95.874 280.486 230.032 330.2 16.28 36.538 25.968 77.164 25.968 117.8 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h397.306c-8.664 30.53-13.306 62.732-13.306 96zM736 481.524c-159.058 0-288-128.942-288-288s128.942-288 288-288c159.056 0 288 128.942 288 288s-128.942 288-288 288zM896 161.524h-128v-128h-64v128h-128v64h128v128h64v-128h128v-64z" />
+<glyph unicode="&#xe622;" glyph-name="user-minus" d="M384 193.524c0 151.234 95.874 280.486 230.032 330.2 16.28 36.538 25.968 77.164 25.968 117.8 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h397.306c-8.664 30.53-13.306 62.732-13.306 96zM736 481.524c-159.058 0-288-128.942-288-288s128.942-288 288-288c159.056 0 288 128.942 288 288s-128.942 288-288 288zM896 161.524h-320v64h320v-64z" />
+<glyph unicode="&#xe623;" glyph-name="user-check" d="M960 321.524l-288-288-96 96-64-64 160-160 352 352zM448 161.524h320v115.128c-67.22 39.2-156.308 66.11-256 74.26v52.78c70.498 39.728 128 138.772 128 237.832 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h448v64z" />
+<glyph unicode="&#xe624;" glyph-name="user-tie" d="M320 737.524c0 106.039 85.961 192 192 192s192-85.961 192-192c0-106.039-85.961-192-192-192s-192 85.961-192 192zM768.078 481.524h-35.424l-199.104-404.244 74.45 372.244-96 96-96-96 74.45-372.244-199.102 404.244h-35.424c-127.924 0-127.924-85.986-127.924-192v-320h768v320c0 106.014 0 192-127.922 192z" />
+<glyph unicode="&#xe625;" glyph-name="key" d="M704 929.524c-176.73 0-320-143.268-320-320 0-20.026 1.858-39.616 5.376-58.624l-389.376-389.376v-192c0-35.346 28.654-64 64-64h64v64h128v128h128v128h128l83.042 83.042c34.010-12.316 70.696-19.042 108.958-19.042 176.73 0 320 143.268 320 320s-143.27 320-320 320zM799.874 609.398c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96z" />
+<glyph unicode="&#xe627;" glyph-name="lock" d="M592 481.524h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 673.524c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" />
+<glyph unicode="&#xe628;" glyph-name="unlocked" d="M768 865.524c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" />
+<glyph unicode="&#xe629;" glyph-name="magic-wand" d="M256 737.524l-128 128h-64v-64l128-128zM320 929.524h64v-128h-64zM576 609.524h128v-64h-128zM640 801.524v64h-64l-128-128 64-64zM0 609.524h128v-64h-128zM320 353.524h64v-128h-64zM64 353.524v-64h64l128 128-64 64zM1010 47.524l-636.118 636.118c-18.668 18.668-49.214 18.668-67.882 0l-60.118-60.118c-18.668-18.668-18.668-49.214 0-67.882l636.118-636.118c18.668-18.668 49.214-18.668 67.882 0l60.118 60.118c18.668 18.668 18.668 49.214 0 67.882zM480 385.524l-192 192 64 64 192-192-64-64z" />
+<glyph unicode="&#xe62a;" glyph-name="tree2" d="M976 161.524h-16v208c0 61.756-50.242 112-112 112h-272v128h16c26.4 0 48 21.6 48 48v160c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-160c0-26.4 21.6-48 48-48h16v-128h-272c-61.756 0-112-50.244-112-112v-208h-16c-26.4 0-48-21.6-48-48v-160c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v160c0 26.4-21.6 48-48 48h-16v192h256v-192h-16c-26.4 0-48-21.6-48-48v-160c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v160c0 26.4-21.6 48-48 48h-16v192h256v-192h-16c-26.4 0-48-21.6-48-48v-160c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v160c0 26.4-21.6 48-48 48zM192-30.476h-128v128h128v-128zM576-30.476h-128v128h128v-128zM448 673.524v128h128v-128h-128zM960-30.476h-128v128h128v-128z" />
+<glyph unicode="&#xe62b;" glyph-name="eye" d="M512 737.524c-223.318 0-416.882-130.042-512-320 95.118-189.958 288.682-320 512-320 223.312 0 416.876 130.042 512 320-95.116 189.958-288.688 320-512 320zM764.45 567.82c60.162-38.374 111.142-89.774 149.434-150.296-38.292-60.522-89.274-111.922-149.436-150.296-75.594-48.218-162.89-73.704-252.448-73.704-89.56 0-176.858 25.486-252.452 73.704-60.158 38.372-111.138 89.772-149.432 150.296 38.292 60.524 89.274 111.924 149.434 150.296 3.918 2.5 7.876 4.922 11.86 7.3-9.96-27.328-15.41-56.822-15.41-87.596 0-141.382 114.616-256 256-256 141.382 0 256 114.618 256 256 0 30.774-5.452 60.268-15.408 87.598 3.978-2.378 7.938-4.802 11.858-7.302v0zM512 513.524c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.982 96-96z" />
+<glyph unicode="&#xe62c;" glyph-name="eye-plus" d="M1024 801.524h-128v128h-128v-128h-128v-128h128v-128h128v128h128zM863.862 483.496c18.436-20.478 35.192-42.53 50.022-65.972-38.292-60.522-89.274-111.922-149.436-150.296-75.594-48.218-162.89-73.704-252.448-73.704-89.56 0-176.86 25.486-252.454 73.704-60.156 38.372-111.136 89.772-149.43 150.296 38.292 60.524 89.274 111.924 149.434 150.296 3.918 2.5 7.876 4.922 11.862 7.3-9.962-27.328-15.412-56.822-15.412-87.596 0-141.382 114.616-256 256-256 141.38 0 256 114.618 256 256 0 0.692-0.018 1.38-0.024 2.072-109.284 28.138-190.298 126.63-191.932 244.31-21.026 2.38-42.394 3.618-64.044 3.618-223.318 0-416.882-130.042-512-320 95.118-189.958 288.682-320 512-320 223.31 0 416.876 130.042 512 320-17.64 35.23-38.676 68.394-62.65 99.054-29.28-17.178-62.272-28.71-97.488-33.082zM416 609.524c53.020 0 96-42.982 96-96 0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96z" />
+<glyph unicode="&#xe62d;" glyph-name="eye-minus" d="M640 801.524h384v-128h-384v128zM870.32 609.524h-294.32v124.388c-21.014 2.376-42.364 3.612-64 3.612-223.318 0-416.882-130.042-512-320 95.118-189.958 288.682-320 512-320 223.31 0 416.876 130.042 512 320-37.396 74.686-90.020 140.1-153.68 192zM416 609.524c53.020 0 96-42.982 96-96 0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96zM764.448 267.228c-75.594-48.218-162.89-73.704-252.448-73.704-89.56 0-176.86 25.486-252.454 73.704-60.156 38.372-111.136 89.772-149.43 150.296 38.292 60.524 89.274 111.924 149.434 150.296 3.918 2.5 7.876 4.922 11.862 7.3-9.962-27.328-15.412-56.822-15.412-87.596 0-141.382 114.616-256 256-256 141.38 0 256 114.618 256 256 0 30.774-5.454 60.268-15.408 87.598 3.976-2.378 7.938-4.802 11.858-7.302 60.162-38.374 111.142-89.774 149.434-150.296-38.292-60.522-89.274-111.922-149.436-150.296z" />
+<glyph unicode="&#xe62e;" glyph-name="eye-blocked" d="M945.942 915.466c-18.746 18.744-49.136 18.744-67.882 0l-202.164-202.164c-51.938 15.754-106.948 24.222-163.896 24.222-223.318 0-416.882-130.042-512-320 41.122-82.124 100.648-153.040 173.022-207.096l-158.962-158.962c-18.746-18.746-18.746-49.136 0-67.882 9.372-9.374 21.656-14.060 33.94-14.060s24.568 4.686 33.942 14.058l864 864c18.744 18.746 18.744 49.138 0 67.884zM416 609.524c42.24 0 78.082-27.294 90.92-65.196l-121.724-121.724c-37.902 12.838-65.196 48.68-65.196 90.92 0 53.020 42.98 96 96 96zM110.116 417.524c38.292 60.524 89.274 111.924 149.434 150.296 3.918 2.5 7.876 4.922 11.862 7.3-9.962-27.328-15.412-56.822-15.412-87.596 0-54.89 17.286-105.738 46.7-147.418l-60.924-60.924c-52.446 36.842-97.202 83.882-131.66 138.342zM768 487.524c0 27.166-4.256 53.334-12.102 77.898l-321.808-321.808c24.568-7.842 50.742-12.090 77.91-12.090 141.382 0 256 114.618 256 256zM830.026 639.55l-69.362-69.362c1.264-0.786 2.53-1.568 3.786-2.368 60.162-38.374 111.142-89.774 149.434-150.296-38.292-60.522-89.274-111.922-149.436-150.296-75.594-48.218-162.89-73.704-252.448-73.704-38.664 0-76.902 4.76-113.962 14.040l-76.894-76.894c59.718-21.462 123.95-33.146 190.856-33.146 223.31 0 416.876 130.042 512 320-45.022 89.916-112.118 166.396-193.974 222.026z" />
+<glyph unicode="&#xe630;" glyph-name="pointer" d="M1024 594.713l-471.779-156.535v-513.087l-552.221 984.866 1024-315.244z" />
+<glyph unicode="&#xe631;" glyph-name="pushpin" d="M544 929.524l-96-96 96-96-224-256h-224l176-176-272-360.616v-39.384h39.384l360.616 272 176-176v224l256 224 96-96 96 96-480 480zM448 385.524l-64 64 224 224 64-64-224-224z" />
+<glyph unicode="&#xe632;" glyph-name="location" d="M512 929.524c-176.732 0-320-143.268-320-320 0-320 320-704 320-704s320 384 320 704c0 176.732-143.27 320-320 320zM512 417.524c-106.040 0-192 85.96-192 192s85.96 192 192 192 192-85.96 192-192-85.96-192-192-192z" />
+<glyph unicode="&#xe633;" glyph-name="map3" d="M0 737.524l320 128v-768l-320-128zM384 897.524l320-192v-736l-320 160zM768 705.524l256 192v-768l-256-192z" />
+<glyph unicode="&#xe634;" glyph-name="map2" d="M672 737.524l-320 128-352-128v-768l352 128 320-128 352 128v768l-352-128zM384 783.794l256-102.4v-630.138l-256 102.398v630.14zM64 692.696l256 93.090v-631.8l-256-93.088v631.798zM960 142.352l-256-93.092v631.8l256 93.090v-631.798z" />
+<glyph unicode="&#xe635;" glyph-name="binoculars" d="M64 929.524h384v-64h-384zM576 929.524h384v-64h-384zM952 609.524h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348-30.476h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 417.524h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924-30.476h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
+<glyph unicode="&#xe636;" glyph-name="search" d="M992.262 58.128l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 289.524c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256z" />
+<glyph unicode="&#xe637;" glyph-name="zoom-in" d="M992.262 58.128l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 289.524c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM448 737.524h-128v-128h-128v-128h128v-128h128v128h128v128h-128z" />
+<glyph unicode="&#xe638;" glyph-name="zoom-out" d="M992.262 58.128l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 289.524c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM192 609.524h384v-128h-384z" />
+<glyph unicode="&#xe639;" glyph-name="enlarge" d="M1024 929.524h-416l160-160-192-192 96-96 192 192 160-160zM1024-94.476v416l-160-160-192 192-96-96 192-192-160-160zM0-94.476h416l-160 160 192 192-96 96-192-192-160 160zM0 929.524v-416l160 160 192-192 96 96-192 192 160 160z" />
+<glyph unicode="&#xe63a;" glyph-name="shrink" d="M576 481.524h416l-160 160 192 192-96 96-192-192-160 160zM576 353.524v-416l160 160 192-192 96 96-192 192 160 160zM448 353.528h-416l160-160-192-192 96-96 192 192 160-160zM448 481.524v416l-160-160-192 192-96-96 192-192-160-160z" />
+<glyph unicode="&#xe63b;" glyph-name="enlarge2" d="M1024 929.524v-416l-160 160-192-192-96 96 192 192-160 160zM448 257.524l-192-192 160-160h-416v416l160-160 192 192z" />
+<glyph unicode="&#xe63c;" glyph-name="shrink2" d="M448 353.524v-416l-160 160-192-192-96 96 192 192-160 160zM1024 833.524l-192-192 160-160h-416v416l160-160 192 192z" />
+<glyph unicode="&#xe642;" glyph-name="cog" d="M933.79 319.274c-53.726 93.054-21.416 212.304 72.152 266.488l-100.626 174.292c-28.75-16.854-62.176-26.518-97.846-26.518-107.536 0-194.708 87.746-194.708 195.99h-201.258c0.266-33.41-8.074-67.282-25.958-98.252-53.724-93.056-173.156-124.702-266.862-70.758l-100.624-174.292c28.97-16.472 54.050-40.588 71.886-71.478 53.638-92.908 21.512-211.92-71.708-266.224l100.626-174.292c28.65 16.696 61.916 26.254 97.4 26.254 107.196 0 194.144-87.192 194.7-194.958h201.254c-0.086 33.074 8.272 66.57 25.966 97.218 53.636 92.906 172.776 124.594 266.414 71.012l100.626 174.29c-28.78 16.466-53.692 40.498-71.434 71.228zM512 210.192c-114.508 0-207.336 92.824-207.336 207.334 0 114.508 92.826 207.334 207.336 207.334 114.508 0 207.332-92.826 207.332-207.334-0.002-114.51-92.824-207.334-207.332-207.334z" />
+<glyph unicode="&#xe643;" glyph-name="stats-dots" d="M128 33.524h896v-128h-1024v1024h128zM288 97.524c-53.020 0-96 42.98-96 96s42.98 96 96 96c2.828 0 5.622-0.148 8.388-0.386l103.192 171.986c-9.84 15.070-15.58 33.062-15.58 52.402 0 53.020 42.98 96 96 96s96-42.98 96-96c0-19.342-5.74-37.332-15.58-52.402l103.192-171.986c2.766 0.238 5.56 0.386 8.388 0.386 2.136 0 4.248-0.094 6.35-0.23l170.356 298.122c-10.536 15.408-16.706 34.036-16.706 54.11 0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96-2.14 0-4.248 0.094-6.35 0.232l-170.356-298.124c10.536-15.406 16.706-34.036 16.706-54.11 0-53.020-42.98-96-96-96s-96 42.98-96 96c0 19.34 5.74 37.332 15.578 52.402l-103.19 171.984c-2.766-0.238-5.56-0.386-8.388-0.386s-5.622 0.146-8.388 0.386l-103.192-171.986c9.84-15.068 15.58-33.060 15.58-52.4 0-53.020-42.98-96-96-96z" />
+<glyph unicode="&#xe644;" glyph-name="stackoverflow" d="M1024 289.524v-384h-1024v384h128v-256h768v256zM192 225.524h640v-128h-640zM207.152 364.058l27.698 124.964 624.832-138.496-27.698-124.964zM279.658 620.966l54.092 116.006 580.032-270.464-54.092-116.006zM991.722 568.048l-77.922-101.55-507.746 389.608 56.336 73.418h58.244z" />
+<glyph unicode="&#xe900;" glyph-name="shopping_basket" d="M942.029 605.257h-256.358l-92.774-92.774c-23.194-23.194-54.067-35.942-86.835-35.942-32.87 0-63.693 12.8-86.938 35.994-23.142 23.142-35.942 53.965-35.994 86.784 0 1.997 0.512 3.942 0.563 5.939h-301.773c-16.998 0-30.72-13.722-30.72-30.72v-122.88h921.6v122.88c0 16.998-13.824 30.72-30.771 30.72zM551.322 554.108l258.816 258.816c12.032 11.981 12.134 31.386 0.102 43.469l-47.104 47.104c-11.981 11.981-31.437 11.93-43.52 0l-258.816-258.867c-24.986-24.986-24.986-65.536 0-90.522 24.986-24.934 65.485-24.986 90.522 0zM195.738 79.382c4.966-20.531 26.368-37.325 47.462-37.325h537.6c21.094 0 42.496 16.794 47.462 37.325l77.978 321.075h-788.48l77.978-321.075z" />
+<glyph unicode="&#xf010;" glyph-name="file-code" horiz-adv-x="768" d="M288 545.524l-160-160 160-160 64 64-96 96 96 96-64 64zM416 481.524l96-96-96-96 64-64 160 160-160 160-64-64zM576 865.524h-576v-896h768v704l-192 192zM704 33.524h-640v768h448l192-192v-576z" />
+<glyph unicode="&#xf011;" glyph-name="file-text" horiz-adv-x="768" d="M448 673.524h-320v-64h320v64zM576 865.524h-576v-896h768v704l-192 192zM704 33.524h-640v768h448l192-192v-576zM128 161.524h512v64h-512v-64zM128 289.524h512v64h-512v-64zM128 417.524h512v64h-512v-64z" />
+<glyph unicode="&#xf024;" glyph-name="mirror" d="M320 609.524l-192-192 192-192v128h384v-128l192 192-192 192v-128h-384v128zM512 929.524l-512-320v-704l512 256 512-256v704l-512 320zM960 33.524l-384 192v64h-128v-64l-384-192v512l384 256v-256h128v256l384-256v-512z" />
+<glyph unicode="&#xf035;" glyph-name="clippy" horiz-adv-x="896" d="M704 33.524h-640v576h640v-192h64v320c0 35-29 64-64 64h-192c0 71-57 128-128 128s-128-57-128-128h-192c-35 0-64-29-64-64v-704c0-35 29-64 64-64h640c35 0 64 29 64 64v128h-64v-128zM192 737.524c29 0 29 0 64 0s64 29 64 64 29 64 64 64 64-29 64-64 32-64 64-64 33 0 64 0 64-29 64-64h-512c0 39 28 64 64 64zM128 225.524h128v64h-128v-64zM576 353.524v128l-256-192 256-192v128h320v128h-320zM128 97.524h192v64h-192v-64zM448 545.524h-320v-64h320v64zM256 417.524h-128v-64h128v64z" />
+<glyph unicode="&#xf043;" glyph-name="graph" d="M704 673.524h-192v-640h192v640zM960 481.524h-192v-448h192v448zM64-30.476v128h64v64h-64v128h64v64h-64v128h64v64h-64v128h64v64h-64v128h64v64h-128v-1024h1024v64h-960zM448 353.524h-192v-320h192v320z" />
+<glyph unicode="&#xf064;" glyph-name="versions" horiz-adv-x="896" d="M0 225.524h128v64h-64v256h64v64h-128v-384zM384 737.524v-640h512v640h-512zM768 225.524h-256v384h256v-384zM192 161.524h128v64h-64v384h64v64h-128v-512z" />
+<glyph unicode="&#xf075;" glyph-name="milestone" horiz-adv-x="832" d="M704 737.524h-704v-256h704l128 128-128 128zM448 545.524h-128v128h128v-128zM448 929.524h-128v-128h128v128zM320-94.476h128v512h-128v-512z" />
+<glyph unicode="&#xf07f;" glyph-name="link-external" horiz-adv-x="768" d="M640 161.524h-512v510.094l128 1.906v128h-256v-768h768v320h-128v-192zM384 801.524l128-128-192-192 128-128 192 192 128-128v384h-384z" />
+<glyph unicode="&#xf094;" glyph-name="file-binary" horiz-adv-x="768" d="M0-30.476v896h576l192-192v-704h-768zM704 609.524l-192 192h-448v-768h640v576zM320 417.524h-192v256h192v-256zM256 609.524h-64v-128h64v128zM256 161.524h64v-64h-192v64h64v128h-64v64h128v-192zM512 481.524h64v-64h-192v64h64v128h-64v64h128v-192zM576 97.524h-192v256h192v-256zM512 289.524h-64v-128h64v128z" />
+<glyph unicode="&#xf0c0;" glyph-name="puzzle" d="M755.75 354.374c-13.95 9.96-28.52 16.59-43.47 19.92-8.84 1.69-18.060 2.33-27.57 1.81-8.99-0.5-17.56-1.68-25.69-3.52-6.1-1.69-12.22-3.89-18.35-6.59-18.18-8.020-33.89-18.12-46.79-30.33-12.22-12.9-22.32-28.62-30.34-46.79-2.7-6.12-4.9-12.24-6.59-18.34-1.84-8.14-3.030-16.7-3.52-25.69-0.52-9.51 0.12-18.73 1.81-27.57 3.33-14.95 9.96-29.52 19.92-43.47 3.89-5.44 8.080-10.4 12.56-14.88 20.060-20.030 45.83-30.7 75.42-34.11 8.92-1.020 18.12-1.68 26.53-4.48 5.12-1.7 9.16-4.080 12.080-7.020 6.65-6.6 7.63-16.1 2.5-27.24-3.15-6.84-7.7-13.45-12.96-18.84l-2.79-2.86c-3.93-3.92-6.41-6.4-7.050-7.040-3.13-3.16-6.1-6.15-9.060-9.15l-2.96-2.92c-10.52-10.58-21.090-21.12-31.66-31.65-22.76-22.82-45.57-45.58-68.38-68.36-7.5-7.5-15-15-22.5-22.49-3.46-3.45-7.070-6.38-10.78-8.79-1.8-1.22-3.49-2.24-5.18-3.16-19.6-9.89-41.43-5.92-59.24 11.88-5.4 5.4-10.62 10.62-15.85 15.84-30.25 30.25-60.48 60.52-90.77 90.73-8.59 8.57-17.13 17.080-25.68 25.59-6.12 6.090-12.67 11.85-19.56 17.060-5.72 4.33-11.59 7.56-17.46 9.73-21.16 7.32-41.41 2.010-54.67-13.26-3.81-4.8-7-10.47-9.39-16.94-3.43-9.26-4.6-19.47-5.9-29.36-4.9-37.53-25.8-68.43-55.98-82.65-7.48-3.65-15.49-6.29-23.9-7.78-7.95-1.41-15.95-1.71-23.85-1.040-26.61 1.35-49.48 13.090-68.51 32.57-1.68 1.67-2.1 2.090-2.51 2.51-19.48 19.020-31.22 41.9-32.57 68.5-0.68 7.9-0.37 15.9 1.040 23.85 1.49 8.41 4.13 16.43 7.78 23.9 14.22 30.18 45.13 51.070 82.65 55.97 9.89 1.29 20.1 2.47 29.36 5.9 6.94 2.56 12.96 6.050 17.97 10.23 14.54 13.15 19.59 32.63 12.84 52.34-2.78 7.35-6 13.22-10.33 18.94-5.21 6.88-10.97 13.43-17.060 19.55-8.51 8.55-17.030 17.090-25.55 25.63-26.92 26.98-53.84 53.88-80.75 80.78l-10.030 10.030c-5.22 5.22-10.45 10.45-15.26 15.27-18.39 18.4-22.35 40.22-12.46 59.82 0.92 1.69 1.94 3.37 3.080 5.050 2.49 3.84 5.42 7.45 8.87 10.91 7.49 7.5 14.99 15 22.49 22.5 22.77 22.81 45.54 45.62 68.36 68.38 10.53 10.57 21.060 21.14 31.65 31.66l2.92 2.96c2.99 2.97 5.99 5.93 8.98 8.9 0.8 0.81 3.28 3.29 7.2 7.22l2.86 2.79c5.39 5.26 12 9.8 18.84 12.96 11.14 5.13 20.63 4.15 27.24-2.5 2.94-2.92 5.32-6.96 7.020-12.080 2.79-8.41 3.45-17.61 4.48-26.53 3.41-29.59 14.080-55.35 34.11-75.41 4.49-4.48 9.44-8.67 14.88-12.56 13.95-9.96 28.52-16.59 43.47-19.92 8.84-1.69 18.060-2.33 27.57-1.81 8.99 0.5 17.56 1.68 25.69 3.52 6.1 1.69 12.22 3.89 18.35 6.59 18.18 8.020 33.89 18.12 46.79 30.33 12.22 12.9 22.32 28.62 30.34 46.79 2.7 6.12 4.9 12.24 6.59 18.34 1.84 8.14 3.030 16.7 3.52 25.69 0.52 9.51-0.12 18.73-1.81 27.57-3.33 14.95-9.96 29.52-19.92 43.47-3.89 5.44-8.080 10.4-12.56 14.88-20.060 20.030-45.83 30.7-75.42 34.11-8.92 1.020-18.12 1.68-26.53 4.48-5.12 1.7-9.16 4.080-12.080 7.020-6.65 6.6-7.63 16.1-2.5 27.24 3.15 6.84 7.7 13.45 12.96 18.84l2.79 2.86c3.93 3.92 6.41 6.4 7.050 7.040 3.13 3.16 6.1 6.15 9.060 9.15l2.96 2.92c10.52 10.58 21.090 21.12 31.66 31.65 22.76 22.82 45.57 45.58 68.38 68.35 7.5 7.5 15 15 22.5 22.49 3.46 3.45 7.070 6.38 10.78 8.79 1.8 1.22 3.49 2.24 5.18 3.16 19.6 9.89 41.43 5.92 59.24-11.88 5.4-5.4 10.62-10.62 15.85-15.84 30.25-30.25 60.48-60.52 90.77-90.73 8.59-8.57 17.13-17.080 25.68-25.59 6.12-6.090 12.67-11.85 19.56-17.060 5.72-4.33 11.59-7.56 17.46-9.73 21.16-7.32 41.41-2.010 54.67 13.26 3.81 4.8 7 10.47 9.39 16.94 3.43 9.26 4.6 19.47 5.9 29.36 4.9 37.53 25.8 68.43 55.98 82.65 7.48 3.65 15.49 6.28 23.9 7.78 7.95 1.41 15.95 1.71 23.85 1.040 26.61-1.35 49.48-13.090 68.51-32.57 1.68-1.67 2.1-2.090 2.51-2.51 19.48-19.020 31.22-41.9 32.57-68.5 0.68-7.9 0.37-15.9-1.040-23.85-1.49-8.41-4.13-16.43-7.78-23.9-14.22-30.18-45.13-51.070-82.65-55.97-9.89-1.29-20.1-2.47-29.36-5.9-6.94-2.56-12.96-6.050-17.97-10.23-14.54-13.15-19.59-32.63-12.84-52.34 2.78-7.35 6-13.22 10.33-18.94 5.21-6.88 10.97-13.43 17.060-19.55 8.51-8.55 17.030-17.090 25.55-25.63 30.26-30.33 60.54-60.56 90.78-90.81 5.22-5.22 10.45-10.45 15.26-15.27 18.39-18.4 22.35-40.22 12.46-59.82-0.92-1.69-1.94-3.37-3.080-5.050-2.49-3.84-5.42-7.45-8.87-10.91-7.49-7.5-14.99-15-22.49-22.5-22.77-22.81-45.54-45.62-68.36-68.38-10.53-10.57-21.060-21.14-31.65-31.66l-2.92-2.96c-2.99-2.97-5.99-5.93-8.98-8.9-0.8-0.81-3.28-3.29-7.2-7.22l-2.86-2.79c-5.39-5.26-12-9.8-18.84-12.96-11.14-5.13-20.63-4.15-27.24 2.5-2.94 2.92-5.32 6.96-7.020 12.080-2.79 8.41-3.45 17.61-4.48 26.53-3.41 29.59-14.080 55.35-34.11 75.41-4.48 4.49-9.44 8.69-14.88 12.57z" />
+<glyph unicode="&#xf0cc;" glyph-name="fold" horiz-adv-x="896" d="M896 673.524h-224l-64-64h192l-128-128h-448l-128 128h192l-64 64h-224v-63.999l160-160.001-160-160v-64h224l64 64h-192l128 128h448l128-128h-192l64-64h224v64l-160 160 160 160.001v63.999zM640 737.524h-128v192h-128v-192h-128l192-192 192 192zM256 161.524h128v-192h128v192h128l-192 192-192-192z" />
+<glyph unicode="&#xf0ce;" glyph-name="table" horiz-adv-x="951" d="M292.571 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM292.571 384v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM585.143 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM292.571 603.428v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM585.143 384v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM877.714 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM585.143 603.428v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM877.714 384v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM877.714 603.428v109.714q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h182.857q8 0 13.143 5.143t5.143 13.143zM950.857 786.286v-621.714q0-37.714-26.857-64.571t-64.571-26.857h-768q-37.714 0-64.571 26.857t-26.857 64.571v621.714q0 37.714 26.857 64.571t64.571 26.857h768q37.714 0 64.571-26.857t26.857-64.571z" />
+<glyph unicode="&#xf0e5;" glyph-name="comment" d="M512 731.428q-116.571 0-218-39.714t-161.143-107.143-59.714-145.714q0-64 40.857-122t115.143-100.286l49.714-28.571-15.429-54.857q-13.714-52-40-98.286 86.857 36 157.143 97.714l24.571 21.714 32.571-3.429q39.429-4.571 74.286-4.571 116.571 0 218 39.714t161.143 107.143 59.714 145.714-59.714 145.714-161.143 107.143-218 39.714zM1024 438.857q0-99.429-68.571-183.714t-186.286-133.143-257.143-48.857q-40 0-82.857 4.571-113.143-100-262.857-138.286-28-8-65.143-12.571h-2.857q-8.571 0-15.429 6t-9.143 15.714v0.571q-1.714 2.286-0.286 6.857t1.143 5.714 2.571 5.429l3.429 5.143t4 4.857 4.571 5.143q4 4.571 17.714 19.714t19.714 21.714 17.714 22.571 18.571 29.143 15.429 33.714 14.857 43.429q-89.714 50.857-141.429 125.714t-51.714 160.571q0 99.429 68.571 183.714t186.286 133.143 257.143 48.857 257.143-48.857 186.286-133.143 68.571-183.714z" />
+<glyph unicode="&#xf111;" glyph-name="point" horiz-adv-x="878" d="M658.286 438.857q0-59.716-29.428-110.144t-79.857-79.857-110.144-29.428-110.144 29.428-79.857 79.857-29.428 110.144 29.428 110.144 79.857 79.857 110.144 29.428 110.144-29.428 79.857-79.857 29.428-110.144z" />
+<glyph unicode="&#xf21d;" glyph-name="street-view" horiz-adv-x="805" d="M804.571 73.143q0-36-35.143-64.857t-93.714-46.286-128.571-26.286-144.857-8.857-144.857 8.857-128.571 26.286-93.714 46.286-35.143 64.857q0 28 18.857 50.571t52 38 67.429 25.429 74.857 16.857q14.857 2.857 27.429-6t14.857-23.714q2.857-14.857-6-27.429t-23.714-14.857q-33.143-5.714-60.571-13.429t-43.714-14.571-27.714-13.429-15.714-11.143-4.857-6.857q1.714-6.286 15.429-15.143t41.714-18.857 65.143-18.571 91.714-14.286 115.143-5.714 115.143 5.714 91.714 14.286 65.143 18.857 41.714 19.143 15.429 15.714q-0.571 2.286-4.857 6.286t-15.714 10.857-27.714 13.429-43.714 14.286-60.571 13.429q-14.857 2.286-23.714 14.857t-6 27.429q2.286 14.857 14.857 23.714t27.429 6q40.571-6.857 74.857-16.857t67.429-25.429 52-38 18.857-50.571zM585.143 585.143v-219.429q0-14.857-10.857-25.714t-25.714-10.857h-36.571v-219.429q0-14.857-10.857-25.714t-25.714-10.857h-146.286q-14.857 0-25.714 10.857t-10.857 25.714v219.429h-36.571q-14.857 0-25.714 10.857t-10.857 25.714v219.429q0 30.286 21.429 51.714t51.714 21.429h219.429q30.286 0 51.714-21.429t21.429-51.714zM530.286 804.571q0-53.143-37.429-90.571t-90.571-37.429-90.571 37.429-37.429 90.571 37.429 90.571 90.571 37.429 90.571-37.429 37.429-90.571z" />
+<glyph unicode="&#xf247;" glyph-name="object-group" horiz-adv-x="1170" d="M1170.286 710.095h-73.143v-585.143h73.143v-219.429h-219.429v73.143h-731.429v-73.143h-219.429v219.429h73.143v585.143h-73.143v219.429h219.429v-73.143h731.429v73.143h219.429v-219.429zM1024 856.381v-73.143h73.143v73.143h-73.143zM73.143 856.381v-73.143h73.143v73.143h-73.143zM146.286-21.333v73.143h-73.143v-73.143h73.143zM950.857 51.81v73.143h73.143v585.143h-73.143v73.143h-731.429v-73.143h-73.143v-585.143h73.143v-73.143h731.429zM1097.143-21.333v73.143h-73.143v-73.143h73.143zM731.429 563.81h219.429v-438.857h-512v146.286h-219.429v438.857h512v-146.286zM292.571 344.381h365.714v292.571h-365.714v-292.571zM877.714 198.095v292.571h-146.286v-219.429h-219.429v-73.143h365.714z" />
+<glyph unicode="&#xf248;" glyph-name="object-ungroup" horiz-adv-x="1317" d="M1316.571 490.667h-73.143v-365.714h73.143v-219.429h-219.429v73.143h-512v-73.143h-219.429v219.429h73.143v73.143h-219.429v-73.143h-219.429v219.429h73.143v365.714h-73.143v219.429h219.429v-73.143h512v73.143h219.429v-219.429h-73.143v-73.143h219.429v73.143h219.429v-219.429zM1170.286 636.953v-73.143h73.143v73.143h-73.143zM804.571 856.381v-73.143h73.143v73.143h-73.143zM73.143 856.381v-73.143h73.143v73.143h-73.143zM146.286 198.095v73.143h-73.143v-73.143h73.143zM877.714 271.238h-73.143v-73.143h73.143v73.143zM219.429 271.238h512v73.143h73.143v365.714h-73.143v73.143h-512v-73.143h-73.143v-365.714h73.143v-73.143zM512-21.333v73.143h-73.143v-73.143h73.143zM1243.429-21.333v73.143h-73.143v-73.143h73.143zM1170.286 124.953v365.714h-73.143v73.143h-219.429v-219.429h73.143v-219.429h-219.429v73.143h-219.429v-73.143h73.143v-73.143h512v73.143h73.143z" />
+<glyph unicode="&#xf277;" glyph-name="map-signs" d="M997.143 759.81q5.714-5.714 5.714-13.143t-5.714-13.143l-80.571-80.571q-16-16-38.857-16h-768q-14.857 0-25.714 10.857t-10.857 25.714v146.286q0 14.857 10.857 25.714t25.714 10.857h329.143v36.571q0 14.857 10.857 25.714t25.714 10.857h73.143q14.857 0 25.714-10.857t10.857-25.714v-36.571h292.571q22.857 0 38.857-16zM438.857 234.667h146.286v-292.571q0-14.857-10.857-25.714t-25.714-10.857h-73.143q-14.857 0-25.714 10.857t-10.857 25.714v292.571zM914.286 490.667q14.857 0 25.714-10.857t10.857-25.714v-146.286q0-14.857-10.857-25.714t-25.714-10.857h-768q-22.857 0-38.857 16l-80.571 80.571q-5.714 5.714-5.714 13.143t5.714 13.143l80.571 80.571q16 16 38.857 16h292.571v109.714h146.286v-109.714h329.143z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/module/css/fonts/icomoon.ttf b/module/css/fonts/icomoon.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..a9075b0f6b57ae4330241861dadb0607b3c83475
Binary files /dev/null and b/module/css/fonts/icomoon.ttf differ
diff --git a/module/css/fonts/icomoon.woff b/module/css/fonts/icomoon.woff
new file mode 100755
index 0000000000000000000000000000000000000000..f40bf2e3ea4d7d12381aaf025d8bca36950f1e09
Binary files /dev/null and b/module/css/fonts/icomoon.woff differ
diff --git a/module/css/lib/bootstrap-checkbox/build.css b/module/css/lib/bootstrap-checkbox/build.css
new file mode 100755
index 0000000000000000000000000000000000000000..fb3761a692c6e30c149ede0caa15b585bf78cad0
--- /dev/null
+++ b/module/css/lib/bootstrap-checkbox/build.css
@@ -0,0 +1,236 @@
+.checkbox {
+  padding-left: 20px;
+}
+.checkbox label {
+  display: inline-block;
+  vertical-align: middle;
+  position: relative;
+  padding-left: 5px;
+}
+.checkbox label::before {
+  content: "";
+  display: inline-block;
+  position: absolute;
+  width: 15px;
+  height: 15px;
+  left: 0;
+  margin-left: -20px;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  background-color: #fff;
+  -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+  -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+  transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+}
+.checkbox label::after {
+  display: inline-block;
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  left: 0px;
+  top: -1px;
+  margin-left: -20px;
+  padding-left: 3px;
+  padding-top: 1px;
+  font-size: 10px;
+  color: #555555;
+}
+.checkbox input[type="checkbox"] {
+  opacity: 0;
+  z-index: 1;
+}
+.checkbox input[type="checkbox"]:focus + label::before {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.checkbox input[type="checkbox"]:checked + label::after {
+  font-family: 'FontAwesome';
+  content: "\f00c";
+}
+.checkbox input[type="checkbox"]:disabled + label {
+  opacity: 0.65;
+}
+.checkbox input[type="checkbox"]:disabled + label::before {
+  background-color: #eeeeee;
+  cursor: not-allowed;
+}
+.checkbox.checkbox-circle label::before {
+  border-radius: 50%;
+}
+.checkbox.checkbox-inline {
+  margin-top: 0;
+}
+.checkbox-primary input[type="checkbox"] + label::before{
+  border: 2px solid #337ab7;
+}
+.checkbox-primary input[type="checkbox"]:checked + label::before {
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.checkbox-primary input[type="checkbox"]:checked + label::after {
+  color: #fff;
+}
+.checkbox-danger input[type="checkbox"] + label::before{
+  border: 2px solid #d9534f;
+}
+.checkbox-danger input[type="checkbox"]:checked + label::before {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.checkbox-danger input[type="checkbox"]:checked + label::after {
+  color: #fff;
+}
+.checkbox-info input[type="checkbox"] + label::before{
+  border: 2px solid #5bc0de;
+}
+.checkbox-info input[type="checkbox"]:checked + label::before {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.checkbox-info input[type="checkbox"]:checked + label::after {
+  color: #fff;
+}
+.checkbox-warning input[type="checkbox"] + label::before{
+  border: 2px solid #f0ad4e;
+}
+.checkbox-warning input[type="checkbox"]:checked + label::before {
+  background-color: #f0ad4e;
+  border-color: #f0ad4e;
+}
+.checkbox-warning input[type="checkbox"]:checked + label::after {
+  color: #fff;
+}
+.checkbox-success input[type="checkbox"] + label::before{
+  border: 2px solid #5cb85c;
+}
+.checkbox-success input[type="checkbox"]:checked + label::before {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.checkbox-success input[type="checkbox"]:checked + label::after {
+  color: #fff;
+}
+.radio {
+  padding-left: 20px;
+}
+.radio label {
+  display: inline-block;
+  vertical-align: middle;
+  position: relative;
+  padding-left: 5px;
+}
+.radio label::before {
+  content: "";
+  display: inline-block;
+  position: absolute;
+  width: 17px;
+  height: 17px;
+  left: 0;
+  margin-left: -20px;
+  border: 1px solid #cccccc;
+  border-radius: 50%;
+  background-color: #fff;
+  -webkit-transition: border 0.15s ease-in-out;
+  -o-transition: border 0.15s ease-in-out;
+  transition: border 0.15s ease-in-out;
+}
+.radio label::after {
+  display: inline-block;
+  position: absolute;
+  content: " ";
+  width: 11px;
+  height: 11px;
+  left: 3px;
+  top: 3px;
+  margin-left: -20px;
+  border-radius: 50%;
+  background-color: #555555;
+  -webkit-transform: scale(0, 0);
+  -ms-transform: scale(0, 0);
+  -o-transform: scale(0, 0);
+  transform: scale(0, 0);
+  -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+}
+.radio input[type="radio"] {
+  opacity: 0;
+  z-index: 1;
+}
+.radio input[type="radio"]:focus + label::before {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.radio input[type="radio"]:checked + label::after {
+  -webkit-transform: scale(1, 1);
+  -ms-transform: scale(1, 1);
+  -o-transform: scale(1, 1);
+  transform: scale(1, 1);
+}
+.radio input[type="radio"]:disabled + label {
+  opacity: 0.65;
+}
+.radio input[type="radio"]:disabled + label::before {
+  cursor: not-allowed;
+}
+.radio.radio-inline {
+  margin-top: 0;
+}
+.radio-primary input[type="radio"] + label::after {
+  background-color: #337ab7;
+}
+.radio-primary input[type="radio"]:checked + label::before {
+  border-color: #337ab7;
+}
+.radio-primary input[type="radio"]:checked + label::after {
+  background-color: #337ab7;
+}
+.radio-danger input[type="radio"] + label::after {
+  background-color: #d9534f;
+}
+.radio-danger input[type="radio"]:checked + label::before {
+  border-color: #d9534f;
+}
+.radio-danger input[type="radio"]:checked + label::after {
+  background-color: #d9534f;
+}
+.radio-info input[type="radio"] + label::after {
+  background-color: #5bc0de;
+}
+.radio-info input[type="radio"]:checked + label::before {
+  border-color: #5bc0de;
+}
+.radio-info input[type="radio"]:checked + label::after {
+  background-color: #5bc0de;
+}
+.radio-warning input[type="radio"] + label::after {
+  background-color: #f0ad4e;
+}
+.radio-warning input[type="radio"]:checked + label::before {
+  border-color: #f0ad4e;
+}
+.radio-warning input[type="radio"]:checked + label::after {
+  background-color: #f0ad4e;
+}
+.radio-success input[type="radio"] + label::after {
+  background-color: #5cb85c;
+}
+.radio-success input[type="radio"]:checked + label::before {
+  border-color: #5cb85c;
+}
+.radio-success input[type="radio"]:checked + label::after {
+  background-color: #5cb85c;
+}
+input[type="checkbox"].styled:checked + label:after {
+  font-family: 'FontAwesome';
+  content: "\f00c";
+}
+input[type="checkbox"] .styled:checked + label::before {
+  color: #fff;
+}
+input[type="checkbox"] .styled:checked + label::after {
+  color: #fff;
+}
diff --git a/module/css/lib/bootstrap-checkbox/font-awesome.css b/module/css/lib/bootstrap-checkbox/font-awesome.css
new file mode 100755
index 0000000000000000000000000000000000000000..2dcdc220722c85a5db777797657b94c50d98aff7
--- /dev/null
+++ b/module/css/lib/bootstrap-checkbox/font-awesome.css
@@ -0,0 +1,1801 @@
+/*!
+ *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');
+  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  transform: translate(0, 0);
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  line-height: 0.75em;
+  vertical-align: -15%;
+}
+.fa-2x {
+  font-size: 2em;
+}
+.fa-3x {
+  font-size: 3em;
+}
+.fa-4x {
+  font-size: 4em;
+}
+.fa-5x {
+  font-size: 5em;
+}
+.fa-fw {
+  width: 1.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.fa-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  text-align: center;
+}
+.fa-stack-1x {
+  line-height: inherit;
+}
+.fa-stack-2x {
+  font-size: 2em;
+}
+.fa-inverse {
+  color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-search:before {
+  content: "\f002";
+}
+.fa-envelope-o:before {
+  content: "\f003";
+}
+.fa-heart:before {
+  content: "\f004";
+}
+.fa-star:before {
+  content: "\f005";
+}
+.fa-star-o:before {
+  content: "\f006";
+}
+.fa-user:before {
+  content: "\f007";
+}
+.fa-film:before {
+  content: "\f008";
+}
+.fa-th-large:before {
+  content: "\f009";
+}
+.fa-th:before {
+  content: "\f00a";
+}
+.fa-th-list:before {
+  content: "\f00b";
+}
+.fa-check:before {
+  content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+  content: "\f00d";
+}
+.fa-search-plus:before {
+  content: "\f00e";
+}
+.fa-search-minus:before {
+  content: "\f010";
+}
+.fa-power-off:before {
+  content: "\f011";
+}
+.fa-signal:before {
+  content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+  content: "\f013";
+}
+.fa-trash-o:before {
+  content: "\f014";
+}
+.fa-home:before {
+  content: "\f015";
+}
+.fa-file-o:before {
+  content: "\f016";
+}
+.fa-clock-o:before {
+  content: "\f017";
+}
+.fa-road:before {
+  content: "\f018";
+}
+.fa-download:before {
+  content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+  content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+  content: "\f01b";
+}
+.fa-inbox:before {
+  content: "\f01c";
+}
+.fa-play-circle-o:before {
+  content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+  content: "\f01e";
+}
+.fa-refresh:before {
+  content: "\f021";
+}
+.fa-list-alt:before {
+  content: "\f022";
+}
+.fa-lock:before {
+  content: "\f023";
+}
+.fa-flag:before {
+  content: "\f024";
+}
+.fa-headphones:before {
+  content: "\f025";
+}
+.fa-volume-off:before {
+  content: "\f026";
+}
+.fa-volume-down:before {
+  content: "\f027";
+}
+.fa-volume-up:before {
+  content: "\f028";
+}
+.fa-qrcode:before {
+  content: "\f029";
+}
+.fa-barcode:before {
+  content: "\f02a";
+}
+.fa-tag:before {
+  content: "\f02b";
+}
+.fa-tags:before {
+  content: "\f02c";
+}
+.fa-book:before {
+  content: "\f02d";
+}
+.fa-bookmark:before {
+  content: "\f02e";
+}
+.fa-print:before {
+  content: "\f02f";
+}
+.fa-camera:before {
+  content: "\f030";
+}
+.fa-font:before {
+  content: "\f031";
+}
+.fa-bold:before {
+  content: "\f032";
+}
+.fa-italic:before {
+  content: "\f033";
+}
+.fa-text-height:before {
+  content: "\f034";
+}
+.fa-text-width:before {
+  content: "\f035";
+}
+.fa-align-left:before {
+  content: "\f036";
+}
+.fa-align-center:before {
+  content: "\f037";
+}
+.fa-align-right:before {
+  content: "\f038";
+}
+.fa-align-justify:before {
+  content: "\f039";
+}
+.fa-list:before {
+  content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+  content: "\f03b";
+}
+.fa-indent:before {
+  content: "\f03c";
+}
+.fa-video-camera:before {
+  content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+  content: "\f03e";
+}
+.fa-pencil:before {
+  content: "\f040";
+}
+.fa-map-marker:before {
+  content: "\f041";
+}
+.fa-adjust:before {
+  content: "\f042";
+}
+.fa-tint:before {
+  content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+  content: "\f044";
+}
+.fa-share-square-o:before {
+  content: "\f045";
+}
+.fa-check-square-o:before {
+  content: "\f046";
+}
+.fa-arrows:before {
+  content: "\f047";
+}
+.fa-step-backward:before {
+  content: "\f048";
+}
+.fa-fast-backward:before {
+  content: "\f049";
+}
+.fa-backward:before {
+  content: "\f04a";
+}
+.fa-play:before {
+  content: "\f04b";
+}
+.fa-pause:before {
+  content: "\f04c";
+}
+.fa-stop:before {
+  content: "\f04d";
+}
+.fa-forward:before {
+  content: "\f04e";
+}
+.fa-fast-forward:before {
+  content: "\f050";
+}
+.fa-step-forward:before {
+  content: "\f051";
+}
+.fa-eject:before {
+  content: "\f052";
+}
+.fa-chevron-left:before {
+  content: "\f053";
+}
+.fa-chevron-right:before {
+  content: "\f054";
+}
+.fa-plus-circle:before {
+  content: "\f055";
+}
+.fa-minus-circle:before {
+  content: "\f056";
+}
+.fa-times-circle:before {
+  content: "\f057";
+}
+.fa-check-circle:before {
+  content: "\f058";
+}
+.fa-question-circle:before {
+  content: "\f059";
+}
+.fa-info-circle:before {
+  content: "\f05a";
+}
+.fa-crosshairs:before {
+  content: "\f05b";
+}
+.fa-times-circle-o:before {
+  content: "\f05c";
+}
+.fa-check-circle-o:before {
+  content: "\f05d";
+}
+.fa-ban:before {
+  content: "\f05e";
+}
+.fa-arrow-left:before {
+  content: "\f060";
+}
+.fa-arrow-right:before {
+  content: "\f061";
+}
+.fa-arrow-up:before {
+  content: "\f062";
+}
+.fa-arrow-down:before {
+  content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+  content: "\f064";
+}
+.fa-expand:before {
+  content: "\f065";
+}
+.fa-compress:before {
+  content: "\f066";
+}
+.fa-plus:before {
+  content: "\f067";
+}
+.fa-minus:before {
+  content: "\f068";
+}
+.fa-asterisk:before {
+  content: "\f069";
+}
+.fa-exclamation-circle:before {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-fire:before {
+  content: "\f06d";
+}
+.fa-eye:before {
+  content: "\f06e";
+}
+.fa-eye-slash:before {
+  content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+  content: "\f071";
+}
+.fa-plane:before {
+  content: "\f072";
+}
+.fa-calendar:before {
+  content: "\f073";
+}
+.fa-random:before {
+  content: "\f074";
+}
+.fa-comment:before {
+  content: "\f075";
+}
+.fa-magnet:before {
+  content: "\f076";
+}
+.fa-chevron-up:before {
+  content: "\f077";
+}
+.fa-chevron-down:before {
+  content: "\f078";
+}
+.fa-retweet:before {
+  content: "\f079";
+}
+.fa-shopping-cart:before {
+  content: "\f07a";
+}
+.fa-folder:before {
+  content: "\f07b";
+}
+.fa-folder-open:before {
+  content: "\f07c";
+}
+.fa-arrows-v:before {
+  content: "\f07d";
+}
+.fa-arrows-h:before {
+  content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+  content: "\f080";
+}
+.fa-twitter-square:before {
+  content: "\f081";
+}
+.fa-facebook-square:before {
+  content: "\f082";
+}
+.fa-camera-retro:before {
+  content: "\f083";
+}
+.fa-key:before {
+  content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+  content: "\f085";
+}
+.fa-comments:before {
+  content: "\f086";
+}
+.fa-thumbs-o-up:before {
+  content: "\f087";
+}
+.fa-thumbs-o-down:before {
+  content: "\f088";
+}
+.fa-star-half:before {
+  content: "\f089";
+}
+.fa-heart-o:before {
+  content: "\f08a";
+}
+.fa-sign-out:before {
+  content: "\f08b";
+}
+.fa-linkedin-square:before {
+  content: "\f08c";
+}
+.fa-thumb-tack:before {
+  content: "\f08d";
+}
+.fa-external-link:before {
+  content: "\f08e";
+}
+.fa-sign-in:before {
+  content: "\f090";
+}
+.fa-trophy:before {
+  content: "\f091";
+}
+.fa-github-square:before {
+  content: "\f092";
+}
+.fa-upload:before {
+  content: "\f093";
+}
+.fa-lemon-o:before {
+  content: "\f094";
+}
+.fa-phone:before {
+  content: "\f095";
+}
+.fa-square-o:before {
+  content: "\f096";
+}
+.fa-bookmark-o:before {
+  content: "\f097";
+}
+.fa-phone-square:before {
+  content: "\f098";
+}
+.fa-twitter:before {
+  content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-rss:before {
+  content: "\f09e";
+}
+.fa-hdd-o:before {
+  content: "\f0a0";
+}
+.fa-bullhorn:before {
+  content: "\f0a1";
+}
+.fa-bell:before {
+  content: "\f0f3";
+}
+.fa-certificate:before {
+  content: "\f0a3";
+}
+.fa-hand-o-right:before {
+  content: "\f0a4";
+}
+.fa-hand-o-left:before {
+  content: "\f0a5";
+}
+.fa-hand-o-up:before {
+  content: "\f0a6";
+}
+.fa-hand-o-down:before {
+  content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+  content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+  content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+  content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+  content: "\f0ab";
+}
+.fa-globe:before {
+  content: "\f0ac";
+}
+.fa-wrench:before {
+  content: "\f0ad";
+}
+.fa-tasks:before {
+  content: "\f0ae";
+}
+.fa-filter:before {
+  content: "\f0b0";
+}
+.fa-briefcase:before {
+  content: "\f0b1";
+}
+.fa-arrows-alt:before {
+  content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+  content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+  content: "\f0c1";
+}
+.fa-cloud:before {
+  content: "\f0c2";
+}
+.fa-flask:before {
+  content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+  content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+  content: "\f0c5";
+}
+.fa-paperclip:before {
+  content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+  content: "\f0c7";
+}
+.fa-square:before {
+  content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+  content: "\f0c9";
+}
+.fa-list-ul:before {
+  content: "\f0ca";
+}
+.fa-list-ol:before {
+  content: "\f0cb";
+}
+.fa-strikethrough:before {
+  content: "\f0cc";
+}
+.fa-underline:before {
+  content: "\f0cd";
+}
+.fa-table:before {
+  content: "\f0ce";
+}
+.fa-magic:before {
+  content: "\f0d0";
+}
+.fa-truck:before {
+  content: "\f0d1";
+}
+.fa-pinterest:before {
+  content: "\f0d2";
+}
+.fa-pinterest-square:before {
+  content: "\f0d3";
+}
+.fa-google-plus-square:before {
+  content: "\f0d4";
+}
+.fa-google-plus:before {
+  content: "\f0d5";
+}
+.fa-money:before {
+  content: "\f0d6";
+}
+.fa-caret-down:before {
+  content: "\f0d7";
+}
+.fa-caret-up:before {
+  content: "\f0d8";
+}
+.fa-caret-left:before {
+  content: "\f0d9";
+}
+.fa-caret-right:before {
+  content: "\f0da";
+}
+.fa-columns:before {
+  content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+  content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+  content: "\f0de";
+}
+.fa-envelope:before {
+  content: "\f0e0";
+}
+.fa-linkedin:before {
+  content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+  content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+  content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+  content: "\f0e4";
+}
+.fa-comment-o:before {
+  content: "\f0e5";
+}
+.fa-comments-o:before {
+  content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+  content: "\f0e7";
+}
+.fa-sitemap:before {
+  content: "\f0e8";
+}
+.fa-umbrella:before {
+  content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+  content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+  content: "\f0eb";
+}
+.fa-exchange:before {
+  content: "\f0ec";
+}
+.fa-cloud-download:before {
+  content: "\f0ed";
+}
+.fa-cloud-upload:before {
+  content: "\f0ee";
+}
+.fa-user-md:before {
+  content: "\f0f0";
+}
+.fa-stethoscope:before {
+  content: "\f0f1";
+}
+.fa-suitcase:before {
+  content: "\f0f2";
+}
+.fa-bell-o:before {
+  content: "\f0a2";
+}
+.fa-coffee:before {
+  content: "\f0f4";
+}
+.fa-cutlery:before {
+  content: "\f0f5";
+}
+.fa-file-text-o:before {
+  content: "\f0f6";
+}
+.fa-building-o:before {
+  content: "\f0f7";
+}
+.fa-hospital-o:before {
+  content: "\f0f8";
+}
+.fa-ambulance:before {
+  content: "\f0f9";
+}
+.fa-medkit:before {
+  content: "\f0fa";
+}
+.fa-fighter-jet:before {
+  content: "\f0fb";
+}
+.fa-beer:before {
+  content: "\f0fc";
+}
+.fa-h-square:before {
+  content: "\f0fd";
+}
+.fa-plus-square:before {
+  content: "\f0fe";
+}
+.fa-angle-double-left:before {
+  content: "\f100";
+}
+.fa-angle-double-right:before {
+  content: "\f101";
+}
+.fa-angle-double-up:before {
+  content: "\f102";
+}
+.fa-angle-double-down:before {
+  content: "\f103";
+}
+.fa-angle-left:before {
+  content: "\f104";
+}
+.fa-angle-right:before {
+  content: "\f105";
+}
+.fa-angle-up:before {
+  content: "\f106";
+}
+.fa-angle-down:before {
+  content: "\f107";
+}
+.fa-desktop:before {
+  content: "\f108";
+}
+.fa-laptop:before {
+  content: "\f109";
+}
+.fa-tablet:before {
+  content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+  content: "\f10b";
+}
+.fa-circle-o:before {
+  content: "\f10c";
+}
+.fa-quote-left:before {
+  content: "\f10d";
+}
+.fa-quote-right:before {
+  content: "\f10e";
+}
+.fa-spinner:before {
+  content: "\f110";
+}
+.fa-circle:before {
+  content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+  content: "\f112";
+}
+.fa-github-alt:before {
+  content: "\f113";
+}
+.fa-folder-o:before {
+  content: "\f114";
+}
+.fa-folder-open-o:before {
+  content: "\f115";
+}
+.fa-smile-o:before {
+  content: "\f118";
+}
+.fa-frown-o:before {
+  content: "\f119";
+}
+.fa-meh-o:before {
+  content: "\f11a";
+}
+.fa-gamepad:before {
+  content: "\f11b";
+}
+.fa-keyboard-o:before {
+  content: "\f11c";
+}
+.fa-flag-o:before {
+  content: "\f11d";
+}
+.fa-flag-checkered:before {
+  content: "\f11e";
+}
+.fa-terminal:before {
+  content: "\f120";
+}
+.fa-code:before {
+  content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+  content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+  content: "\f123";
+}
+.fa-location-arrow:before {
+  content: "\f124";
+}
+.fa-crop:before {
+  content: "\f125";
+}
+.fa-code-fork:before {
+  content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+  content: "\f127";
+}
+.fa-question:before {
+  content: "\f128";
+}
+.fa-info:before {
+  content: "\f129";
+}
+.fa-exclamation:before {
+  content: "\f12a";
+}
+.fa-superscript:before {
+  content: "\f12b";
+}
+.fa-subscript:before {
+  content: "\f12c";
+}
+.fa-eraser:before {
+  content: "\f12d";
+}
+.fa-puzzle-piece:before {
+  content: "\f12e";
+}
+.fa-microphone:before {
+  content: "\f130";
+}
+.fa-microphone-slash:before {
+  content: "\f131";
+}
+.fa-shield:before {
+  content: "\f132";
+}
+.fa-calendar-o:before {
+  content: "\f133";
+}
+.fa-fire-extinguisher:before {
+  content: "\f134";
+}
+.fa-rocket:before {
+  content: "\f135";
+}
+.fa-maxcdn:before {
+  content: "\f136";
+}
+.fa-chevron-circle-left:before {
+  content: "\f137";
+}
+.fa-chevron-circle-right:before {
+  content: "\f138";
+}
+.fa-chevron-circle-up:before {
+  content: "\f139";
+}
+.fa-chevron-circle-down:before {
+  content: "\f13a";
+}
+.fa-html5:before {
+  content: "\f13b";
+}
+.fa-css3:before {
+  content: "\f13c";
+}
+.fa-anchor:before {
+  content: "\f13d";
+}
+.fa-unlock-alt:before {
+  content: "\f13e";
+}
+.fa-bullseye:before {
+  content: "\f140";
+}
+.fa-ellipsis-h:before {
+  content: "\f141";
+}
+.fa-ellipsis-v:before {
+  content: "\f142";
+}
+.fa-rss-square:before {
+  content: "\f143";
+}
+.fa-play-circle:before {
+  content: "\f144";
+}
+.fa-ticket:before {
+  content: "\f145";
+}
+.fa-minus-square:before {
+  content: "\f146";
+}
+.fa-minus-square-o:before {
+  content: "\f147";
+}
+.fa-level-up:before {
+  content: "\f148";
+}
+.fa-level-down:before {
+  content: "\f149";
+}
+.fa-check-square:before {
+  content: "\f14a";
+}
+.fa-pencil-square:before {
+  content: "\f14b";
+}
+.fa-external-link-square:before {
+  content: "\f14c";
+}
+.fa-share-square:before {
+  content: "\f14d";
+}
+.fa-compass:before {
+  content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+  content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+  content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+  content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+  content: "\f153";
+}
+.fa-gbp:before {
+  content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+  content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+  content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+  content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+  content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+  content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+  content: "\f15a";
+}
+.fa-file:before {
+  content: "\f15b";
+}
+.fa-file-text:before {
+  content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+  content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+  content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+  content: "\f160";
+}
+.fa-sort-amount-desc:before {
+  content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+  content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+  content: "\f163";
+}
+.fa-thumbs-up:before {
+  content: "\f164";
+}
+.fa-thumbs-down:before {
+  content: "\f165";
+}
+.fa-youtube-square:before {
+  content: "\f166";
+}
+.fa-youtube:before {
+  content: "\f167";
+}
+.fa-xing:before {
+  content: "\f168";
+}
+.fa-xing-square:before {
+  content: "\f169";
+}
+.fa-youtube-play:before {
+  content: "\f16a";
+}
+.fa-dropbox:before {
+  content: "\f16b";
+}
+.fa-stack-overflow:before {
+  content: "\f16c";
+}
+.fa-instagram:before {
+  content: "\f16d";
+}
+.fa-flickr:before {
+  content: "\f16e";
+}
+.fa-adn:before {
+  content: "\f170";
+}
+.fa-bitbucket:before {
+  content: "\f171";
+}
+.fa-bitbucket-square:before {
+  content: "\f172";
+}
+.fa-tumblr:before {
+  content: "\f173";
+}
+.fa-tumblr-square:before {
+  content: "\f174";
+}
+.fa-long-arrow-down:before {
+  content: "\f175";
+}
+.fa-long-arrow-up:before {
+  content: "\f176";
+}
+.fa-long-arrow-left:before {
+  content: "\f177";
+}
+.fa-long-arrow-right:before {
+  content: "\f178";
+}
+.fa-apple:before {
+  content: "\f179";
+}
+.fa-windows:before {
+  content: "\f17a";
+}
+.fa-android:before {
+  content: "\f17b";
+}
+.fa-linux:before {
+  content: "\f17c";
+}
+.fa-dribbble:before {
+  content: "\f17d";
+}
+.fa-skype:before {
+  content: "\f17e";
+}
+.fa-foursquare:before {
+  content: "\f180";
+}
+.fa-trello:before {
+  content: "\f181";
+}
+.fa-female:before {
+  content: "\f182";
+}
+.fa-male:before {
+  content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+  content: "\f184";
+}
+.fa-sun-o:before {
+  content: "\f185";
+}
+.fa-moon-o:before {
+  content: "\f186";
+}
+.fa-archive:before {
+  content: "\f187";
+}
+.fa-bug:before {
+  content: "\f188";
+}
+.fa-vk:before {
+  content: "\f189";
+}
+.fa-weibo:before {
+  content: "\f18a";
+}
+.fa-renren:before {
+  content: "\f18b";
+}
+.fa-pagelines:before {
+  content: "\f18c";
+}
+.fa-stack-exchange:before {
+  content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+  content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+  content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+  content: "\f191";
+}
+.fa-dot-circle-o:before {
+  content: "\f192";
+}
+.fa-wheelchair:before {
+  content: "\f193";
+}
+.fa-vimeo-square:before {
+  content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+  content: "\f195";
+}
+.fa-plus-square-o:before {
+  content: "\f196";
+}
+.fa-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-genderless:before,
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
diff --git a/module/css/lib/bootstrap-table/bootstrap-table.min.css b/module/css/lib/bootstrap-table/bootstrap-table.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..9fa800b73a533cc28bffb10d31a13543dac47a79
--- /dev/null
+++ b/module/css/lib/bootstrap-table/bootstrap-table.min.css
@@ -0,0 +1 @@
+.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ccc;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table,.bootstrap-table .table>tbody>tr>td,.bootstrap-table .table>tbody>tr>th,.bootstrap-table .table>tfoot>tr>td,.bootstrap-table .table>tfoot>tr>th,.bootstrap-table .table>thead>tr>td{padding:8px!important}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.fixed-table-container{position:relative;clear:both;border:1px solid #ccc;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{height:37px;overflow:hidden;border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0}.fixed-table-header{border-bottom:1px solid #ccc}.fixed-table-footer{border-top:1px solid #ccc}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ccc}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ccc}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox{text-align:center}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-container .no-records-found{text-align:center}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.fixed-table-body thead th .th-inner{box-sizing:border-box}.table td,.table th{vertical-align:middle;box-sizing:border-box}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap-toggle/bootstrap-toggle.css b/module/css/lib/bootstrap-toggle/bootstrap-toggle.css
new file mode 100755
index 0000000000000000000000000000000000000000..aaa0651336d56d17bb8287d3a80db6d6587cac3c
--- /dev/null
+++ b/module/css/lib/bootstrap-toggle/bootstrap-toggle.css
@@ -0,0 +1,85 @@
+/*! ========================================================================
+ * Bootstrap Toggle: bootstrap-toggle.css v2.2.0
+ * http://www.bootstraptoggle.com
+ * ========================================================================
+ * Copyright 2014 Min Hur, The New York Times Company
+ * Licensed under MIT
+ * ======================================================================== */
+
+
+.checkbox label .toggle,
+.checkbox-inline .toggle {
+	margin-left: -20px;
+	margin-right: 5px;
+}
+
+.toggle {
+	position: relative;
+	overflow: hidden;
+}
+.toggle input[type="checkbox"] {
+	display: none;
+}
+.toggle-group {
+	position: absolute;
+	width: 200%;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	transition: left 0.35s;
+	-webkit-transition: left 0.35s;
+	-moz-user-select: none;
+	-webkit-user-select: none;
+}
+.toggle.off .toggle-group {
+	left: -100%;
+}
+.toggle-on {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 50%;
+	margin: 0;
+	border: 0;
+	border-radius: 0;
+}
+.toggle-off {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 50%;
+	right: 0;
+	margin: 0;
+	border: 0;
+	border-radius: 0;
+}
+.toggle-handle {
+	position: relative;
+	margin: 0 auto;
+	padding-top: 0px;
+	padding-bottom: 0px;
+	height: 100%;
+	width: 0px;
+	border-width: 0 1px;
+}
+
+.toggle.btn { min-width: 59px; min-height: 34px; }
+.toggle-on.btn { padding-right: 24px; }
+.toggle-off.btn { padding-left: 24px; }
+
+.toggle.btn-lg { min-width: 79px; min-height: 45px; }
+.toggle-on.btn-lg { padding-right: 31px; }
+.toggle-off.btn-lg { padding-left: 31px; }
+.toggle-handle.btn-lg { width: 40px; }
+
+.toggle.btn-sm { min-width: 50px; min-height: 30px;}
+.toggle-on.btn-sm { padding-right: 20px; }
+.toggle-off.btn-sm { padding-left: 20px; }
+
+.toggle.btn-xs { min-width: 35px; min-height: 22px;}
+.toggle-on.btn-xs { padding-right: 12px; }
+.toggle-off.btn-xs { padding-left: 12px; }
+
+.toggle.ios, .toggle-on.ios, .toggle-off.ios { border-radius: 20px; }
+.toggle.ios .toggle-handle { border-radius: 20px; }
\ No newline at end of file
diff --git a/module/css/lib/bootstrap-toggle/bootstrap-toggle.min.css b/module/css/lib/bootstrap-toggle/bootstrap-toggle.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..0d42ed09cdaa37896d25cd2f470e51acfbf5e42a
--- /dev/null
+++ b/module/css/lib/bootstrap-toggle/bootstrap-toggle.min.css
@@ -0,0 +1,28 @@
+/*! ========================================================================
+ * Bootstrap Toggle: bootstrap-toggle.css v2.2.0
+ * http://www.bootstraptoggle.com
+ * ========================================================================
+ * Copyright 2014 Min Hur, The New York Times Company
+ * Licensed under MIT
+ * ======================================================================== */
+.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}
+.toggle{position:relative;overflow:hidden}
+.toggle input[type=checkbox]{display:none}
+.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
+.toggle.off .toggle-group{left:-100%}
+.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
+.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}
+.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}
+.toggle.btn{min-width:59px;min-height:34px}
+.toggle-on.btn{padding-right:24px}
+.toggle-off.btn{padding-left:24px}
+.toggle.btn-lg{min-width:79px;min-height:45px}
+.toggle-on.btn-lg{padding-right:31px}
+.toggle-off.btn-lg{padding-left:31px}
+.toggle-handle.btn-lg{width:40px}
+.toggle.btn-sm{min-width:50px;min-height:30px}
+.toggle-on.btn-sm{padding-right:20px}
+.toggle-off.btn-sm{padding-left:20px}
+.toggle.btn-xs{min-width:35px;min-height:22px}
+.toggle-on.btn-xs{padding-right:12px}
+.toggle-off.btn-xs{padding-left:12px}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/css/bootstrap-theme.css b/module/css/lib/bootstrap/css/bootstrap-theme.css
new file mode 100755
index 0000000000000000000000000000000000000000..b0fdfcbf9bfa064592dd7b2e3910315ccf58fba7
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap-theme.css
@@ -0,0 +1,476 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default:disabled,
+.btn-default[disabled] {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary:disabled,
+.btn-primary[disabled] {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success:disabled,
+.btn-success[disabled] {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info:disabled,
+.btn-info[disabled] {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning:disabled,
+.btn-warning[disabled] {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger:disabled,
+.btn-danger[disabled] {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #2e6da4;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+@media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+    background-repeat: repeat-x;
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #286090;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/module/css/lib/bootstrap/css/bootstrap-theme.css.map b/module/css/lib/bootstrap/css/bootstrap-theme.css.map
new file mode 100755
index 0000000000000000000000000000000000000000..5a12d631732892b7f236fdda9acbd21edfa0c19a
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFiCC;;EAEE,wBAAA;EE/BH;AFoCD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EAgC2C,2BAAA;EAA2B,oBAAA;EEzBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;;EAGE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEgCD;AF9BC;;EAEE,2BAAA;EACA,8BAAA;EEgCH;AF7BC;;EAEE,2BAAA;EACA,uBAAA;EE+BH;AF5BC;;;EAGE,2BAAA;EACA,wBAAA;EE8BH;AFdD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEyDD;AFvDC;;EAEE,2BAAA;EACA,8BAAA;EEyDH;AFtDC;;EAEE,2BAAA;EACA,uBAAA;EEwDH;AFrDC;;;EAGE,2BAAA;EACA,wBAAA;EEuDH;AFtCD;EGtDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEkFD;AFhFC;;EAEE,2BAAA;EACA,8BAAA;EEkFH;AF/EC;;EAEE,2BAAA;EACA,uBAAA;EEiFH;AF9EC;;;EAGE,2BAAA;EACA,wBAAA;EEgFH;AF9DD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE2GD;AFzGC;;EAEE,2BAAA;EACA,8BAAA;EE2GH;AFxGC;;EAEE,2BAAA;EACA,uBAAA;EE0GH;AFvGC;;;EAGE,2BAAA;EACA,wBAAA;EEyGH;AFtFD;EGxDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEoID;AFlIC;;EAEE,2BAAA;EACA,8BAAA;EEoIH;AFjIC;;EAEE,2BAAA;EACA,uBAAA;EEmIH;AFhIC;;;EAGE,2BAAA;EACA,wBAAA;EEkIH;AFxGD;;EChBE,oDAAA;EACQ,4CAAA;EC4HT;AFnGD;;EGzEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHwEF,2BAAA;EEyGD;AFvGD;;;EG9EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8EF,2BAAA;EE6GD;AFpGD;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ6GA,oBAAA;EC/CA,6FAAA;EACQ,qFAAA;EC0JT;AF/GD;;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECoKT;AF5GD;;EAEE,gDAAA;EE8GD;AF1GD;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EF+OD;AFlHD;;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0LT;AF5HD;;EAYI,2CAAA;EEoHH;AF/GD;;;EAGE,kBAAA;EEiHD;AF5FD;EAfI;;;IAGE,aAAA;IG3IF,0EAAA;IACA,qEAAA;IACA,+FAAA;IAAA,wEAAA;IACA,6BAAA;IACA,wHAAA;ID0PD;EACF;AFxGD;EACE,+CAAA;ECzGA,4FAAA;EACQ,oFAAA;ECoNT;AFhGD;EGpKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4GD;AFvGD;EGrKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoHD;AF9GD;EGtKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4HD;AFrHD;EGvKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoID;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AFlHD;EGzLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AFxHD;EG1LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqTH;AF9HD;EG3LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4TH;AFpID;EG5LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmUH;AF1ID;EG7LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0UH;AF7ID;EGhKI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDgTH;AFzID;EACE,oBAAA;EC5JA,oDAAA;EACQ,4CAAA;ECwST;AF1ID;;;EAGE,+BAAA;EGjNE,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+MF,uBAAA;EEgJD;AFrJD;;;EAQI,mBAAA;EEkJH;AFxID;ECjLE,mDAAA;EACQ,2CAAA;EC4TT;AFlID;EG1OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED+WH;AFxID;EG3OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDsXH;AF9ID;EG5OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6XH;AFpJD;EG7OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoYH;AF1JD;EG9OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2YH;AFhKD;EG/OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkZH;AFhKD;EGtPI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHoPF,uBAAA;ECzMA,2FAAA;EACQ,mFAAA;ECgXT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &.disabled,\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a {\n    &,\n    &:hover,\n    &:focus {\n      color: #fff;\n      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n    }\n  }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  text-shadow: 0 1px 0 #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-color: #2e6da4;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/css/bootstrap-theme.min.css b/module/css/lib/bootstrap/css/bootstrap-theme.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..cefa3d1ae367429a366230ca2c4c995616bb0790
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/css/bootstrap.css b/module/css/lib/bootstrap/css/bootstrap.css
new file mode 100755
index 0000000000000000000000000000000000000000..c81118bbf7d379dafecd1af3acf7bbb916358daa
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap.css
@@ -0,0 +1,6584 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+html {
+  font-family: sans-serif;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background-color: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  margin: .67em 0;
+  font-size: 2em;
+}
+mark {
+  color: #000;
+  background: #ff0;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -.5em;
+}
+sub {
+  bottom: -.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  height: 0;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  margin: 0;
+  font: inherit;
+  color: inherit;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  padding: .35em .625em .75em;
+  margin: 0 2px;
+  border: 1px solid #c0c0c0;
+}
+legend {
+  padding: 0;
+  border: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+td,
+th {
+  padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  select {
+    background: #fff !important;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+
+  src: url('../fonts/glyphicons-halflings-regular.eot');
+  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\2a";
+}
+.glyphicon-plus:before {
+  content: "\2b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+.glyphicon-cd:before {
+  content: "\e201";
+}
+.glyphicon-save-file:before {
+  content: "\e202";
+}
+.glyphicon-open-file:before {
+  content: "\e203";
+}
+.glyphicon-level-up:before {
+  content: "\e204";
+}
+.glyphicon-copy:before {
+  content: "\e205";
+}
+.glyphicon-paste:before {
+  content: "\e206";
+}
+.glyphicon-alert:before {
+  content: "\e209";
+}
+.glyphicon-equalizer:before {
+  content: "\e210";
+}
+.glyphicon-king:before {
+  content: "\e211";
+}
+.glyphicon-queen:before {
+  content: "\e212";
+}
+.glyphicon-pawn:before {
+  content: "\e213";
+}
+.glyphicon-bishop:before {
+  content: "\e214";
+}
+.glyphicon-knight:before {
+  content: "\e215";
+}
+.glyphicon-baby-formula:before {
+  content: "\e216";
+}
+.glyphicon-tent:before {
+  content: "\26fa";
+}
+.glyphicon-blackboard:before {
+  content: "\e218";
+}
+.glyphicon-bed:before {
+  content: "\e219";
+}
+.glyphicon-apple:before {
+  content: "\f8ff";
+}
+.glyphicon-erase:before {
+  content: "\e221";
+}
+.glyphicon-hourglass:before {
+  content: "\231b";
+}
+.glyphicon-lamp:before {
+  content: "\e223";
+}
+.glyphicon-duplicate:before {
+  content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+  content: "\e225";
+}
+.glyphicon-scissors:before {
+  content: "\e226";
+}
+.glyphicon-bitcoin:before {
+  content: "\e227";
+}
+.glyphicon-btc:before {
+  content: "\e227";
+}
+.glyphicon-xbt:before {
+  content: "\e227";
+}
+.glyphicon-yen:before {
+  content: "\00a5";
+}
+.glyphicon-jpy:before {
+  content: "\00a5";
+}
+.glyphicon-ruble:before {
+  content: "\20bd";
+}
+.glyphicon-rub:before {
+  content: "\20bd";
+}
+.glyphicon-scale:before {
+  content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+  content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
+}
+.glyphicon-education:before {
+  content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+  content: "\e234";
+}
+.glyphicon-option-vertical:before {
+  content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
+}
+.glyphicon-modal-window:before {
+  content: "\e237";
+}
+.glyphicon-oil:before {
+  content: "\e238";
+}
+.glyphicon-grain:before {
+  content: "\e239";
+}
+.glyphicon-sunglasses:before {
+  content: "\e240";
+}
+.glyphicon-text-size:before {
+  content: "\e241";
+}
+.glyphicon-text-color:before {
+  content: "\e242";
+}
+.glyphicon-text-background:before {
+  content: "\e243";
+}
+.glyphicon-object-align-top:before {
+  content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
+}
+.glyphicon-object-align-left:before {
+  content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
+}
+.glyphicon-object-align-right:before {
+  content: "\e249";
+}
+.glyphicon-triangle-right:before {
+  content: "\e250";
+}
+.glyphicon-triangle-left:before {
+  content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
+}
+.glyphicon-triangle-top:before {
+  content: "\e253";
+}
+.glyphicon-console:before {
+  content: "\e254";
+}
+.glyphicon-superscript:before {
+  content: "\e255";
+}
+.glyphicon-subscript:before {
+  content: "\e256";
+}
+.glyphicon-menu-left:before {
+  content: "\e257";
+}
+.glyphicon-menu-right:before {
+  content: "\e258";
+}
+.glyphicon-menu-down:before {
+  content: "\e259";
+}
+.glyphicon-menu-up:before {
+  content: "\e260";
+}
+* {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333;
+  background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #337ab7;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #23527c;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+  padding: 4px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all .2s ease-in-out;
+       -o-transition: all .2s ease-in-out;
+          transition: all .2s ease-in-out;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+[role="button"] {
+  cursor: pointer;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 30px;
+}
+h3,
+.h3 {
+  font-size: 24px;
+}
+h4,
+.h4 {
+  font-size: 18px;
+}
+h5,
+.h5 {
+  font-size: 14px;
+}
+h6,
+.h6 {
+  font-size: 12px;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+@media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
+}
+small,
+.small {
+  font-size: 85%;
+}
+mark,
+.mark {
+  padding: .2em;
+  background-color: #fcf8e3;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #777;
+}
+.text-primary {
+  color: #337ab7;
+}
+a.text-primary:hover {
+  color: #286090;
+}
+.text-success {
+  color: #3c763d;
+}
+a.text-success:hover {
+  color: #2b542c;
+}
+.text-info {
+  color: #31708f;
+}
+a.text-info:hover {
+  color: #245269;
+}
+.text-warning {
+  color: #8a6d3b;
+}
+a.text-warning:hover {
+  color: #66512c;
+}
+.text-danger {
+  color: #a94442;
+}
+a.text-danger:hover {
+  color: #843534;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #337ab7;
+}
+a.bg-primary:hover {
+  background-color: #286090;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #d9edf7;
+}
+a.bg-info:hover {
+  background-color: #afd9ee;
+}
+.bg-warning {
+  background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+  background-color: #f7ecb5;
+}
+.bg-danger {
+  background-color: #f2dede;
+}
+a.bg-danger:hover {
+  background-color: #e4b9b9;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  margin-left: -5px;
+  list-style: none;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 1.42857143;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    overflow: hidden;
+    clear: left;
+    text-align: right;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #fff;
+  background-color: #333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.42857143;
+  color: #333;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0;
+  }
+}
+table {
+  background-color: transparent;
+}
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777;
+  text-align: left;
+}
+th {
+  text-align: left;
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  display: table-column;
+  float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  display: table-cell;
+  float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+.table-responsive {
+  min-height: .01%;
+  overflow-x: auto;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #ddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+  color: #999;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #999;
+}
+.form-control::-webkit-input-placeholder {
+  color: #999;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  background-color: #eee;
+  opacity: 1;
+}
+.form-control[disabled],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"],
+  input[type="time"],
+  input[type="datetime-local"],
+  input[type="month"] {
+    line-height: 34px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 46px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  vertical-align: middle;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  min-height: 34px;
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-sm {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.form-group-sm .form-control {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.form-group-sm .form-control,
+select[multiple].form-group-sm .form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.form-group-lg .form-control {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.form-group-lg .form-control,
+select[multiple].form-group-lg .form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 46px;
+  min-height: 38px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+  color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #a94442;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+  top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
+}
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 14.333333px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+  }
+}
+.btn {
+  display: inline-block;
+  padding: 6px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  pointer-events: none;
+  cursor: not-allowed;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+          box-shadow: none;
+  opacity: .65;
+}
+.btn-default {
+  color: #333;
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default.focus,
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default .badge {
+  color: #fff;
+  background-color: #333;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary.focus,
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success.focus,
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #fff;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info.focus,
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #fff;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning.focus,
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #fff;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger.focus,
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #fff;
+}
+.btn-link {
+  font-weight: normal;
+  color: #337ab7;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #23527c;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity .15s linear;
+       -o-transition: opacity .15s linear;
+          transition: opacity .15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-timing-function: ease;
+       -o-transition-timing-function: ease;
+          transition-timing-function: ease;
+  -webkit-transition-duration: .35s;
+       -o-transition-duration: .35s;
+          transition-duration: .35s;
+  -webkit-transition-property: height, visibility;
+       -o-transition-property: height, visibility;
+          transition-property: height, visibility;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  font-size: 14px;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  color: #262626;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #fff;
+  text-decoration: none;
+  background-color: #337ab7;
+  outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #777;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px solid;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    right: auto;
+    left: 0;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  /*position: relative;*/
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  display: table-cell;
+  float: none;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555;
+  text-align: center;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  margin-left: -1px;
+}
+.nav {
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.nav > li.disabled > a {
+  color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777;
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eee;
+  border-color: #337ab7;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555;
+  cursor: default;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #337ab7;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+  overflow-x: visible;
+  -webkit-overflow-scrolling: touch;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  height: 50px;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-right: 15px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+}
+.navbar-form {
+  padding: 10px 15px;
+  margin-top: 8px;
+  margin-right: -15px;
+  margin-bottom: 8px;
+  margin-left: -15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+@media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-right: 15px;
+    margin-left: 15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #f8f8f8;
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+  color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #777;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #333;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #555;
+    background-color: #e7e7e7;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #777;
+}
+.navbar-default .navbar-link:hover {
+  color: #333;
+}
+.navbar-default .btn-link {
+  color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
+}
+.navbar-inverse {
+  background-color: #222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #9d9d9d;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #fff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #fff;
+}
+.navbar-inverse .btn-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/\00a0";
+}
+.breadcrumb > .active {
+  color: #777;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 20px 0;
+  border-radius: 4px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 12px;
+  margin-left: -1px;
+  line-height: 1.42857143;
+  color: #337ab7;
+  text-decoration: none;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  color: #23527c;
+  background-color: #eee;
+  border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 2;
+  color: #fff;
+  cursor: default;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+.label-primary {
+  background-color: #337ab7;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #286090;
+}
+.label-success {
+  background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
+}
+.label-info {
+  background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
+}
+.label-warning {
+  background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
+}
+.label-danger {
+  background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding: 30px 15px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+  border-radius: 6px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  .jumbotron {
+    padding: 48px 0;
+  }
+  .container .jumbotron,
+  .container-fluid .jumbotron {
+    padding-right: 60px;
+    padding-left: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: border .2s ease-in-out;
+       -o-transition: border .2s ease-in-out;
+          transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-right: auto;
+  margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #337ab7;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #2b542c;
+}
+.alert-info {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info hr {
+  border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+  color: #245269;
+}
+.alert-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.alert-warning hr {
+  border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+  color: #66512c;
+}
+.alert-danger {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.alert-danger hr {
+  border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+  color: #843534;
+}
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #fff;
+  text-align: center;
+  background-color: #337ab7;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+  -webkit-transition: width .6s ease;
+       -o-transition: width .6s ease;
+          transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media,
+.media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+.media-body {
+  width: 10000px;
+}
+.media-object {
+  display: block;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
+}
+.media-bottom {
+  vertical-align: bottom;
+}
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+.list-group-item {
+  /*position: relative;*/
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+a.list-group-item {
+  color: #555;
+}
+a.list-group-item .list-group-item-heading {
+  color: #333;
+}
+a.list-group-item:hover,
+a.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #c7ddef;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+a.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+a.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #ddd;
+}
+.panel-default {
+  border-color: #ddd;
+}
+.panel-default > .panel-heading {
+  color: #333;
+  background-color: #f5f5f5;
+  border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ddd;
+}
+.panel-primary {
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #337ab7;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
+}
+.panel-warning {
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
+}
+.panel-danger {
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+.close:hover,
+.close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+button.close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transition: -webkit-transform .3s ease-out;
+       -o-transition:      -o-transform .3s ease-out;
+          transition:         transform .3s ease-out;
+  -webkit-transform: translate(0, -25%);
+      -ms-transform: translate(0, -25%);
+       -o-transform: translate(0, -25%);
+          transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+      -ms-transform: translate(0, 0);
+       -o-transform: translate(0, 0);
+          transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  outline: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
+}
+.modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.modal-header {
+  min-height: 16.42857143px;
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.4;
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+.tooltip-inner {
+ /* max-width: 200px;*/
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  white-space: normal;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+.popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: #fff;
+  border-bottom-width: 0;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+.popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: #fff;
+  border-left-width: 0;
+}
+.popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: #fff;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: .6s ease-in-out left;
+       -o-transition: .6s ease-in-out left;
+          transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform .6s ease-in-out;
+         -o-transition:      -o-transform .6s ease-in-out;
+            transition:         transform .6s ease-in-out;
+
+    -webkit-backface-visibility: hidden;
+            backface-visibility: hidden;
+    -webkit-perspective: 1000;
+            perspective: 1000;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
+    left: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+            transform: translate3d(100%, 0, 0);
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    left: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    left: 0;
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+  }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 15%;
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control.right {
+  right: 0;
+  left: auto;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #fff;
+  text-decoration: none;
+  filter: alpha(opacity=90);
+  outline: 0;
+  opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  margin-top: -10px;
+  font-family: serif;
+  line-height: 1;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+  border: 1px solid #fff;
+  border-radius: 10px;
+}
+.carousel-indicators .active {
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  background-color: #fff;
+}
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -15px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -15px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -15px;
+  }
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/module/css/lib/bootstrap/css/bootstrap.css.map b/module/css/lib/bootstrap/css/bootstrap.css.map
new file mode 100755
index 0000000000000000000000000000000000000000..2fd84f36ebefeecb6ebd7780cbccf9b69b95add2
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACwBD;;;;;;;;;;;;;EAaE,gBAAA;EDtBD;AC8BD;;;;EAIE,uBAAA;EACA,0BAAA;ED5BD;ACoCD;EACE,eAAA;EACA,WAAA;EDlCD;AC0CD;;EAEE,eAAA;EDxCD;ACkDD;EACE,+BAAA;EDhDD;ACuDD;;EAEE,YAAA;EDrDD;AC+DD;EACE,2BAAA;ED7DD;ACoED;;EAEE,mBAAA;EDlED;ACyED;EACE,oBAAA;EDvED;AC+ED;EACE,gBAAA;EACA,kBAAA;ED7ED;ACoFD;EACE,kBAAA;EACA,aAAA;EDlFD;ACyFD;EACE,gBAAA;EDvFD;AC8FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED5FD;AC+FD;EACE,aAAA;ED7FD;ACgGD;EACE,iBAAA;ED9FD;ACwGD;EACE,WAAA;EDtGD;AC6GD;EACE,kBAAA;ED3GD;ACqHD;EACE,kBAAA;EDnHD;AC0HD;EACE,8BAAA;EACA,iCAAA;UAAA,yBAAA;EACA,WAAA;EDxHD;AC+HD;EACE,gBAAA;ED7HD;ACoID;;;;EAIE,mCAAA;EACA,gBAAA;EDlID;ACoJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDlJD;ACyJD;EACE,mBAAA;EDvJD;ACiKD;;EAEE,sBAAA;ED/JD;AC0KD;;;;EAIE,4BAAA;EACA,iBAAA;EDxKD;AC+KD;;EAEE,iBAAA;ED7KD;ACoLD;;EAEE,WAAA;EACA,YAAA;EDlLD;AC0LD;EACE,qBAAA;EDxLD;ACmMD;;EAEE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,YAAA;EDjMD;AC0MD;;EAEE,cAAA;EDxMD;ACiND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED/MD;ACwND;;EAEE,0BAAA;EDtND;AC6ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED3ND;ACmOD;EACE,WAAA;EACA,YAAA;EDjOD;ACwOD;EACE,gBAAA;EDtOD;AC8OD;EACE,mBAAA;ED5OD;ACsPD;EACE,2BAAA;EACA,mBAAA;EDpPD;ACuPD;;EAEE,YAAA;EDrPD;AACD,sFAAqF;AE1ErF;EAnGI;;;IAGI,oCAAA;IACA,wBAAA;IACA,qCAAA;YAAA,6BAAA;IACA,8BAAA;IFgLL;EE7KC;;IAEI,4BAAA;IF+KL;EE5KC;IACI,8BAAA;IF8KL;EE3KC;IACI,+BAAA;IF6KL;EExKC;;IAEI,aAAA;IF0KL;EEvKC;;IAEI,wBAAA;IACA,0BAAA;IFyKL;EEtKC;IACI,6BAAA;IFwKL;EErKC;;IAEI,0BAAA;IFuKL;EEpKC;IACI,4BAAA;IFsKL;EEnKC;;;IAGI,YAAA;IACA,WAAA;IFqKL;EElKC;;IAEI,yBAAA;IFoKL;EE7JC;IACI,6BAAA;IF+JL;EE3JC;IACI,eAAA;IF6JL;EE3JC;;IAGQ,mCAAA;IF4JT;EEzJC;IACI,wBAAA;IF2JL;EExJC;IACI,sCAAA;IF0JL;EE3JC;;IAKQ,mCAAA;IF0JT;EEvJC;;IAGQ,mCAAA;IFwJT;EACF;AGpPD;EACE,qCAAA;EACA,uDAAA;EACA,iYAAA;EHsPD;AG9OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EHgPD;AG5OmC;EAAW,gBAAA;EH+O9C;AG9OmC;EAAW,gBAAA;EHiP9C;AG/OmC;;EAAW,kBAAA;EHmP9C;AGlPmC;EAAW,kBAAA;EHqP9C;AGpPmC;EAAW,kBAAA;EHuP9C;AGtPmC;EAAW,kBAAA;EHyP9C;AGxPmC;EAAW,kBAAA;EH2P9C;AG1PmC;EAAW,kBAAA;EH6P9C;AG5PmC;EAAW,kBAAA;EH+P9C;AG9PmC;EAAW,kBAAA;EHiQ9C;AGhQmC;EAAW,kBAAA;EHmQ9C;AGlQmC;EAAW,kBAAA;EHqQ9C;AGpQmC;EAAW,kBAAA;EHuQ9C;AGtQmC;EAAW,kBAAA;EHyQ9C;AGxQmC;EAAW,kBAAA;EH2Q9C;AG1QmC;EAAW,kBAAA;EH6Q9C;AG5QmC;EAAW,kBAAA;EH+Q9C;AG9QmC;EAAW,kBAAA;EHiR9C;AGhRmC;EAAW,kBAAA;EHmR9C;AGlRmC;EAAW,kBAAA;EHqR9C;AGpRmC;EAAW,kBAAA;EHuR9C;AGtRmC;EAAW,kBAAA;EHyR9C;AGxRmC;EAAW,kBAAA;EH2R9C;AG1RmC;EAAW,kBAAA;EH6R9C;AG5RmC;EAAW,kBAAA;EH+R9C;AG9RmC;EAAW,kBAAA;EHiS9C;AGhSmC;EAAW,kBAAA;EHmS9C;AGlSmC;EAAW,kBAAA;EHqS9C;AGpSmC;EAAW,kBAAA;EHuS9C;AGtSmC;EAAW,kBAAA;EHyS9C;AGxSmC;EAAW,kBAAA;EH2S9C;AG1SmC;EAAW,kBAAA;EH6S9C;AG5SmC;EAAW,kBAAA;EH+S9C;AG9SmC;EAAW,kBAAA;EHiT9C;AGhTmC;EAAW,kBAAA;EHmT9C;AGlTmC;EAAW,kBAAA;EHqT9C;AGpTmC;EAAW,kBAAA;EHuT9C;AGtTmC;EAAW,kBAAA;EHyT9C;AGxTmC;EAAW,kBAAA;EH2T9C;AG1TmC;EAAW,kBAAA;EH6T9C;AG5TmC;EAAW,kBAAA;EH+T9C;AG9TmC;EAAW,kBAAA;EHiU9C;AGhUmC;EAAW,kBAAA;EHmU9C;AGlUmC;EAAW,kBAAA;EHqU9C;AGpUmC;EAAW,kBAAA;EHuU9C;AGtUmC;EAAW,kBAAA;EHyU9C;AGxUmC;EAAW,kBAAA;EH2U9C;AG1UmC;EAAW,kBAAA;EH6U9C;AG5UmC;EAAW,kBAAA;EH+U9C;AG9UmC;EAAW,kBAAA;EHiV9C;AGhVmC;EAAW,kBAAA;EHmV9C;AGlVmC;EAAW,kBAAA;EHqV9C;AGpVmC;EAAW,kBAAA;EHuV9C;AGtVmC;EAAW,kBAAA;EHyV9C;AGxVmC;EAAW,kBAAA;EH2V9C;AG1VmC;EAAW,kBAAA;EH6V9C;AG5VmC;EAAW,kBAAA;EH+V9C;AG9VmC;EAAW,kBAAA;EHiW9C;AGhWmC;EAAW,kBAAA;EHmW9C;AGlWmC;EAAW,kBAAA;EHqW9C;AGpWmC;EAAW,kBAAA;EHuW9C;AGtWmC;EAAW,kBAAA;EHyW9C;AGxWmC;EAAW,kBAAA;EH2W9C;AG1WmC;EAAW,kBAAA;EH6W9C;AG5WmC;EAAW,kBAAA;EH+W9C;AG9WmC;EAAW,kBAAA;EHiX9C;AGhXmC;EAAW,kBAAA;EHmX9C;AGlXmC;EAAW,kBAAA;EHqX9C;AGpXmC;EAAW,kBAAA;EHuX9C;AGtXmC;EAAW,kBAAA;EHyX9C;AGxXmC;EAAW,kBAAA;EH2X9C;AG1XmC;EAAW,kBAAA;EH6X9C;AG5XmC;EAAW,kBAAA;EH+X9C;AG9XmC;EAAW,kBAAA;EHiY9C;AGhYmC;EAAW,kBAAA;EHmY9C;AGlYmC;EAAW,kBAAA;EHqY9C;AGpYmC;EAAW,kBAAA;EHuY9C;AGtYmC;EAAW,kBAAA;EHyY9C;AGxYmC;EAAW,kBAAA;EH2Y9C;AG1YmC;EAAW,kBAAA;EH6Y9C;AG5YmC;EAAW,kBAAA;EH+Y9C;AG9YmC;EAAW,kBAAA;EHiZ9C;AGhZmC;EAAW,kBAAA;EHmZ9C;AGlZmC;EAAW,kBAAA;EHqZ9C;AGpZmC;EAAW,kBAAA;EHuZ9C;AGtZmC;EAAW,kBAAA;EHyZ9C;AGxZmC;EAAW,kBAAA;EH2Z9C;AG1ZmC;EAAW,kBAAA;EH6Z9C;AG5ZmC;EAAW,kBAAA;EH+Z9C;AG9ZmC;EAAW,kBAAA;EHia9C;AGhamC;EAAW,kBAAA;EHma9C;AGlamC;EAAW,kBAAA;EHqa9C;AGpamC;EAAW,kBAAA;EHua9C;AGtamC;EAAW,kBAAA;EHya9C;AGxamC;EAAW,kBAAA;EH2a9C;AG1amC;EAAW,kBAAA;EH6a9C;AG5amC;EAAW,kBAAA;EH+a9C;AG9amC;EAAW,kBAAA;EHib9C;AGhbmC;EAAW,kBAAA;EHmb9C;AGlbmC;EAAW,kBAAA;EHqb9C;AGpbmC;EAAW,kBAAA;EHub9C;AGtbmC;EAAW,kBAAA;EHyb9C;AGxbmC;EAAW,kBAAA;EH2b9C;AG1bmC;EAAW,kBAAA;EH6b9C;AG5bmC;EAAW,kBAAA;EH+b9C;AG9bmC;EAAW,kBAAA;EHic9C;AGhcmC;EAAW,kBAAA;EHmc9C;AGlcmC;EAAW,kBAAA;EHqc9C;AGpcmC;EAAW,kBAAA;EHuc9C;AGtcmC;EAAW,kBAAA;EHyc9C;AGxcmC;EAAW,kBAAA;EH2c9C;AG1cmC;EAAW,kBAAA;EH6c9C;AG5cmC;EAAW,kBAAA;EH+c9C;AG9cmC;EAAW,kBAAA;EHid9C;AGhdmC;EAAW,kBAAA;EHmd9C;AGldmC;EAAW,kBAAA;EHqd9C;AGpdmC;EAAW,kBAAA;EHud9C;AGtdmC;EAAW,kBAAA;EHyd9C;AGxdmC;EAAW,kBAAA;EH2d9C;AG1dmC;EAAW,kBAAA;EH6d9C;AG5dmC;EAAW,kBAAA;EH+d9C;AG9dmC;EAAW,kBAAA;EHie9C;AGhemC;EAAW,kBAAA;EHme9C;AGlemC;EAAW,kBAAA;EHqe9C;AGpemC;EAAW,kBAAA;EHue9C;AGtemC;EAAW,kBAAA;EHye9C;AGxemC;EAAW,kBAAA;EH2e9C;AG1emC;EAAW,kBAAA;EH6e9C;AG5emC;EAAW,kBAAA;EH+e9C;AG9emC;EAAW,kBAAA;EHif9C;AGhfmC;EAAW,kBAAA;EHmf9C;AGlfmC;EAAW,kBAAA;EHqf9C;AGpfmC;EAAW,kBAAA;EHuf9C;AGtfmC;EAAW,kBAAA;EHyf9C;AGxfmC;EAAW,kBAAA;EH2f9C;AG1fmC;EAAW,kBAAA;EH6f9C;AG5fmC;EAAW,kBAAA;EH+f9C;AG9fmC;EAAW,kBAAA;EHigB9C;AGhgBmC;EAAW,kBAAA;EHmgB9C;AGlgBmC;EAAW,kBAAA;EHqgB9C;AGpgBmC;EAAW,kBAAA;EHugB9C;AGtgBmC;EAAW,kBAAA;EHygB9C;AGxgBmC;EAAW,kBAAA;EH2gB9C;AG1gBmC;EAAW,kBAAA;EH6gB9C;AG5gBmC;EAAW,kBAAA;EH+gB9C;AG9gBmC;EAAW,kBAAA;EHihB9C;AGhhBmC;EAAW,kBAAA;EHmhB9C;AGlhBmC;EAAW,kBAAA;EHqhB9C;AGphBmC;EAAW,kBAAA;EHuhB9C;AGthBmC;EAAW,kBAAA;EHyhB9C;AGxhBmC;EAAW,kBAAA;EH2hB9C;AG1hBmC;EAAW,kBAAA;EH6hB9C;AG5hBmC;EAAW,kBAAA;EH+hB9C;AG9hBmC;EAAW,kBAAA;EHiiB9C;AGhiBmC;EAAW,kBAAA;EHmiB9C;AGliBmC;EAAW,kBAAA;EHqiB9C;AGpiBmC;EAAW,kBAAA;EHuiB9C;AGtiBmC;EAAW,kBAAA;EHyiB9C;AGxiBmC;EAAW,kBAAA;EH2iB9C;AG1iBmC;EAAW,kBAAA;EH6iB9C;AG5iBmC;EAAW,kBAAA;EH+iB9C;AG9iBmC;EAAW,kBAAA;EHijB9C;AGhjBmC;EAAW,kBAAA;EHmjB9C;AGljBmC;EAAW,kBAAA;EHqjB9C;AGpjBmC;EAAW,kBAAA;EHujB9C;AGtjBmC;EAAW,kBAAA;EHyjB9C;AGxjBmC;EAAW,kBAAA;EH2jB9C;AG1jBmC;EAAW,kBAAA;EH6jB9C;AG5jBmC;EAAW,kBAAA;EH+jB9C;AG9jBmC;EAAW,kBAAA;EHikB9C;AGhkBmC;EAAW,kBAAA;EHmkB9C;AGlkBmC;EAAW,kBAAA;EHqkB9C;AGpkBmC;EAAW,kBAAA;EHukB9C;AGtkBmC;EAAW,kBAAA;EHykB9C;AGxkBmC;EAAW,kBAAA;EH2kB9C;AG1kBmC;EAAW,kBAAA;EH6kB9C;AG5kBmC;EAAW,kBAAA;EH+kB9C;AG9kBmC;EAAW,kBAAA;EHilB9C;AGhlBmC;EAAW,kBAAA;EHmlB9C;AGllBmC;EAAW,kBAAA;EHqlB9C;AGplBmC;EAAW,kBAAA;EHulB9C;AGtlBmC;EAAW,kBAAA;EHylB9C;AGxlBmC;EAAW,kBAAA;EH2lB9C;AG1lBmC;EAAW,kBAAA;EH6lB9C;AG5lBmC;EAAW,kBAAA;EH+lB9C;AG9lBmC;EAAW,kBAAA;EHimB9C;AGhmBmC;EAAW,kBAAA;EHmmB9C;AGlmBmC;EAAW,kBAAA;EHqmB9C;AGpmBmC;EAAW,kBAAA;EHumB9C;AGtmBmC;EAAW,kBAAA;EHymB9C;AGxmBmC;EAAW,kBAAA;EH2mB9C;AG1mBmC;EAAW,kBAAA;EH6mB9C;AG5mBmC;EAAW,kBAAA;EH+mB9C;AG9mBmC;EAAW,kBAAA;EHinB9C;AGhnBmC;EAAW,kBAAA;EHmnB9C;AGlnBmC;EAAW,kBAAA;EHqnB9C;AGpnBmC;EAAW,kBAAA;EHunB9C;AGtnBmC;EAAW,kBAAA;EHynB9C;AGxnBmC;EAAW,kBAAA;EH2nB9C;AG1nBmC;EAAW,kBAAA;EH6nB9C;AG5nBmC;EAAW,kBAAA;EH+nB9C;AG9nBmC;EAAW,kBAAA;EHioB9C;AGhoBmC;EAAW,kBAAA;EHmoB9C;AGloBmC;EAAW,kBAAA;EHqoB9C;AGpoBmC;EAAW,kBAAA;EHuoB9C;AGtoBmC;EAAW,kBAAA;EHyoB9C;AGhoBmC;EAAW,kBAAA;EHmoB9C;AGloBmC;EAAW,kBAAA;EHqoB9C;AGpoBmC;EAAW,kBAAA;EHuoB9C;AGtoBmC;EAAW,kBAAA;EHyoB9C;AGxoBmC;EAAW,kBAAA;EH2oB9C;AG1oBmC;EAAW,kBAAA;EH6oB9C;AG5oBmC;EAAW,kBAAA;EH+oB9C;AG9oBmC;EAAW,kBAAA;EHipB9C;AGhpBmC;EAAW,kBAAA;EHmpB9C;AGlpBmC;EAAW,kBAAA;EHqpB9C;AGppBmC;EAAW,kBAAA;EHupB9C;AGtpBmC;EAAW,kBAAA;EHypB9C;AGxpBmC;EAAW,kBAAA;EH2pB9C;AG1pBmC;EAAW,kBAAA;EH6pB9C;AG5pBmC;EAAW,kBAAA;EH+pB9C;AG9pBmC;EAAW,kBAAA;EHiqB9C;AGhqBmC;EAAW,kBAAA;EHmqB9C;AGlqBmC;EAAW,kBAAA;EHqqB9C;AGpqBmC;EAAW,kBAAA;EHuqB9C;AGtqBmC;EAAW,kBAAA;EHyqB9C;AGxqBmC;EAAW,kBAAA;EH2qB9C;AG1qBmC;EAAW,kBAAA;EH6qB9C;AG5qBmC;EAAW,kBAAA;EH+qB9C;AG9qBmC;EAAW,kBAAA;EHirB9C;AGhrBmC;EAAW,kBAAA;EHmrB9C;AGlrBmC;EAAW,kBAAA;EHqrB9C;AGprBmC;EAAW,kBAAA;EHurB9C;AGtrBmC;EAAW,kBAAA;EHyrB9C;AGxrBmC;EAAW,kBAAA;EH2rB9C;AG1rBmC;EAAW,kBAAA;EH6rB9C;AG5rBmC;EAAW,kBAAA;EH+rB9C;AG9rBmC;EAAW,kBAAA;EHisB9C;AGhsBmC;EAAW,kBAAA;EHmsB9C;AGlsBmC;EAAW,kBAAA;EHqsB9C;AGpsBmC;EAAW,kBAAA;EHusB9C;AGtsBmC;EAAW,kBAAA;EHysB9C;AGxsBmC;EAAW,kBAAA;EH2sB9C;AG1sBmC;EAAW,kBAAA;EH6sB9C;AG5sBmC;EAAW,kBAAA;EH+sB9C;AG9sBmC;EAAW,kBAAA;EHitB9C;AGhtBmC;EAAW,kBAAA;EHmtB9C;AGltBmC;EAAW,kBAAA;EHqtB9C;AGptBmC;EAAW,kBAAA;EHutB9C;AGttBmC;EAAW,kBAAA;EHytB9C;AGxtBmC;EAAW,kBAAA;EH2tB9C;AG1tBmC;EAAW,kBAAA;EH6tB9C;AG5tBmC;EAAW,kBAAA;EH+tB9C;AG9tBmC;EAAW,kBAAA;EHiuB9C;AGhuBmC;EAAW,kBAAA;EHmuB9C;AGluBmC;EAAW,kBAAA;EHquB9C;AGpuBmC;EAAW,kBAAA;EHuuB9C;AGtuBmC;EAAW,kBAAA;EHyuB9C;AGxuBmC;EAAW,kBAAA;EH2uB9C;AG1uBmC;EAAW,kBAAA;EH6uB9C;AG5uBmC;EAAW,kBAAA;EH+uB9C;AG9uBmC;EAAW,kBAAA;EHivB9C;AIvhCD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;EL09BT;AIzhCD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELg+BT;AIvhCD;EACE,iBAAA;EACA,+CAAA;EJyhCD;AIthCD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJwhCD;AIphCD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJshCD;AIhhCD;EACE,gBAAA;EACA,uBAAA;EJkhCD;AIhhCC;;EAEE,gBAAA;EACA,4BAAA;EJkhCH;AI/gCC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENskCD;AIzgCD;EACE,WAAA;EJ2gCD;AIrgCD;EACE,wBAAA;EJugCD;AIngCD;;;;;EGvEE,gBAAA;EACA,iBAAA;EACA,cAAA;EPilCD;AIvgCD;EACE,oBAAA;EJygCD;AIngCD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC6FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEvLR,uBAAA;EACA,iBAAA;EACA,cAAA;EPimCD;AIngCD;EACE,oBAAA;EJqgCD;AI//BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJigCD;AIz/BD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJ2/BD;AIn/BC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJq/BH;AIz+BD;EACE,iBAAA;EJ2+BD;AQnoCD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ER+oCD;AQppCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ERqqCH;AQjqCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERsqCD;AQ1qCD;;;;;;;;;;;;EAQI,gBAAA;ERgrCH;AQ7qCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERkrCD;AQtrCD;;;;;;;;;;;;EAQI,gBAAA;ER4rCH;AQxrCD;;EAAU,iBAAA;ER4rCT;AQ3rCD;;EAAU,iBAAA;ER+rCT;AQ9rCD;;EAAU,iBAAA;ERksCT;AQjsCD;;EAAU,iBAAA;ERqsCT;AQpsCD;;EAAU,iBAAA;ERwsCT;AQvsCD;;EAAU,iBAAA;ER2sCT;AQrsCD;EACE,kBAAA;ERusCD;AQpsCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ERssCD;AQjsCD;EAAA;IAFI,iBAAA;IRusCD;EACF;AQ/rCD;;EAEE,gBAAA;ERisCD;AQ9rCD;;EAEE,2BAAA;EACA,eAAA;ERgsCD;AQ5rCD;EAAuB,kBAAA;ER+rCtB;AQ9rCD;EAAuB,mBAAA;ERisCtB;AQhsCD;EAAuB,oBAAA;ERmsCtB;AQlsCD;EAAuB,qBAAA;ERqsCtB;AQpsCD;EAAuB,qBAAA;ERusCtB;AQpsCD;EAAuB,2BAAA;ERusCtB;AQtsCD;EAAuB,2BAAA;ERysCtB;AQxsCD;EAAuB,4BAAA;ER2sCtB;AQxsCD;EACE,gBAAA;ER0sCD;AQxsCD;ECrGE,gBAAA;ETgzCD;AS/yCC;EACE,gBAAA;ETizCH;AQ3sCD;ECxGE,gBAAA;ETszCD;ASrzCC;EACE,gBAAA;ETuzCH;AQ9sCD;EC3GE,gBAAA;ET4zCD;AS3zCC;EACE,gBAAA;ET6zCH;AQjtCD;EC9GE,gBAAA;ETk0CD;ASj0CC;EACE,gBAAA;ETm0CH;AQptCD;ECjHE,gBAAA;ETw0CD;ASv0CC;EACE,gBAAA;ETy0CH;AQntCD;EAGE,aAAA;EE3HA,2BAAA;EV+0CD;AU90CC;EACE,2BAAA;EVg1CH;AQptCD;EE9HE,2BAAA;EVq1CD;AUp1CC;EACE,2BAAA;EVs1CH;AQvtCD;EEjIE,2BAAA;EV21CD;AU11CC;EACE,2BAAA;EV41CH;AQ1tCD;EEpIE,2BAAA;EVi2CD;AUh2CC;EACE,2BAAA;EVk2CH;AQ7tCD;EEvIE,2BAAA;EVu2CD;AUt2CC;EACE,2BAAA;EVw2CH;AQ3tCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ER6tCD;AQrtCD;;EAEE,eAAA;EACA,qBAAA;ERutCD;AQ1tCD;;;;EAMI,kBAAA;ER0tCH;AQntCD;EACE,iBAAA;EACA,kBAAA;ERqtCD;AQjtCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ERotCD;AQttCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ERotCH;AQ/sCD;EACE,eAAA;EACA,qBAAA;ERitCD;AQ/sCD;;EAEE,yBAAA;ERitCD;AQ/sCD;EACE,mBAAA;ERitCD;AQ/sCD;EACE,gBAAA;ERitCD;AQxrCD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IGtNJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IX65CC;EQlsCH;IAHM,oBAAA;IRwsCH;EACF;AQ/rCD;;EAGE,cAAA;EACA,mCAAA;ERgsCD;AQ9rCD;EACE,gBAAA;EA9IqB,2BAAA;ER+0CtB;AQ5rCD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ER8rCD;AQzrCG;;;EACE,kBAAA;ER6rCL;AQvsCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ERyrCH;AQvrCG;;;EACE,wBAAA;ER2rCL;AQnrCD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ERqrCD;AQ/qCG;;;;;;EAAW,aAAA;ERurCd;AQtrCG;;;;;;EACE,wBAAA;ER6rCL;AQvrCD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ERyrCD;AY/9CD;;;;EAIE,gEAAA;EZi+CD;AY79CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZ+9CD;AY39CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;UAAA,gDAAA;EZ69CD;AYn+CD;EASI,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,0BAAA;UAAA,kBAAA;EZ69CH;AYx9CD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZ09CD;AYr+CD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZy9CH;AYp9CD;EACE,mBAAA;EACA,oBAAA;EZs9CD;AahhDD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;EdshDD;AahhDC;EAAA;IAFE,cAAA;IbshDD;EACF;AalhDC;EAAA;IAFE,cAAA;IbwhDD;EACF;AaphDD;EAAA;IAFI,eAAA;Ib0hDD;EACF;AajhDD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed2iDD;Aa9gDD;ECvBE,oBAAA;EACA,qBAAA;EdwiDD;AexiDG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;EfwiDL;AexhDG;EACE,aAAA;Ef0hDL;AenhDC;EACE,aAAA;EfqhDH;AethDC;EACE,qBAAA;EfwhDH;AezhDC;EACE,qBAAA;Ef2hDH;Ae5hDC;EACE,YAAA;Ef8hDH;Ae/hDC;EACE,qBAAA;EfiiDH;AeliDC;EACE,qBAAA;EfoiDH;AeriDC;EACE,YAAA;EfuiDH;AexiDC;EACE,qBAAA;Ef0iDH;Ae3iDC;EACE,qBAAA;Ef6iDH;Ae9iDC;EACE,YAAA;EfgjDH;AejjDC;EACE,qBAAA;EfmjDH;AepjDC;EACE,oBAAA;EfsjDH;AexiDC;EACE,aAAA;Ef0iDH;Ae3iDC;EACE,qBAAA;Ef6iDH;Ae9iDC;EACE,qBAAA;EfgjDH;AejjDC;EACE,YAAA;EfmjDH;AepjDC;EACE,qBAAA;EfsjDH;AevjDC;EACE,qBAAA;EfyjDH;Ae1jDC;EACE,YAAA;Ef4jDH;Ae7jDC;EACE,qBAAA;Ef+jDH;AehkDC;EACE,qBAAA;EfkkDH;AenkDC;EACE,YAAA;EfqkDH;AetkDC;EACE,qBAAA;EfwkDH;AezkDC;EACE,oBAAA;Ef2kDH;AevkDC;EACE,aAAA;EfykDH;AezlDC;EACE,YAAA;Ef2lDH;Ae5lDC;EACE,oBAAA;Ef8lDH;Ae/lDC;EACE,oBAAA;EfimDH;AelmDC;EACE,WAAA;EfomDH;AermDC;EACE,oBAAA;EfumDH;AexmDC;EACE,oBAAA;Ef0mDH;Ae3mDC;EACE,WAAA;Ef6mDH;Ae9mDC;EACE,oBAAA;EfgnDH;AejnDC;EACE,oBAAA;EfmnDH;AepnDC;EACE,WAAA;EfsnDH;AevnDC;EACE,oBAAA;EfynDH;Ae1nDC;EACE,mBAAA;Ef4nDH;AexnDC;EACE,YAAA;Ef0nDH;Ae5mDC;EACE,mBAAA;Ef8mDH;Ae/mDC;EACE,2BAAA;EfinDH;AelnDC;EACE,2BAAA;EfonDH;AernDC;EACE,kBAAA;EfunDH;AexnDC;EACE,2BAAA;Ef0nDH;Ae3nDC;EACE,2BAAA;Ef6nDH;Ae9nDC;EACE,kBAAA;EfgoDH;AejoDC;EACE,2BAAA;EfmoDH;AepoDC;EACE,2BAAA;EfsoDH;AevoDC;EACE,kBAAA;EfyoDH;Ae1oDC;EACE,2BAAA;Ef4oDH;Ae7oDC;EACE,0BAAA;Ef+oDH;AehpDC;EACE,iBAAA;EfkpDH;AalpDD;EElCI;IACE,aAAA;IfurDH;EehrDD;IACE,aAAA;IfkrDD;EenrDD;IACE,qBAAA;IfqrDD;EetrDD;IACE,qBAAA;IfwrDD;EezrDD;IACE,YAAA;If2rDD;Ee5rDD;IACE,qBAAA;If8rDD;Ee/rDD;IACE,qBAAA;IfisDD;EelsDD;IACE,YAAA;IfosDD;EersDD;IACE,qBAAA;IfusDD;EexsDD;IACE,qBAAA;If0sDD;Ee3sDD;IACE,YAAA;If6sDD;Ee9sDD;IACE,qBAAA;IfgtDD;EejtDD;IACE,oBAAA;IfmtDD;EersDD;IACE,aAAA;IfusDD;EexsDD;IACE,qBAAA;If0sDD;Ee3sDD;IACE,qBAAA;If6sDD;Ee9sDD;IACE,YAAA;IfgtDD;EejtDD;IACE,qBAAA;IfmtDD;EeptDD;IACE,qBAAA;IfstDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,qBAAA;If4tDD;Ee7tDD;IACE,qBAAA;If+tDD;EehuDD;IACE,YAAA;IfkuDD;EenuDD;IACE,qBAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EepuDD;IACE,aAAA;IfsuDD;EetvDD;IACE,YAAA;IfwvDD;EezvDD;IACE,oBAAA;If2vDD;Ee5vDD;IACE,oBAAA;If8vDD;Ee/vDD;IACE,WAAA;IfiwDD;EelwDD;IACE,oBAAA;IfowDD;EerwDD;IACE,oBAAA;IfuwDD;EexwDD;IACE,WAAA;If0wDD;Ee3wDD;IACE,oBAAA;If6wDD;Ee9wDD;IACE,oBAAA;IfgxDD;EejxDD;IACE,WAAA;IfmxDD;EepxDD;IACE,oBAAA;IfsxDD;EevxDD;IACE,mBAAA;IfyxDD;EerxDD;IACE,YAAA;IfuxDD;EezwDD;IACE,mBAAA;If2wDD;Ee5wDD;IACE,2BAAA;If8wDD;Ee/wDD;IACE,2BAAA;IfixDD;EelxDD;IACE,kBAAA;IfoxDD;EerxDD;IACE,2BAAA;IfuxDD;EexxDD;IACE,2BAAA;If0xDD;Ee3xDD;IACE,kBAAA;If6xDD;Ee9xDD;IACE,2BAAA;IfgyDD;EejyDD;IACE,2BAAA;IfmyDD;EepyDD;IACE,kBAAA;IfsyDD;EevyDD;IACE,2BAAA;IfyyDD;Ee1yDD;IACE,0BAAA;If4yDD;Ee7yDD;IACE,iBAAA;If+yDD;EACF;AavyDD;EE3CI;IACE,aAAA;Ifq1DH;Ee90DD;IACE,aAAA;Ifg1DD;Eej1DD;IACE,qBAAA;Ifm1DD;Eep1DD;IACE,qBAAA;Ifs1DD;Eev1DD;IACE,YAAA;Ify1DD;Ee11DD;IACE,qBAAA;If41DD;Ee71DD;IACE,qBAAA;If+1DD;Eeh2DD;IACE,YAAA;Ifk2DD;Een2DD;IACE,qBAAA;Ifq2DD;Eet2DD;IACE,qBAAA;Ifw2DD;Eez2DD;IACE,YAAA;If22DD;Ee52DD;IACE,qBAAA;If82DD;Ee/2DD;IACE,oBAAA;Ifi3DD;Een2DD;IACE,aAAA;Ifq2DD;Eet2DD;IACE,qBAAA;Ifw2DD;Eez2DD;IACE,qBAAA;If22DD;Ee52DD;IACE,YAAA;If82DD;Ee/2DD;IACE,qBAAA;Ifi3DD;Eel3DD;IACE,qBAAA;Ifo3DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,qBAAA;If03DD;Ee33DD;IACE,qBAAA;If63DD;Ee93DD;IACE,YAAA;Ifg4DD;Eej4DD;IACE,qBAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eel4DD;IACE,aAAA;Ifo4DD;Eep5DD;IACE,YAAA;Ifs5DD;Eev5DD;IACE,oBAAA;Ify5DD;Ee15DD;IACE,oBAAA;If45DD;Ee75DD;IACE,WAAA;If+5DD;Eeh6DD;IACE,oBAAA;Ifk6DD;Een6DD;IACE,oBAAA;Ifq6DD;Eet6DD;IACE,WAAA;Ifw6DD;Eez6DD;IACE,oBAAA;If26DD;Ee56DD;IACE,oBAAA;If86DD;Ee/6DD;IACE,WAAA;Ifi7DD;Eel7DD;IACE,oBAAA;Ifo7DD;Eer7DD;IACE,mBAAA;Ifu7DD;Een7DD;IACE,YAAA;Ifq7DD;Eev6DD;IACE,mBAAA;Ify6DD;Ee16DD;IACE,2BAAA;If46DD;Ee76DD;IACE,2BAAA;If+6DD;Eeh7DD;IACE,kBAAA;Ifk7DD;Een7DD;IACE,2BAAA;Ifq7DD;Eet7DD;IACE,2BAAA;Ifw7DD;Eez7DD;IACE,kBAAA;If27DD;Ee57DD;IACE,2BAAA;If87DD;Ee/7DD;IACE,2BAAA;Ifi8DD;Eel8DD;IACE,kBAAA;Ifo8DD;Eer8DD;IACE,2BAAA;Ifu8DD;Eex8DD;IACE,0BAAA;If08DD;Ee38DD;IACE,iBAAA;If68DD;EACF;Aal8DD;EE9CI;IACE,aAAA;Ifm/DH;Ee5+DD;IACE,aAAA;If8+DD;Ee/+DD;IACE,qBAAA;Ifi/DD;Eel/DD;IACE,qBAAA;Ifo/DD;Eer/DD;IACE,YAAA;Ifu/DD;Eex/DD;IACE,qBAAA;If0/DD;Ee3/DD;IACE,qBAAA;If6/DD;Ee9/DD;IACE,YAAA;IfggED;EejgED;IACE,qBAAA;IfmgED;EepgED;IACE,qBAAA;IfsgED;EevgED;IACE,YAAA;IfygED;Ee1gED;IACE,qBAAA;If4gED;Ee7gED;IACE,oBAAA;If+gED;EejgED;IACE,aAAA;IfmgED;EepgED;IACE,qBAAA;IfsgED;EevgED;IACE,qBAAA;IfygED;Ee1gED;IACE,YAAA;If4gED;Ee7gED;IACE,qBAAA;If+gED;EehhED;IACE,qBAAA;IfkhED;EenhED;IACE,YAAA;IfqhED;EethED;IACE,qBAAA;IfwhED;EezhED;IACE,qBAAA;If2hED;Ee5hED;IACE,YAAA;If8hED;Ee/hED;IACE,qBAAA;IfiiED;EeliED;IACE,oBAAA;IfoiED;EehiED;IACE,aAAA;IfkiED;EeljED;IACE,YAAA;IfojED;EerjED;IACE,oBAAA;IfujED;EexjED;IACE,oBAAA;If0jED;Ee3jED;IACE,WAAA;If6jED;Ee9jED;IACE,oBAAA;IfgkED;EejkED;IACE,oBAAA;IfmkED;EepkED;IACE,WAAA;IfskED;EevkED;IACE,oBAAA;IfykED;Ee1kED;IACE,oBAAA;If4kED;Ee7kED;IACE,WAAA;If+kED;EehlED;IACE,oBAAA;IfklED;EenlED;IACE,mBAAA;IfqlED;EejlED;IACE,YAAA;IfmlED;EerkED;IACE,mBAAA;IfukED;EexkED;IACE,2BAAA;If0kED;Ee3kED;IACE,2BAAA;If6kED;Ee9kED;IACE,kBAAA;IfglED;EejlED;IACE,2BAAA;IfmlED;EeplED;IACE,2BAAA;IfslED;EevlED;IACE,kBAAA;IfylED;Ee1lED;IACE,2BAAA;If4lED;Ee7lED;IACE,2BAAA;If+lED;EehmED;IACE,kBAAA;IfkmED;EenmED;IACE,2BAAA;IfqmED;EetmED;IACE,0BAAA;IfwmED;EezmED;IACE,iBAAA;If2mED;EACF;AgB/qED;EACE,+BAAA;EhBirED;AgB/qED;EACE,kBAAA;EACA,qBAAA;EACA,gBAAA;EACA,kBAAA;EhBirED;AgB/qED;EACE,kBAAA;EhBirED;AgB3qED;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhB6qED;AgBhrED;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhB6qEP;AgB3rED;EAoBI,wBAAA;EACA,kCAAA;EhB0qEH;AgB/rED;;;;;;EA8BQ,eAAA;EhByqEP;AgBvsED;EAoCI,+BAAA;EhBsqEH;AgB1sED;EAyCI,2BAAA;EhBoqEH;AgB7pED;;;;;;EAOQ,cAAA;EhB8pEP;AgBnpED;EACE,2BAAA;EhBqpED;AgBtpED;;;;;;EAQQ,2BAAA;EhBspEP;AgB9pED;;EAeM,0BAAA;EhBmpEL;AgBzoED;EAEI,2BAAA;EhB0oEH;AgBjoED;EAEI,2BAAA;EhBkoEH;AgBznED;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB2nED;AgBtnEG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhBynEL;AiBrwEC;;;;;;;;;;;;EAOI,2BAAA;EjB4wEL;AiBtwEC;;;;;EAMI,2BAAA;EjBuwEL;AiB1xEC;;;;;;;;;;;;EAOI,2BAAA;EjBiyEL;AiB3xEC;;;;;EAMI,2BAAA;EjB4xEL;AiB/yEC;;;;;;;;;;;;EAOI,2BAAA;EjBszEL;AiBhzEC;;;;;EAMI,2BAAA;EjBizEL;AiBp0EC;;;;;;;;;;;;EAOI,2BAAA;EjB20EL;AiBr0EC;;;;;EAMI,2BAAA;EjBs0EL;AiBz1EC;;;;;;;;;;;;EAOI,2BAAA;EjBg2EL;AiB11EC;;;;;EAMI,2BAAA;EjB21EL;AgBzsED;EACE,kBAAA;EACA,mBAAA;EhB2sED;AgB9oED;EAAA;IA1DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,8CAAA;IACA,2BAAA;IhB4sED;EgBtpEH;IAlDM,kBAAA;IhB2sEH;EgBzpEH;;;;;;IAzCY,qBAAA;IhB0sET;EgBjqEH;IAjCM,WAAA;IhBqsEH;EgBpqEH;;;;;;IAxBY,gBAAA;IhBosET;EgB5qEH;;;;;;IApBY,iBAAA;IhBwsET;EgBprEH;;;;IAPY,kBAAA;IhBisET;EACF;AkB35ED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB05ED;AkBv5ED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElBy5ED;AkBt5ED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElBw5ED;AkB74ED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELo3ET;AkB74ED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElB+4ED;AkB34ED;EACE,gBAAA;ElB64ED;AkBz4ED;EACE,gBAAA;EACA,aAAA;ElB24ED;AkBv4ED;;EAEE,cAAA;ElBy4ED;AkBr4ED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENi9ED;AkBr4ED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElBu4ED;AkB72ED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAyHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELizET;AmBz7EC;EACE,uBAAA;EACA,YAAA;EdUF,wFAAA;EACQ,gFAAA;ELk7ET;AKj5EC;EACE,gBAAA;EACA,YAAA;ELm5EH;AKj5EC;EAA0B,gBAAA;ELo5E3B;AKn5EC;EAAgC,gBAAA;ELs5EjC;AkBr3EC;;;EAGE,2BAAA;EACA,YAAA;ElBu3EH;AkBp3EC;;EAEE,qBAAA;ElBs3EH;AkBl3EC;EACE,cAAA;ElBo3EH;AkBx2ED;EACE,0BAAA;ElB02ED;AkBt0ED;EAxBE;;;;IAIE,mBAAA;IlBi2ED;EkB/1EC;;;;;;;;IAEE,mBAAA;IlBu2EH;EkBp2EC;;;;;;;;IAEE,mBAAA;IlB42EH;EACF;AkBl2ED;EACE,qBAAA;ElBo2ED;AkB51ED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;ElB81ED;AkBn2ED;;EAQI,kBAAA;EACA,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElB+1EH;AkB51ED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElB81ED;AkB31ED;;EAEE,kBAAA;ElB61ED;AkBz1ED;;EAEE,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElB21ED;AkBz1ED;;EAEE,eAAA;EACA,mBAAA;ElB21ED;AkBl1EC;;;;;;EAGE,qBAAA;ElBu1EH;AkBj1EC;;;;EAEE,qBAAA;ElBq1EH;AkB/0EC;;;;EAGI,qBAAA;ElBk1EL;AkBv0ED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;EACA,kBAAA;ElBu0ED;AkBr0EC;;EAEE,iBAAA;EACA,kBAAA;ElBu0EH;AkB1zED;EC1PE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBujFD;AmBrjFC;EACE,cAAA;EACA,mBAAA;EnBujFH;AmBpjFC;;EAEE,cAAA;EnBsjFH;AkBt0ED;EC7PE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBskFD;AmBpkFC;EACE,cAAA;EACA,mBAAA;EnBskFH;AmBnkFC;;EAEE,cAAA;EnBqkFH;AkBr1ED;EAKI,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ElBm1EH;AkB/0ED;EC1QE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnB4lFD;AmB1lFC;EACE,cAAA;EACA,mBAAA;EnB4lFH;AmBzlFC;;EAEE,cAAA;EnB2lFH;AkB31ED;EC7QE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnB2mFD;AmBzmFC;EACE,cAAA;EACA,mBAAA;EnB2mFH;AmBxmFC;;EAEE,cAAA;EnB0mFH;AkB12ED;EAKI,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,kBAAA;ElBw2EH;AkB/1ED;EAEE,oBAAA;ElBg2ED;AkBl2ED;EAMI,uBAAA;ElB+1EH;AkB31ED;EACE,oBAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;EACA,sBAAA;ElB61ED;AkB31ED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB61ED;AkB31ED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB61ED;AkBz1ED;;;;;;;;;;ECrXI,gBAAA;EnB0tFH;AkBr2ED;ECjXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL2qFT;AmBztFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;ELgrFT;AkB/2ED;ECvWI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBytFH;AkBp3ED;ECjWI,gBAAA;EnBwtFH;AkBp3ED;;;;;;;;;;ECxXI,gBAAA;EnBwvFH;AkBh4ED;ECpXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELysFT;AmBvvFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL8sFT;AkB14ED;EC1WI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBuvFH;AkB/4ED;ECpWI,gBAAA;EnBsvFH;AkB/4ED;;;;;;;;;;EC3XI,gBAAA;EnBsxFH;AkB35ED;ECvXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELuuFT;AmBrxFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL4uFT;AkBr6ED;EC7WI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBqxFH;AkB16ED;ECvWI,gBAAA;EnBoxFH;AkBt6EC;EACG,WAAA;ElBw6EJ;AkBt6EC;EACG,QAAA;ElBw6EJ;AkB95ED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElBg6ED;AkB70ED;EAAA;IA9DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB+4EH;EkBn1EH;IAvDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB64EH;EkBx1EH;IAhDM,uBAAA;IlB24EH;EkB31EH;IA5CM,uBAAA;IACA,wBAAA;IlB04EH;EkB/1EH;;;IAtCQ,aAAA;IlB04EL;EkBp2EH;IAhCM,aAAA;IlBu4EH;EkBv2EH;IA5BM,kBAAA;IACA,wBAAA;IlBs4EH;EkB32EH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBm4EH;EkBl3EH;;IAdQ,iBAAA;IlBo4EL;EkBt3EH;;IATM,oBAAA;IACA,gBAAA;IlBm4EH;EkB33EH;IAHM,QAAA;IlBi4EH;EACF;AkBv3ED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBo3EH;AkB/3ED;;EAiBI,kBAAA;ElBk3EH;AkBn4ED;EJjfE,oBAAA;EACA,qBAAA;Edu3FD;AkBh2EC;EAAA;IAVI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB82EH;EACF;AkB94ED;EAwCI,aAAA;ElBy2EH;AkB51EC;EAAA;IAHM,0BAAA;IlBm2EL;EACF;AkB11EC;EAAA;IAHM,kBAAA;IlBi2EL;EACF;AoBn5FD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,gCAAA;MAAA,4BAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC6BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB4KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;EL8sFT;AoBt5FG;;;;;;EdrBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENk7FD;AoB15FC;;;EAGE,gBAAA;EACA,uBAAA;EpB45FH;AoBz5FC;;EAEE,YAAA;EACA,wBAAA;Ef2BF,0DAAA;EACQ,kDAAA;ELi4FT;AoBz5FC;;;EAGE,qBAAA;EACA,sBAAA;EE9CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL24FT;AoBr5FD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB68FD;AqB38FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB68FP;AqB38FC;;;EAGE,wBAAA;ErB68FH;AqBx8FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBs9FT;AoB97FD;ECnBI,gBAAA;EACA,2BAAA;ErBo9FH;AoB/7FD;ECxDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB0/FD;AqBx/FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB0/FP;AqBx/FC;;;EAGE,wBAAA;ErB0/FH;AqBr/FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBmgGT;AoBx+FD;ECtBI,gBAAA;EACA,2BAAA;ErBigGH;AoBx+FD;EC5DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuiGD;AqBriGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuiGP;AqBriGC;;;EAGE,wBAAA;ErBuiGH;AqBliGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBgjGT;AoBjhGD;EC1BI,gBAAA;EACA,2BAAA;ErB8iGH;AoBjhGD;EChEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBolGD;AqBllGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBolGP;AqBllGC;;;EAGE,wBAAA;ErBolGH;AqB/kGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB6lGT;AoB1jGD;EC9BI,gBAAA;EACA,2BAAA;ErB2lGH;AoB1jGD;ECpEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBioGD;AqB/nGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBioGP;AqB/nGC;;;EAGE,wBAAA;ErBioGH;AqB5nGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB0oGT;AoBnmGD;EClCI,gBAAA;EACA,2BAAA;ErBwoGH;AoBnmGD;ECxEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB8qGD;AqB5qGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB8qGP;AqB5qGC;;;EAGE,wBAAA;ErB8qGH;AqBzqGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBurGT;AoB5oGD;ECtCI,gBAAA;EACA,2BAAA;ErBqrGH;AoBvoGD;EACE,gBAAA;EACA,qBAAA;EACA,kBAAA;EpByoGD;AoBvoGC;;;;;EAKE,+BAAA;Ef7BF,0BAAA;EACQ,kBAAA;ELuqGT;AoBxoGC;;;;EAIE,2BAAA;EpB0oGH;AoBxoGC;;EAEE,gBAAA;EACA,4BAAA;EACA,+BAAA;EpB0oGH;AoBtoGG;;;;EAEE,gBAAA;EACA,uBAAA;EpB0oGL;AoBjoGD;;EC/EE,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;ErBotGD;AoBpoGD;;ECnFE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErB2tGD;AoBvoGD;;ECvFE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErBkuGD;AoBtoGD;EACE,gBAAA;EACA,aAAA;EpBwoGD;AoBpoGD;EACE,iBAAA;EpBsoGD;AoB/nGC;;;EACE,aAAA;EpBmoGH;AuBvxGD;EACE,YAAA;ElBoLA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELsmGT;AuB1xGC;EACE,YAAA;EvB4xGH;AuBxxGD;EACE,eAAA;EvB0xGD;AuBxxGC;EAAY,gBAAA;EvB2xGb;AuB1xGC;EAAY,oBAAA;EvB6xGb;AuB5xGC;EAAY,0BAAA;EvB+xGb;AuB5xGD;EACE,oBAAA;EACA,WAAA;EACA,kBAAA;ElBuKA,iDAAA;EACQ,4CAAA;KAAA,yCAAA;EAOR,oCAAA;EACQ,+BAAA;KAAA,4BAAA;EAGR,0CAAA;EACQ,qCAAA;KAAA,kCAAA;ELgnGT;AwB1zGD;EACE,uBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,wBAAA;EACA,wBAAA;EACA,qCAAA;EACA,oCAAA;ExB4zGD;AwBxzGD;;EAEE,oBAAA;ExB0zGD;AwBtzGD;EACE,YAAA;ExBwzGD;AwBpzGD;EACE,oBAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,2BAAA;EACA,uCAAA;EACA,oBAAA;EnBuBA,qDAAA;EACQ,6CAAA;EmBtBR,sCAAA;UAAA,8BAAA;ExBuzGD;AwBlzGC;EACE,UAAA;EACA,YAAA;ExBozGH;AwB70GD;ECxBE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzBw2GD;AwBn1GD;EAmCI,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBmzGH;AwB7yGC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;ExB+yGH;AwBzyGC;;;EAGE,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,2BAAA;ExB2yGH;AwBlyGC;;;EAGE,gBAAA;ExBoyGH;AwBhyGC;;EAEE,uBAAA;EACA,+BAAA;EACA,wBAAA;EE1GF,qEAAA;EF4GE,qBAAA;ExBkyGH;AwB7xGD;EAGI,gBAAA;ExB6xGH;AwBhyGD;EAQI,YAAA;ExB2xGH;AwBnxGD;EACE,YAAA;EACA,UAAA;ExBqxGD;AwB7wGD;EACE,SAAA;EACA,aAAA;ExB+wGD;AwB3wGD;EACE,gBAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExB6wGD;AwBzwGD;EACE,iBAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,cAAA;ExB2wGD;AwBvwGD;EACE,UAAA;EACA,YAAA;ExBywGD;AwBjwGD;;EAII,eAAA;EACA,0BAAA;EACA,aAAA;ExBiwGH;AwBvwGD;;EAUI,WAAA;EACA,cAAA;EACA,oBAAA;ExBiwGH;AwB5uGD;EAXE;IAnEA,YAAA;IACA,UAAA;IxB8zGC;EwB5vGD;IAzDA,SAAA;IACA,aAAA;IxBwzGC;EACF;A2Bv8GD;;EAEE,oBAAA;EACA,uBAAA;EACA,wBAAA;E3By8GD;A2B78GD;;EAMI,oBAAA;EACA,aAAA;E3B28GH;A2Bz8GG;;;;;;;;EAIE,YAAA;E3B+8GL;A2Bz8GD;;;;EAKI,mBAAA;E3B08GH;A2Br8GD;EACE,mBAAA;E3Bu8GD;A2Bx8GD;;EAMI,aAAA;E3Bs8GH;A2B58GD;;;EAWI,kBAAA;E3Bs8GH;A2Bl8GD;EACE,kBAAA;E3Bo8GD;A2Bh8GD;EACE,gBAAA;E3Bk8GD;A2Bj8GC;ECjDA,+BAAA;EACG,4BAAA;E5Bq/GJ;A2Bh8GD;;EC9CE,8BAAA;EACG,2BAAA;E5Bk/GJ;A2B/7GD;EACE,aAAA;E3Bi8GD;A2B/7GD;EACE,kBAAA;E3Bi8GD;A2B/7GD;;EClEE,+BAAA;EACG,4BAAA;E5BqgHJ;A2B97GD;EChEE,8BAAA;EACG,2BAAA;E5BigHJ;A2B77GD;;EAEE,YAAA;E3B+7GD;A2B96GD;EACE,mBAAA;EACA,oBAAA;E3Bg7GD;A2B96GD;EACE,oBAAA;EACA,qBAAA;E3Bg7GD;A2B36GD;EtB9CE,0DAAA;EACQ,kDAAA;EL49GT;A2B36GC;EtBlDA,0BAAA;EACQ,kBAAA;ELg+GT;A2Bx6GD;EACE,gBAAA;E3B06GD;A2Bv6GD;EACE,yBAAA;EACA,wBAAA;E3By6GD;A2Bt6GD;EACE,yBAAA;E3Bw6GD;A2Bj6GD;;;EAII,gBAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;E3Bk6GH;A2Bz6GD;EAcM,aAAA;E3B85GL;A2B56GD;;;;EAsBI,kBAAA;EACA,gBAAA;E3B45GH;A2Bv5GC;EACE,kBAAA;E3By5GH;A2Bv5GC;EACE,8BAAA;ECnKF,+BAAA;EACC,8BAAA;E5B6jHF;A2Bx5GC;EACE,gCAAA;EC/KF,4BAAA;EACC,2BAAA;E5B0kHF;A2Bx5GD;EACE,kBAAA;E3B05GD;A2Bx5GD;;EC9KE,+BAAA;EACC,8BAAA;E5B0kHF;A2Bv5GD;EC5LE,4BAAA;EACC,2BAAA;E5BslHF;A2Bn5GD;EACE,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;E3Bq5GD;A2Bz5GD;;EAOI,aAAA;EACA,qBAAA;EACA,WAAA;E3Bs5GH;A2B/5GD;EAYI,aAAA;E3Bs5GH;A2Bl6GD;EAgBI,YAAA;E3Bq5GH;A2Bp4GD;;;;EAKM,oBAAA;EACA,wBAAA;EACA,sBAAA;E3Bq4GL;A6B9mHD;EACE,oBAAA;EACA,gBAAA;EACA,2BAAA;E7BgnHD;A6B7mHC;EACE,aAAA;EACA,iBAAA;EACA,kBAAA;E7B+mHH;A6BxnHD;EAeI,oBAAA;EACA,YAAA;EAKA,aAAA;EAEA,aAAA;EACA,kBAAA;E7BumHH;A6B9lHD;;;EV8BE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnBqkHD;AmBnkHC;;;EACE,cAAA;EACA,mBAAA;EnBukHH;AmBpkHC;;;;;;EAEE,cAAA;EnB0kHH;A6BhnHD;;;EVyBE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB4lHD;AmB1lHC;;;EACE,cAAA;EACA,mBAAA;EnB8lHH;AmB3lHC;;;;;;EAEE,cAAA;EnBimHH;A6B9nHD;;;EAGE,qBAAA;E7BgoHD;A6B9nHC;;;EACE,kBAAA;E7BkoHH;A6B9nHD;;EAEE,WAAA;EACA,qBAAA;EACA,wBAAA;E7BgoHD;A6B3nHD;EACE,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;E7B6nHD;A6B1nHC;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;E7B4nHH;A6B1nHC;EACE,oBAAA;EACA,iBAAA;EACA,oBAAA;E7B4nHH;A6BhpHD;;EA0BI,eAAA;E7B0nHH;A6BrnHD;;;;;;;EDhGE,+BAAA;EACG,4BAAA;E5B8tHJ;A6BtnHD;EACE,iBAAA;E7BwnHD;A6BtnHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;E5BmuHJ;A6BvnHD;EACE,gBAAA;E7BynHD;A6BpnHD;EACE,oBAAA;EAGA,cAAA;EACA,qBAAA;E7BonHD;A6BznHD;EAUI,oBAAA;E7BknHH;A6B5nHD;EAYM,mBAAA;E7BmnHL;A6BhnHG;;;EAGE,YAAA;E7BknHL;A6B7mHC;;EAGI,oBAAA;E7B8mHL;A6B3mHC;;EAGI,mBAAA;E7B4mHL;A8BtwHD;EACE,kBAAA;EACA,iBAAA;EACA,kBAAA;E9BwwHD;A8B3wHD;EAOI,oBAAA;EACA,gBAAA;E9BuwHH;A8B/wHD;EAWM,oBAAA;EACA,gBAAA;EACA,oBAAA;E9BuwHL;A8BtwHK;;EAEE,uBAAA;EACA,2BAAA;E9BwwHP;A8BnwHG;EACE,gBAAA;E9BqwHL;A8BnwHK;;EAEE,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,qBAAA;E9BqwHP;A8B9vHG;;;EAGE,2BAAA;EACA,uBAAA;E9BgwHL;A8BzyHD;ELHE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzB+yHD;A8B/yHD;EA0DI,iBAAA;E9BwvHH;A8B/uHD;EACE,kCAAA;E9BivHD;A8BlvHD;EAGI,aAAA;EAEA,qBAAA;E9BivHH;A8BtvHD;EASM,mBAAA;EACA,yBAAA;EACA,+BAAA;EACA,4BAAA;E9BgvHL;A8B/uHK;EACE,uCAAA;E9BivHP;A8B3uHK;;;EAGE,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,kCAAA;EACA,iBAAA;E9B6uHP;A8BxuHC;EAqDA,aAAA;EA8BA,kBAAA;E9BypHD;A8B5uHC;EAwDE,aAAA;E9BurHH;A8B/uHC;EA0DI,oBAAA;EACA,oBAAA;E9BwrHL;A8BnvHC;EAgEE,WAAA;EACA,YAAA;E9BsrHH;A8B1qHD;EAAA;IAPM,qBAAA;IACA,WAAA;I9BqrHH;E8B/qHH;IAJQ,kBAAA;I9BsrHL;EACF;A8BhwHC;EAuFE,iBAAA;EACA,oBAAA;E9B4qHH;A8BpwHC;;;EA8FE,2BAAA;E9B2qHH;A8B7pHD;EAAA;IATM,kCAAA;IACA,4BAAA;I9B0qHH;E8BlqHH;;;IAHM,8BAAA;I9B0qHH;EACF;A8B3wHD;EAEI,aAAA;E9B4wHH;A8B9wHD;EAMM,oBAAA;E9B2wHL;A8BjxHD;EASM,kBAAA;E9B2wHL;A8BtwHK;;;EAGE,gBAAA;EACA,2BAAA;E9BwwHP;A8BhwHD;EAEI,aAAA;E9BiwHH;A8BnwHD;EAIM,iBAAA;EACA,gBAAA;E9BkwHL;A8BtvHD;EACE,aAAA;E9BwvHD;A8BzvHD;EAII,aAAA;E9BwvHH;A8B5vHD;EAMM,oBAAA;EACA,oBAAA;E9ByvHL;A8BhwHD;EAYI,WAAA;EACA,YAAA;E9BuvHH;A8B3uHD;EAAA;IAPM,qBAAA;IACA,WAAA;I9BsvHH;E8BhvHH;IAJQ,kBAAA;I9BuvHL;EACF;A8B/uHD;EACE,kBAAA;E9BivHD;A8BlvHD;EAKI,iBAAA;EACA,oBAAA;E9BgvHH;A8BtvHD;;;EAYI,2BAAA;E9B+uHH;A8BjuHD;EAAA;IATM,kCAAA;IACA,4BAAA;I9B8uHH;E8BtuHH;;;IAHM,8BAAA;I9B8uHH;EACF;A8BruHD;EAEI,eAAA;E9BsuHH;A8BxuHD;EAKI,gBAAA;E9BsuHH;A8B7tHD;EAEE,kBAAA;EF3OA,4BAAA;EACC,2BAAA;E5B08HF;A+Bp8HD;EACE,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;E/Bs8HD;A+B97HD;EAAA;IAFI,oBAAA;I/Bo8HD;EACF;A+Br7HD;EAAA;IAFI,aAAA;I/B27HD;EACF;A+B76HD;EACE,qBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,4DAAA;UAAA,oDAAA;EAEA,mCAAA;E/B86HD;A+B56HC;EACE,kBAAA;E/B86HH;A+Bl5HD;EAAA;IAxBI,aAAA;IACA,eAAA;IACA,0BAAA;YAAA,kBAAA;I/B86HD;E+B56HC;IACE,2BAAA;IACA,yBAAA;IACA,mBAAA;IACA,8BAAA;I/B86HH;E+B36HC;IACE,qBAAA;I/B66HH;E+Bx6HC;;;IAGE,iBAAA;IACA,kBAAA;I/B06HH;EACF;A+Bt6HD;;EAGI,mBAAA;E/Bu6HH;A+Bl6HC;EAAA;;IAFI,mBAAA;I/By6HH;EACF;A+Bh6HD;;;;EAII,qBAAA;EACA,oBAAA;E/Bk6HH;A+B55HC;EAAA;;;;IAHI,iBAAA;IACA,gBAAA;I/Bs6HH;EACF;A+B15HD;EACE,eAAA;EACA,uBAAA;E/B45HD;A+Bv5HD;EAAA;IAFI,kBAAA;I/B65HD;EACF;A+Bz5HD;;EAEE,iBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;E/B25HD;A+Br5HD;EAAA;;IAFI,kBAAA;I/B45HD;EACF;A+B15HD;EACE,QAAA;EACA,uBAAA;E/B45HD;A+B15HD;EACE,WAAA;EACA,kBAAA;EACA,uBAAA;E/B45HD;A+Bt5HD;EACE,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,cAAA;E/Bw5HD;A+Bt5HC;;EAEE,uBAAA;E/Bw5HH;A+Bj6HD;EAaI,gBAAA;E/Bu5HH;A+B94HD;EALI;;IAEE,oBAAA;I/Bs5HH;EACF;A+B54HD;EACE,oBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EC9LA,iBAAA;EACA,oBAAA;ED+LA,+BAAA;EACA,wBAAA;EACA,+BAAA;EACA,oBAAA;E/B+4HD;A+B34HC;EACE,YAAA;E/B64HH;A+B35HD;EAmBI,gBAAA;EACA,aAAA;EACA,aAAA;EACA,oBAAA;E/B24HH;A+Bj6HD;EAyBI,iBAAA;E/B24HH;A+Br4HD;EAAA;IAFI,eAAA;I/B24HD;EACF;A+Bl4HD;EACE,qBAAA;E/Bo4HD;A+Br4HD;EAII,mBAAA;EACA,sBAAA;EACA,mBAAA;E/Bo4HH;A+Bx2HC;EAAA;IAtBI,kBAAA;IACA,aAAA;IACA,aAAA;IACA,eAAA;IACA,+BAAA;IACA,WAAA;IACA,0BAAA;YAAA,kBAAA;I/Bk4HH;E+Bl3HD;;IAbM,4BAAA;I/Bm4HL;E+Bt3HD;IAVM,mBAAA;I/Bm4HL;E+Bl4HK;;IAEE,wBAAA;I/Bo4HP;EACF;A+Bl3HD;EAAA;IAXI,aAAA;IACA,WAAA;I/Bi4HD;E+Bv3HH;IAPM,aAAA;I/Bi4HH;E+B13HH;IALQ,mBAAA;IACA,sBAAA;I/Bk4HL;EACF;A+Bv3HD;EACE,oBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,sCAAA;E1B9NA,8FAAA;EACQ,sFAAA;E2B/DR,iBAAA;EACA,oBAAA;EhCwpID;AkBvqHD;EAAA;IA9DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlByuHH;EkB7qHH;IAvDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlBuuHH;EkBlrHH;IAhDM,uBAAA;IlBquHH;EkBrrHH;IA5CM,uBAAA;IACA,wBAAA;IlBouHH;EkBzrHH;;;IAtCQ,aAAA;IlBouHL;EkB9rHH;IAhCM,aAAA;IlBiuHH;EkBjsHH;IA5BM,kBAAA;IACA,wBAAA;IlBguHH;EkBrsHH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlB6tHH;EkB5sHH;;IAdQ,iBAAA;IlB8tHL;EkBhtHH;;IATM,oBAAA;IACA,gBAAA;IlB6tHH;EkBrtHH;IAHM,QAAA;IlB2tHH;EACF;A+Bh6HC;EAAA;IANI,oBAAA;I/B06HH;E+Bx6HG;IACE,kBAAA;I/B06HL;EACF;A+Bz5HD;EAAA;IARI,aAAA;IACA,WAAA;IACA,gBAAA;IACA,iBAAA;IACA,gBAAA;IACA,mBAAA;I1BzPF,0BAAA;IACQ,kBAAA;IL+pIP;EACF;A+B/5HD;EACE,eAAA;EHpUA,4BAAA;EACC,2BAAA;E5BsuIF;A+B/5HD;EACE,kBAAA;EHzUA,8BAAA;EACC,6BAAA;EAOD,+BAAA;EACC,8BAAA;E5BquIF;A+B35HD;EChVE,iBAAA;EACA,oBAAA;EhC8uID;A+B55HC;ECnVA,kBAAA;EACA,qBAAA;EhCkvID;A+B75HC;ECtVA,kBAAA;EACA,qBAAA;EhCsvID;A+Bv5HD;EChWE,kBAAA;EACA,qBAAA;EhC0vID;A+Bn5HD;EAAA;IAJI,aAAA;IACA,mBAAA;IACA,oBAAA;I/B25HD;EACF;A+B93HD;EAhBE;IExWA,wBAAA;IjC0vIC;E+Bj5HD;IE5WA,yBAAA;IF8WE,qBAAA;I/Bm5HD;E+Br5HD;IAKI,iBAAA;I/Bm5HH;EACF;A+B14HD;EACE,2BAAA;EACA,uBAAA;E/B44HD;A+B94HD;EAKI,gBAAA;E/B44HH;A+B34HG;;EAEE,gBAAA;EACA,+BAAA;E/B64HL;A+Bt5HD;EAcI,gBAAA;E/B24HH;A+Bz5HD;EAmBM,gBAAA;E/By4HL;A+Bv4HK;;EAEE,gBAAA;EACA,+BAAA;E/By4HP;A+Br4HK;;;EAGE,gBAAA;EACA,2BAAA;E/Bu4HP;A+Bn4HK;;;EAGE,gBAAA;EACA,+BAAA;E/Bq4HP;A+B76HD;EA8CI,uBAAA;E/Bk4HH;A+Bj4HG;;EAEE,2BAAA;E/Bm4HL;A+Bp7HD;EAoDM,2BAAA;E/Bm4HL;A+Bv7HD;;EA0DI,uBAAA;E/Bi4HH;A+B13HK;;;EAGE,2BAAA;EACA,gBAAA;E/B43HP;A+B31HC;EAAA;IAzBQ,gBAAA;I/Bw3HP;E+Bv3HO;;IAEE,gBAAA;IACA,+BAAA;I/By3HT;E+Br3HO;;;IAGE,gBAAA;IACA,2BAAA;I/Bu3HT;E+Bn3HO;;;IAGE,gBAAA;IACA,+BAAA;I/Bq3HT;EACF;A+Bv9HD;EA8GI,gBAAA;E/B42HH;A+B32HG;EACE,gBAAA;E/B62HL;A+B79HD;EAqHI,gBAAA;E/B22HH;A+B12HG;;EAEE,gBAAA;E/B42HL;A+Bx2HK;;;;EAEE,gBAAA;E/B42HP;A+Bp2HD;EACE,2BAAA;EACA,uBAAA;E/Bs2HD;A+Bx2HD;EAKI,gBAAA;E/Bs2HH;A+Br2HG;;EAEE,gBAAA;EACA,+BAAA;E/Bu2HL;A+Bh3HD;EAcI,gBAAA;E/Bq2HH;A+Bn3HD;EAmBM,gBAAA;E/Bm2HL;A+Bj2HK;;EAEE,gBAAA;EACA,+BAAA;E/Bm2HP;A+B/1HK;;;EAGE,gBAAA;EACA,2BAAA;E/Bi2HP;A+B71HK;;;EAGE,gBAAA;EACA,+BAAA;E/B+1HP;A+Bv4HD;EA+CI,uBAAA;E/B21HH;A+B11HG;;EAEE,2BAAA;E/B41HL;A+B94HD;EAqDM,2BAAA;E/B41HL;A+Bj5HD;;EA2DI,uBAAA;E/B01HH;A+Bp1HK;;;EAGE,2BAAA;EACA,gBAAA;E/Bs1HP;A+B/yHC;EAAA;IA/BQ,uBAAA;I/Bk1HP;E+BnzHD;IA5BQ,2BAAA;I/Bk1HP;E+BtzHD;IAzBQ,gBAAA;I/Bk1HP;E+Bj1HO;;IAEE,gBAAA;IACA,+BAAA;I/Bm1HT;E+B/0HO;;;IAGE,gBAAA;IACA,2BAAA;I/Bi1HT;E+B70HO;;;IAGE,gBAAA;IACA,+BAAA;I/B+0HT;EACF;A+Bv7HD;EA+GI,gBAAA;E/B20HH;A+B10HG;EACE,gBAAA;E/B40HL;A+B77HD;EAsHI,gBAAA;E/B00HH;A+Bz0HG;;EAEE,gBAAA;E/B20HL;A+Bv0HK;;;;EAEE,gBAAA;E/B20HP;AkCr9ID;EACE,mBAAA;EACA,qBAAA;EACA,kBAAA;EACA,2BAAA;EACA,oBAAA;ElCu9ID;AkC59ID;EAQI,uBAAA;ElCu9IH;AkC/9ID;EAWM,mBAAA;EACA,gBAAA;EACA,gBAAA;ElCu9IL;AkCp+ID;EAkBI,gBAAA;ElCq9IH;AmCz+ID;EACE,uBAAA;EACA,iBAAA;EACA,gBAAA;EACA,oBAAA;EnC2+ID;AmC/+ID;EAOI,iBAAA;EnC2+IH;AmCl/ID;;EAUM,oBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,mBAAA;EnC4+IL;AmC1+IG;;EAGI,gBAAA;EPXN,gCAAA;EACG,6BAAA;E5Bu/IJ;AmCz+IG;;EPvBF,iCAAA;EACG,8BAAA;E5BogJJ;AmCp+IG;;;;EAEE,gBAAA;EACA,2BAAA;EACA,uBAAA;EnCw+IL;AmCl+IG;;;;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,iBAAA;EnCu+IL;AmC7hJD;;;;;;EAiEM,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,qBAAA;EnCo+IL;AmC39ID;;EC1EM,oBAAA;EACA,iBAAA;EpCyiJL;AoCviJG;;ERMF,gCAAA;EACG,6BAAA;E5BqiJJ;AoCtiJG;;ERRF,iCAAA;EACG,8BAAA;E5BkjJJ;AmCr+ID;;EC/EM,mBAAA;EACA,iBAAA;EpCwjJL;AoCtjJG;;ERMF,gCAAA;EACG,6BAAA;E5BojJJ;AoCrjJG;;ERRF,iCAAA;EACG,8BAAA;E5BikJJ;AqCpkJD;EACE,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,oBAAA;ErCskJD;AqC1kJD;EAOI,iBAAA;ErCskJH;AqC7kJD;;EAUM,uBAAA;EACA,mBAAA;EACA,2BAAA;EACA,2BAAA;EACA,qBAAA;ErCukJL;AqCrlJD;;EAmBM,uBAAA;EACA,2BAAA;ErCskJL;AqC1lJD;;EA2BM,cAAA;ErCmkJL;AqC9lJD;;EAkCM,aAAA;ErCgkJL;AqClmJD;;;;EA2CM,gBAAA;EACA,2BAAA;EACA,qBAAA;ErC6jJL;AsC3mJD;EACE,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sBAAA;EtC6mJD;AsCzmJG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EtC2mJL;AsCtmJC;EACE,eAAA;EtCwmJH;AsCpmJC;EACE,oBAAA;EACA,WAAA;EtCsmJH;AsC/lJD;ECtCE,2BAAA;EvCwoJD;AuCroJG;;EAEE,2BAAA;EvCuoJL;AsClmJD;EC1CE,2BAAA;EvC+oJD;AuC5oJG;;EAEE,2BAAA;EvC8oJL;AsCrmJD;EC9CE,2BAAA;EvCspJD;AuCnpJG;;EAEE,2BAAA;EvCqpJL;AsCxmJD;EClDE,2BAAA;EvC6pJD;AuC1pJG;;EAEE,2BAAA;EvC4pJL;AsC3mJD;ECtDE,2BAAA;EvCoqJD;AuCjqJG;;EAEE,2BAAA;EvCmqJL;AsC9mJD;EC1DE,2BAAA;EvC2qJD;AuCxqJG;;EAEE,2BAAA;EvC0qJL;AwC5qJD;EACE,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;EACA,oBAAA;EACA,2BAAA;EACA,qBAAA;ExC8qJD;AwC3qJC;EACE,eAAA;ExC6qJH;AwCzqJC;EACE,oBAAA;EACA,WAAA;ExC2qJH;AwCxqJC;;EAEE,QAAA;EACA,kBAAA;ExC0qJH;AwCrqJG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;ExCuqJL;AwClqJC;;EAEE,gBAAA;EACA,2BAAA;ExCoqJH;AwCjqJC;EACE,cAAA;ExCmqJH;AwChqJC;EACE,mBAAA;ExCkqJH;AwC/pJC;EACE,kBAAA;ExCiqJH;AyC3tJD;EACE,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,2BAAA;EzC6tJD;AyCjuJD;;EAQI,gBAAA;EzC6tJH;AyCruJD;EAYI,qBAAA;EACA,iBAAA;EACA,kBAAA;EzC4tJH;AyC1uJD;EAkBI,2BAAA;EzC2tJH;AyCxtJC;;EAEE,oBAAA;EzC0tJH;AyCjvJD;EA2BI,iBAAA;EzCytJH;AyCxsJD;EAAA;IAbI,iBAAA;IzCytJD;EyCvtJC;;IAEE,oBAAA;IACA,qBAAA;IzCytJH;EyCjtJH;;IAHM,iBAAA;IzCwtJH;EACF;A0CjwJD;EACE,gBAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;ErCiLA,6CAAA;EACK,wCAAA;EACG,qCAAA;ELmlJT;A0C7wJD;;EAaI,mBAAA;EACA,oBAAA;E1CowJH;A0ChwJC;;;EAGE,uBAAA;E1CkwJH;A0CvxJD;EA0BI,cAAA;EACA,gBAAA;E1CgwJH;A2CzxJD;EACE,eAAA;EACA,qBAAA;EACA,+BAAA;EACA,oBAAA;E3C2xJD;A2C/xJD;EAQI,eAAA;EAEA,gBAAA;E3CyxJH;A2CnyJD;EAeI,mBAAA;E3CuxJH;A2CtyJD;;EAqBI,kBAAA;E3CqxJH;A2C1yJD;EAyBI,iBAAA;E3CoxJH;A2C5wJD;;EAEE,qBAAA;E3C8wJD;A2ChxJD;;EAMI,oBAAA;EACA,WAAA;EACA,cAAA;EACA,gBAAA;E3C8wJH;A2CtwJD;ECvDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Cg0JD;A2C3wJD;EClDI,2BAAA;E5Cg0JH;A2C9wJD;EC/CI,gBAAA;E5Cg0JH;A2C7wJD;EC3DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C20JD;A2ClxJD;ECtDI,2BAAA;E5C20JH;A2CrxJD;ECnDI,gBAAA;E5C20JH;A2CpxJD;EC/DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Cs1JD;A2CzxJD;EC1DI,2BAAA;E5Cs1JH;A2C5xJD;ECvDI,gBAAA;E5Cs1JH;A2C3xJD;ECnEE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Ci2JD;A2ChyJD;EC9DI,2BAAA;E5Ci2JH;A2CnyJD;EC3DI,gBAAA;E5Ci2JH;A6Cn2JD;EACE;IAAQ,6BAAA;I7Cs2JP;E6Cr2JD;IAAQ,0BAAA;I7Cw2JP;EACF;A6Cr2JD;EACE;IAAQ,6BAAA;I7Cw2JP;E6Cv2JD;IAAQ,0BAAA;I7C02JP;EACF;A6C72JD;EACE;IAAQ,6BAAA;I7Cw2JP;E6Cv2JD;IAAQ,0BAAA;I7C02JP;EACF;A6Cn2JD;EACE,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,2BAAA;EACA,oBAAA;ExCsCA,wDAAA;EACQ,gDAAA;ELg0JT;A6Cl2JD;EACE,aAAA;EACA,WAAA;EACA,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;ExCyBA,wDAAA;EACQ,gDAAA;EAyHR,qCAAA;EACK,gCAAA;EACG,6BAAA;ELotJT;A6C/1JD;;ECCI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDAF,oCAAA;UAAA,4BAAA;E7Cm2JD;A6C51JD;;ExC5CE,4DAAA;EACK,uDAAA;EACG,oDAAA;EL44JT;A6Cz1JD;EErEE,2BAAA;E/Ci6JD;A+C95JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Ci3JH;A6C71JD;EEzEE,2BAAA;E/Cy6JD;A+Ct6JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Cy3JH;A6Cj2JD;EE7EE,2BAAA;E/Ci7JD;A+C96JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Ci4JH;A6Cr2JD;EEjFE,2BAAA;E/Cy7JD;A+Ct7JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Cy4JH;AgDj8JD;EAEE,kBAAA;EhDk8JD;AgDh8JC;EACE,eAAA;EhDk8JH;AgD97JD;;EAEE,SAAA;EACA,kBAAA;EhDg8JD;AgD77JD;EACE,gBAAA;EhD+7JD;AgD57JD;EACE,gBAAA;EhD87JD;AgD37JD;;EAEE,oBAAA;EhD67JD;AgD17JD;;EAEE,qBAAA;EhD47JD;AgDz7JD;;;EAGE,qBAAA;EACA,qBAAA;EhD27JD;AgDx7JD;EACE,wBAAA;EhD07JD;AgDv7JD;EACE,wBAAA;EhDy7JD;AgDr7JD;EACE,eAAA;EACA,oBAAA;EhDu7JD;AgDj7JD;EACE,iBAAA;EACA,kBAAA;EhDm7JD;AiDr+JD;EAEE,qBAAA;EACA,iBAAA;EjDs+JD;AiD99JD;EACE,oBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,qBAAA;EACA,2BAAA;EACA,2BAAA;EjD+9JD;AiD59JC;ErB3BA,8BAAA;EACC,6BAAA;E5B0/JF;AiD79JC;EACE,kBAAA;ErBvBF,iCAAA;EACC,gCAAA;E5Bu/JF;AiDt9JD;EACE,gBAAA;EjDw9JD;AiDz9JD;EAII,gBAAA;EjDw9JH;AiDp9JC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;EjDs9JH;AiDh9JC;;;EAGE,2BAAA;EACA,gBAAA;EACA,qBAAA;EjDk9JH;AiDv9JC;;;EASI,gBAAA;EjDm9JL;AiD59JC;;;EAYI,gBAAA;EjDq9JL;AiDh9JC;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EjDk9JH;AiDx9JC;;;;;;;;;EAYI,gBAAA;EjDu9JL;AiDn+JC;;;EAeI,gBAAA;EjDy9JL;AkDrjKC;EACE,gBAAA;EACA,2BAAA;ElDujKH;AkDrjKG;EACE,gBAAA;ElDujKL;AkDxjKG;EAII,gBAAA;ElDujKP;AkDpjKK;;EAEE,gBAAA;EACA,2BAAA;ElDsjKP;AkDpjKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDsjKP;AkD3kKC;EACE,gBAAA;EACA,2BAAA;ElD6kKH;AkD3kKG;EACE,gBAAA;ElD6kKL;AkD9kKG;EAII,gBAAA;ElD6kKP;AkD1kKK;;EAEE,gBAAA;EACA,2BAAA;ElD4kKP;AkD1kKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD4kKP;AkDjmKC;EACE,gBAAA;EACA,2BAAA;ElDmmKH;AkDjmKG;EACE,gBAAA;ElDmmKL;AkDpmKG;EAII,gBAAA;ElDmmKP;AkDhmKK;;EAEE,gBAAA;EACA,2BAAA;ElDkmKP;AkDhmKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDkmKP;AkDvnKC;EACE,gBAAA;EACA,2BAAA;ElDynKH;AkDvnKG;EACE,gBAAA;ElDynKL;AkD1nKG;EAII,gBAAA;ElDynKP;AkDtnKK;;EAEE,gBAAA;EACA,2BAAA;ElDwnKP;AkDtnKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDwnKP;AiD5hKD;EACE,eAAA;EACA,oBAAA;EjD8hKD;AiD5hKD;EACE,kBAAA;EACA,kBAAA;EjD8hKD;AmDlpKD;EACE,qBAAA;EACA,2BAAA;EACA,+BAAA;EACA,oBAAA;E9C0DA,mDAAA;EACQ,2CAAA;EL2lKT;AmDjpKD;EACE,eAAA;EnDmpKD;AmD9oKD;EACE,oBAAA;EACA,sCAAA;EvBpBA,8BAAA;EACC,6BAAA;E5BqqKF;AmDppKD;EAMI,gBAAA;EnDipKH;AmD5oKD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;EnD8oKD;AmDlpKD;;;;;EAWI,gBAAA;EnD8oKH;AmDzoKD;EACE,oBAAA;EACA,2BAAA;EACA,+BAAA;EvBxCA,iCAAA;EACC,gCAAA;E5BorKF;AmDnoKD;;EAGI,kBAAA;EnDooKH;AmDvoKD;;EAMM,qBAAA;EACA,kBAAA;EnDqoKL;AmDjoKG;;EAEI,eAAA;EvBvEN,8BAAA;EACC,6BAAA;E5B2sKF;AmDhoKG;;EAEI,kBAAA;EvBtEN,iCAAA;EACC,gCAAA;E5BysKF;AmD7nKD;EAEI,qBAAA;EnD8nKH;AmD3nKD;EACE,qBAAA;EnD6nKD;AmDrnKD;;;EAII,kBAAA;EnDsnKH;AmD1nKD;;;EAOM,oBAAA;EACA,qBAAA;EnDwnKL;AmDhoKD;;EvBnGE,8BAAA;EACC,6BAAA;E5BuuKF;AmDroKD;;;;EAmBQ,6BAAA;EACA,8BAAA;EnDwnKP;AmD5oKD;;;;;;;;EAwBU,6BAAA;EnD8nKT;AmDtpKD;;;;;;;;EA4BU,8BAAA;EnDooKT;AmDhqKD;;EvB3FE,iCAAA;EACC,gCAAA;E5B+vKF;AmDrqKD;;;;EAyCQ,gCAAA;EACA,iCAAA;EnDkoKP;AmD5qKD;;;;;;;;EA8CU,gCAAA;EnDwoKT;AmDtrKD;;;;;;;;EAkDU,iCAAA;EnD8oKT;AmDhsKD;;;;EA2DI,+BAAA;EnD2oKH;AmDtsKD;;EA+DI,eAAA;EnD2oKH;AmD1sKD;;EAmEI,WAAA;EnD2oKH;AmD9sKD;;;;;;;;;;;;EA0EU,gBAAA;EnDkpKT;AmD5tKD;;;;;;;;;;;;EA8EU,iBAAA;EnD4pKT;AmD1uKD;;;;;;;;EAuFU,kBAAA;EnD6pKT;AmDpvKD;;;;;;;;EAgGU,kBAAA;EnD8pKT;AmD9vKD;EAsGI,WAAA;EACA,kBAAA;EnD2pKH;AmDjpKD;EACE,qBAAA;EnDmpKD;AmDppKD;EAKI,kBAAA;EACA,oBAAA;EnDkpKH;AmDxpKD;EASM,iBAAA;EnDkpKL;AmD3pKD;EAcI,kBAAA;EnDgpKH;AmD9pKD;;EAkBM,+BAAA;EnDgpKL;AmDlqKD;EAuBI,eAAA;EnD8oKH;AmDrqKD;EAyBM,kCAAA;EnD+oKL;AmDxoKD;ECpPE,uBAAA;EpD+3KD;AoD73KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD+3KH;AoDl4KC;EAMI,2BAAA;EpD+3KL;AoDr4KC;EASI,gBAAA;EACA,2BAAA;EpD+3KL;AoD53KC;EAEI,8BAAA;EpD63KL;AmDvpKD;ECvPE,uBAAA;EpDi5KD;AoD/4KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDi5KH;AoDp5KC;EAMI,2BAAA;EpDi5KL;AoDv5KC;EASI,gBAAA;EACA,2BAAA;EpDi5KL;AoD94KC;EAEI,8BAAA;EpD+4KL;AmDtqKD;EC1PE,uBAAA;EpDm6KD;AoDj6KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDm6KH;AoDt6KC;EAMI,2BAAA;EpDm6KL;AoDz6KC;EASI,gBAAA;EACA,2BAAA;EpDm6KL;AoDh6KC;EAEI,8BAAA;EpDi6KL;AmDrrKD;EC7PE,uBAAA;EpDq7KD;AoDn7KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDq7KH;AoDx7KC;EAMI,2BAAA;EpDq7KL;AoD37KC;EASI,gBAAA;EACA,2BAAA;EpDq7KL;AoDl7KC;EAEI,8BAAA;EpDm7KL;AmDpsKD;EChQE,uBAAA;EpDu8KD;AoDr8KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDu8KH;AoD18KC;EAMI,2BAAA;EpDu8KL;AoD78KC;EASI,gBAAA;EACA,2BAAA;EpDu8KL;AoDp8KC;EAEI,8BAAA;EpDq8KL;AmDntKD;ECnQE,uBAAA;EpDy9KD;AoDv9KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDy9KH;AoD59KC;EAMI,2BAAA;EpDy9KL;AoD/9KC;EASI,gBAAA;EACA,2BAAA;EpDy9KL;AoDt9KC;EAEI,8BAAA;EpDu9KL;AqDv+KD;EACE,oBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;ErDy+KD;AqD9+KD;;;;;EAYI,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;ErDy+KH;AqDp+KD;EACE,wBAAA;ErDs+KD;AqDl+KD;EACE,qBAAA;ErDo+KD;AsD//KD;EACE,kBAAA;EACA,eAAA;EACA,qBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EjDwDA,yDAAA;EACQ,iDAAA;EL08KT;AsDzgLD;EASI,oBAAA;EACA,mCAAA;EtDmgLH;AsD9/KD;EACE,eAAA;EACA,oBAAA;EtDggLD;AsD9/KD;EACE,cAAA;EACA,oBAAA;EtDggLD;AuDthLD;EACE,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,8BAAA;EjCRA,cAAA;EAGA,2BAAA;EtB+hLD;AuDvhLC;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EjCfF,cAAA;EAGA,2BAAA;EtBuiLD;AuDnhLC;EACE,YAAA;EACA,iBAAA;EACA,yBAAA;EACA,WAAA;EACA,0BAAA;EvDqhLH;AwD1iLD;EACE,kBAAA;ExD4iLD;AwDxiLD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,mCAAA;EAIA,YAAA;ExDuiLD;AwDpiLC;EnD+GA,uCAAA;EACI,mCAAA;EACC,kCAAA;EACG,+BAAA;EAkER,qDAAA;EAEK,2CAAA;EACG,qCAAA;ELu3KT;AwD1iLC;EnD2GA,oCAAA;EACI,gCAAA;EACC,+BAAA;EACG,4BAAA;ELk8KT;AwD9iLD;EACE,oBAAA;EACA,kBAAA;ExDgjLD;AwD5iLD;EACE,oBAAA;EACA,aAAA;EACA,cAAA;ExD8iLD;AwD1iLD;EACE,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;EnDaA,kDAAA;EACQ,0CAAA;EmDZR,sCAAA;UAAA,8BAAA;EAEA,YAAA;ExD4iLD;AwDxiLD;EACE,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,2BAAA;ExD0iLD;AwDxiLC;ElCrEA,YAAA;EAGA,0BAAA;EtB8mLD;AwD3iLC;ElCtEA,cAAA;EAGA,2BAAA;EtBknLD;AwD1iLD;EACE,eAAA;EACA,kCAAA;EACA,2BAAA;ExD4iLD;AwDziLD;EACE,kBAAA;ExD2iLD;AwDviLD;EACE,WAAA;EACA,yBAAA;ExDyiLD;AwDpiLD;EACE,oBAAA;EACA,eAAA;ExDsiLD;AwDliLD;EACE,eAAA;EACA,mBAAA;EACA,+BAAA;ExDoiLD;AwDviLD;EAQI,kBAAA;EACA,kBAAA;ExDkiLH;AwD3iLD;EAaI,mBAAA;ExDiiLH;AwD9iLD;EAiBI,gBAAA;ExDgiLH;AwD3hLD;EACE,oBAAA;EACA,cAAA;EACA,aAAA;EACA,cAAA;EACA,kBAAA;ExD6hLD;AwD3gLD;EAZE;IACE,cAAA;IACA,mBAAA;IxD0hLD;EwDxhLD;InDvEA,mDAAA;IACQ,2CAAA;ILkmLP;EwDvhLD;IAAY,cAAA;IxD0hLX;EACF;AwDrhLD;EAFE;IAAY,cAAA;IxD2hLX;EACF;AyD1qLD;EACE,oBAAA;EACA,eAAA;EACA,gBAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,kBAAA;EnCXA,YAAA;EAGA,0BAAA;EtBqrLD;AyD1qLC;EnCdA,cAAA;EAGA,2BAAA;EtByrLD;AyD7qLC;EAAW,kBAAA;EAAmB,gBAAA;EzDirL/B;AyDhrLC;EAAW,kBAAA;EAAmB,gBAAA;EzDorL/B;AyDnrLC;EAAW,iBAAA;EAAmB,gBAAA;EzDurL/B;AyDtrLC;EAAW,mBAAA;EAAmB,gBAAA;EzD0rL/B;AyDtrLD;EACE,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EzDwrLD;AyDprLD;EACE,oBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;EzDsrLD;AyDlrLC;EACE,WAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,WAAA;EACA,YAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,WAAA;EACA,WAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,UAAA;EACA,SAAA;EACA,kBAAA;EACA,6BAAA;EACA,6BAAA;EzDorLH;AyDlrLC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,6BAAA;EACA,4BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,YAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;A0DlxLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,cAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,2BAAA;EACA,sCAAA;UAAA,8BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;ErD6CA,mDAAA;EACQ,2CAAA;EqD1CR,qBAAA;E1DkxLD;A0D/wLC;EAAY,mBAAA;E1DkxLb;A0DjxLC;EAAY,mBAAA;E1DoxLb;A0DnxLC;EAAY,kBAAA;E1DsxLb;A0DrxLC;EAAY,oBAAA;E1DwxLb;A0DrxLD;EACE,WAAA;EACA,mBAAA;EACA,iBAAA;EACA,2BAAA;EACA,kCAAA;EACA,4BAAA;E1DuxLD;A0DpxLD;EACE,mBAAA;E1DsxLD;A0D9wLC;;EAEE,oBAAA;EACA,gBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;E1DgxLH;A0D7wLD;EACE,oBAAA;E1D+wLD;A0D7wLD;EACE,oBAAA;EACA,aAAA;E1D+wLD;A0D3wLC;EACE,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,uCAAA;EACA,eAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;E1D8wLL;A0D3wLC;EACE,UAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,6BAAA;EACA,yCAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;E1D8wLL;A0D3wLC;EACE,WAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;EACA,0CAAA;EACA,YAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,UAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;E1D8wLL;A0D1wLC;EACE,UAAA;EACA,cAAA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,wCAAA;E1D4wLH;A0D3wLG;EACE,cAAA;EACA,YAAA;EACA,uBAAA;EACA,4BAAA;EACA,eAAA;E1D6wLL;A2D14LD;EACE,oBAAA;E3D44LD;A2Dz4LD;EACE,oBAAA;EACA,kBAAA;EACA,aAAA;E3D24LD;A2D94LD;EAMI,eAAA;EACA,oBAAA;EtD6KF,2CAAA;EACK,sCAAA;EACG,mCAAA;EL+tLT;A2Dr5LD;;EAcM,gBAAA;E3D24LL;A2Dj3LC;EAAA;ItDiKA,wDAAA;IAEK,8CAAA;IACG,wCAAA;IA7JR,qCAAA;IAEQ,6BAAA;IA+GR,2BAAA;IAEQ,mBAAA;ILowLP;E2D/4LG;;ItDmHJ,4CAAA;IACQ,oCAAA;IsDjHF,SAAA;I3Dk5LL;E2Dh5LG;;ItD8GJ,6CAAA;IACQ,qCAAA;IsD5GF,SAAA;I3Dm5LL;E2Dj5LG;;;ItDyGJ,yCAAA;IACQ,iCAAA;IsDtGF,SAAA;I3Do5LL;EACF;A2D17LD;;;EA6CI,gBAAA;E3Dk5LH;A2D/7LD;EAiDI,SAAA;E3Di5LH;A2Dl8LD;;EAsDI,oBAAA;EACA,QAAA;EACA,aAAA;E3Dg5LH;A2Dx8LD;EA4DI,YAAA;E3D+4LH;A2D38LD;EA+DI,aAAA;E3D+4LH;A2D98LD;;EAmEI,SAAA;E3D+4LH;A2Dl9LD;EAuEI,aAAA;E3D84LH;A2Dr9LD;EA0EI,YAAA;E3D84LH;A2Dt4LD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;ErC9FA,cAAA;EAGA,2BAAA;EqC6FA,iBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3Dy4LD;A2Dp4LC;EblGE,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9Cy+LH;A2Dx4LC;EACE,YAAA;EACA,UAAA;EbvGA,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9Ck/LH;A2D14LC;;EAEE,YAAA;EACA,gBAAA;EACA,uBAAA;ErCtHF,cAAA;EAGA,2BAAA;EtBigMD;A2D36LD;;;;EAsCI,oBAAA;EACA,UAAA;EACA,YAAA;EACA,uBAAA;E3D24LH;A2Dp7LD;;EA6CI,WAAA;EACA,oBAAA;E3D24LH;A2Dz7LD;;EAkDI,YAAA;EACA,qBAAA;E3D24LH;A2D97LD;;EAuDI,aAAA;EACA,cAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;E3D24LH;A2Dt4LG;EACE,kBAAA;E3Dw4LL;A2Dp4LG;EACE,kBAAA;E3Ds4LL;A2D53LD;EACE,oBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;E3D83LD;A2Dv4LD;EAYI,uBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;EACA,qBAAA;EACA,iBAAA;EAWA,2BAAA;EACA,oCAAA;E3Do3LH;A2Dn5LD;EAkCI,WAAA;EACA,aAAA;EACA,cAAA;EACA,2BAAA;E3Do3LH;A2D72LD;EACE,oBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3D+2LD;A2D92LC;EACE,mBAAA;E3Dg3LH;A2Dv0LD;EAhCE;;;;IAKI,aAAA;IACA,cAAA;IACA,mBAAA;IACA,iBAAA;I3Dy2LH;E2Dj3LD;;IAYI,oBAAA;I3Dy2LH;E2Dr3LD;;IAgBI,qBAAA;I3Dy2LH;E2Dp2LD;IACE,WAAA;IACA,YAAA;IACA,sBAAA;I3Ds2LD;E2Dl2LD;IACE,cAAA;I3Do2LD;EACF;A4DlmMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,cAAA;EACA,gBAAA;E5DgoMH;A4D9nMC;;;;;;;;;;;;;;;EACE,aAAA;E5D8oMH;AiCtpMD;E4BRE,gBAAA;EACA,mBAAA;EACA,oBAAA;E7DiqMD;AiCxpMD;EACE,yBAAA;EjC0pMD;AiCxpMD;EACE,wBAAA;EjC0pMD;AiClpMD;EACE,0BAAA;EjCopMD;AiClpMD;EACE,2BAAA;EjCopMD;AiClpMD;EACE,oBAAA;EjCopMD;AiClpMD;E6BzBE,aAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,WAAA;E9D8qMD;AiChpMD;EACE,0BAAA;EjCkpMD;AiC3oMD;EACE,iBAAA;EjC6oMD;A+D9qMD;EACE,qBAAA;E/DgrMD;A+D1qMD;;;;ECdE,0BAAA;EhE8rMD;A+DzqMD;;;;;;;;;;;;EAYE,0BAAA;E/D2qMD;A+DpqMD;EAAA;IChDE,2BAAA;IhEwtMC;EgEvtMD;IAAU,gBAAA;IhE0tMT;EgEztMD;IAAU,+BAAA;IhE4tMT;EgE3tMD;;IACU,gCAAA;IhE8tMT;EACF;A+D9qMD;EAAA;IAFI,2BAAA;I/DorMD;EACF;A+D9qMD;EAAA;IAFI,4BAAA;I/DorMD;EACF;A+D9qMD;EAAA;IAFI,kCAAA;I/DorMD;EACF;A+D7qMD;EAAA;ICrEE,2BAAA;IhEsvMC;EgErvMD;IAAU,gBAAA;IhEwvMT;EgEvvMD;IAAU,+BAAA;IhE0vMT;EgEzvMD;;IACU,gCAAA;IhE4vMT;EACF;A+DvrMD;EAAA;IAFI,2BAAA;I/D6rMD;EACF;A+DvrMD;EAAA;IAFI,4BAAA;I/D6rMD;EACF;A+DvrMD;EAAA;IAFI,kCAAA;I/D6rMD;EACF;A+DtrMD;EAAA;IC1FE,2BAAA;IhEoxMC;EgEnxMD;IAAU,gBAAA;IhEsxMT;EgErxMD;IAAU,+BAAA;IhEwxMT;EgEvxMD;;IACU,gCAAA;IhE0xMT;EACF;A+DhsMD;EAAA;IAFI,2BAAA;I/DssMD;EACF;A+DhsMD;EAAA;IAFI,4BAAA;I/DssMD;EACF;A+DhsMD;EAAA;IAFI,kCAAA;I/DssMD;EACF;A+D/rMD;EAAA;IC/GE,2BAAA;IhEkzMC;EgEjzMD;IAAU,gBAAA;IhEozMT;EgEnzMD;IAAU,+BAAA;IhEszMT;EgErzMD;;IACU,gCAAA;IhEwzMT;EACF;A+DzsMD;EAAA;IAFI,2BAAA;I/D+sMD;EACF;A+DzsMD;EAAA;IAFI,4BAAA;I/D+sMD;EACF;A+DzsMD;EAAA;IAFI,kCAAA;I/D+sMD;EACF;A+DxsMD;EAAA;IC5HE,0BAAA;IhEw0MC;EACF;A+DxsMD;EAAA;ICjIE,0BAAA;IhE60MC;EACF;A+DxsMD;EAAA;ICtIE,0BAAA;IhEk1MC;EACF;A+DxsMD;EAAA;IC3IE,0BAAA;IhEu1MC;EACF;A+DrsMD;ECnJE,0BAAA;EhE21MD;A+DlsMD;EAAA;ICjKE,2BAAA;IhEu2MC;EgEt2MD;IAAU,gBAAA;IhEy2MT;EgEx2MD;IAAU,+BAAA;IhE22MT;EgE12MD;;IACU,gCAAA;IhE62MT;EACF;A+DhtMD;EACE,0BAAA;E/DktMD;A+D7sMD;EAAA;IAFI,2BAAA;I/DmtMD;EACF;A+DjtMD;EACE,0BAAA;E/DmtMD;A+D9sMD;EAAA;IAFI,4BAAA;I/DotMD;EACF;A+DltMD;EACE,0BAAA;E/DotMD;A+D/sMD;EAAA;IAFI,kCAAA;I/DqtMD;EACF;A+D9sMD;EAAA;ICpLE,0BAAA;IhEs4MC;EACF","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #ffffff;\n  background-color: #333333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eeeeee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.form-group-sm .form-control,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  min-height: 32px;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.form-group-lg .form-control,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  min-height: 38px;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.333333px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #333333;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #ffffff;\n}\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555555;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n.navbar-default .btn-link {\n  color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #cccccc;\n}\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #cccccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #337ab7;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eeeeee;\n  border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #ffffff;\n  border-color: #dddddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #ffffff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #ffffff;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform 0.6s ease-in-out;\n    -moz-transition: -moz-transform 0.6s ease-in-out;\n    -o-transition: -o-transform 0.6s ease-in-out;\n    transition: transform 0.6s ease-in-out;\n    -webkit-backface-visibility: hidden;\n    -moz-backface-visibility: hidden;\n    backface-visibility: hidden;\n    -webkit-perspective: 1000;\n    -moz-perspective: 1000;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  line-height: 1;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n    //\n    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n    // Once fixed, we can just straight up remove this.\n    select {\n        background: #fff !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n// Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged\n\n[role=\"button\"] {\n  cursor: pointer;\n}","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: @input-height-base;\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: @input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: @input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: (@line-height-computed + @font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n  .form-control {\n    .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n  }\n  .form-control-static {\n    height: @input-height-small;\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    line-height: @line-height-small;\n    min-height: (@line-height-computed + @font-size-small);\n  }\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n  .form-control {\n    .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n  }\n  .form-control-static {\n    height: @input-height-large;\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    line-height: @line-height-large;\n    min-height: (@line-height-computed + @font-size-large);\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n     top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n     top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base dashed;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  .border-top-radius(@navbar-border-radius);\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding (@jumbotron-padding / 2);\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding: (@jumbotron-padding * 1.6) 0;\n\n    .container &,\n    .container-fluid & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  // Reset font and text properties given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-small;\n  font-weight: normal;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Reset font and text properties given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: @line-height-base;\n  text-align: left;\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .transition-transform(~'0.6s ease-in-out');\n      .backface-visibility(~'hidden');\n      .perspective(1000);\n\n      &.next,\n      &.active.right {\n        .translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        .translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        .translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/css/bootstrap.min.css b/module/css/lib/bootstrap/css/bootstrap.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..cd1c616ad862823506143fda108e7caa2a58d1ed
--- /dev/null
+++ b/module/css/lib/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.eot b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
new file mode 100755
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
Binary files /dev/null and b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.eot differ
diff --git a/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.svg b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
new file mode 100755
index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
--- /dev/null
+++ b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
Binary files /dev/null and b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
new file mode 100755
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
Binary files /dev/null and b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff differ
diff --git a/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2
new file mode 100755
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
Binary files /dev/null and b/module/css/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/module/css/lib/colorpicker/css/bootstrap-colorpicker.css b/module/css/lib/colorpicker/css/bootstrap-colorpicker.css
new file mode 100755
index 0000000000000000000000000000000000000000..609fb222c2fa70f948a8adc9f0ccb6fcae301eaf
--- /dev/null
+++ b/module/css/lib/colorpicker/css/bootstrap-colorpicker.css
@@ -0,0 +1,233 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */
+
+.colorpicker-saturation {
+  float: left;
+  width: 100px;
+  height: 100px;
+  cursor: crosshair;
+  background-image: url("../img/bootstrap-colorpicker/saturation.png");
+}
+
+.colorpicker-saturation i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 5px;
+  height: 5px;
+  margin: -4px 0 0 -4px;
+  border: 1px solid #000;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.colorpicker-saturation i b {
+  display: block;
+  width: 5px;
+  height: 5px;
+  border: 1px solid #fff;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.colorpicker-hue,
+.colorpicker-alpha {
+  float: left;
+  width: 15px;
+  height: 100px;
+  margin-bottom: 4px;
+  margin-left: 4px;
+  cursor: row-resize;
+}
+
+.colorpicker-hue i,
+.colorpicker-alpha i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 100%;
+  height: 1px;
+  margin-top: -1px;
+  background: #000;
+  border-top: 1px solid #fff;
+}
+
+.colorpicker-hue {
+  background-image: url("../img/bootstrap-colorpicker/hue.png");
+}
+
+.colorpicker-alpha {
+  display: none;
+  background-image: url("../img/bootstrap-colorpicker/alpha.png");
+}
+
+.colorpicker-saturation,
+.colorpicker-hue,
+.colorpicker-alpha {
+  background-size: contain;
+}
+
+.colorpicker {
+  top: 0;
+  left: 0;
+  z-index: 2500;
+  min-width: 130px;
+  padding: 4px;
+  margin-top: 1px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+}
+
+.colorpicker:before,
+.colorpicker:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.colorpicker:after {
+  clear: both;
+}
+
+.colorpicker:before {
+  position: absolute;
+  top: -7px;
+  left: 6px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.colorpicker:after {
+  position: absolute;
+  top: -6px;
+  left: 7px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.colorpicker div {
+  position: relative;
+}
+
+.colorpicker.colorpicker-with-alpha {
+  min-width: 140px;
+}
+
+.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
+  display: block;
+}
+
+.colorpicker-color {
+  height: 10px;
+  margin-top: 5px;
+  clear: both;
+  background-image: url("../img/bootstrap-colorpicker/alpha.png");
+  background-position: 0 100%;
+}
+
+.colorpicker-color div {
+  height: 10px;
+}
+
+.colorpicker-element .input-group-addon i,
+.colorpicker-element .add-on i {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  vertical-align: text-top;
+  cursor: pointer;
+}
+
+.colorpicker.colorpicker-inline {
+  position: relative;
+  z-index: auto;
+  display: inline-block;
+  float: none;
+}
+
+.colorpicker.colorpicker-horizontal {
+  width: 110px;
+  height: auto;
+  min-width: 110px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-saturation {
+  margin-bottom: 4px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-color {
+  width: 100px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+  float: left;
+  width: 100px;
+  height: 15px;
+  margin-bottom: 4px;
+  margin-left: 0;
+  cursor: col-resize;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue i,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 1px;
+  height: 15px;
+  margin-top: 0;
+  background: #ffffff;
+  border: none;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue {
+  background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png");
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+  background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png");
+}
+
+.colorpicker.colorpicker-hidden {
+  display: none;
+}
+
+.colorpicker.colorpicker-visible {
+  display: block;
+}
+
+.colorpicker-inline.colorpicker-visible {
+  display: inline-block;
+}
+
+.colorpicker-right:before {
+  right: 6px;
+  left: auto;
+}
+
+.colorpicker-right:after {
+  right: 7px;
+  left: auto;
+}
\ No newline at end of file
diff --git a/module/css/lib/colorpicker/css/bootstrap-colorpicker.min.css b/module/css/lib/colorpicker/css/bootstrap-colorpicker.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..aeb95d8085321989c4443185534727a3789765ba
--- /dev/null
+++ b/module/css/lib/colorpicker/css/bootstrap-colorpicker.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker-saturation,.colorpicker-hue,.colorpicker-alpha{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto}
\ No newline at end of file
diff --git a/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png b/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png
new file mode 100755
index 0000000000000000000000000000000000000000..d0a65c08b0ed34d969cb0e93165a2e8b0ef9dbd7
Binary files /dev/null and b/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png differ
diff --git a/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha.png b/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha.png
new file mode 100755
index 0000000000000000000000000000000000000000..38043f1c85f20fe8ce37ad380bebe2d42d14fb29
Binary files /dev/null and b/module/css/lib/colorpicker/img/bootstrap-colorpicker/alpha.png differ
diff --git a/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue-horizontal.png b/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue-horizontal.png
new file mode 100755
index 0000000000000000000000000000000000000000..a0d9add8e7b12c40e3aef1a095e3ae15ac2e4969
Binary files /dev/null and b/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue-horizontal.png differ
diff --git a/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue.png b/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue.png
new file mode 100755
index 0000000000000000000000000000000000000000..d89560e999f86c349ddc78c298b0328293f13e1e
Binary files /dev/null and b/module/css/lib/colorpicker/img/bootstrap-colorpicker/hue.png differ
diff --git a/module/css/lib/colorpicker/img/bootstrap-colorpicker/saturation.png b/module/css/lib/colorpicker/img/bootstrap-colorpicker/saturation.png
new file mode 100755
index 0000000000000000000000000000000000000000..594ae50ed77608cf6373d6b39e5cacb9f63b7bbe
Binary files /dev/null and b/module/css/lib/colorpicker/img/bootstrap-colorpicker/saturation.png differ
diff --git a/module/css/lib/fonts/FontAwesome.otf b/module/css/lib/fonts/FontAwesome.otf
new file mode 100755
index 0000000000000000000000000000000000000000..f7936cc1e789eea5438d576d6b12de20191da09d
Binary files /dev/null and b/module/css/lib/fonts/FontAwesome.otf differ
diff --git a/module/css/lib/fonts/fontawesome-webfont.eot b/module/css/lib/fonts/fontawesome-webfont.eot
new file mode 100755
index 0000000000000000000000000000000000000000..33b2bb80055cc480e797de704925acaba4ba7d7d
Binary files /dev/null and b/module/css/lib/fonts/fontawesome-webfont.eot differ
diff --git a/module/css/lib/fonts/fontawesome-webfont.svg b/module/css/lib/fonts/fontawesome-webfont.svg
new file mode 100755
index 0000000000000000000000000000000000000000..1ee89d4368d31a368817a842f14d53f7a64c3038
--- /dev/null
+++ b/module/css/lib/fonts/fontawesome-webfont.svg
@@ -0,0 +1,565 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="2304" d="M1509 107q0 -14 -12 -29q-52 -59 -147.5 -83t-196.5 -24q-252 0 -346 107q-12 15 -12 29q0 17 12 29.5t29 12.5q15 0 30 -12q58 -49 125.5 -66t159.5 -17t160 17t127 66q15 12 30 12q17 0 29 -12.5t12 -29.5zM978 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5 t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM1622 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM415 793q-39 27 -88 27q-66 0 -113 -47t-47 -113q0 -72 54 -121q53 141 194 254zM2020 382q0 222 -249 387 q-128 85 -291.5 126.5t-331.5 41.5t-331.5 -41.5t-292.5 -126.5q-249 -165 -249 -387t249 -387q129 -85 292.5 -126.5t331.5 -41.5t331.5 41.5t291.5 126.5q249 165 249 387zM2137 660q0 66 -47 113t-113 47q-50 0 -93 -30q140 -114 192 -256q61 48 61 126zM1993 1335 q0 49 -34.5 83.5t-82.5 34.5q-49 0 -83.5 -34.5t-34.5 -83.5q0 -48 34.5 -82.5t83.5 -34.5q48 0 82.5 34.5t34.5 82.5zM2220 660q0 -65 -33 -122t-89 -90q5 -35 5 -66q0 -139 -79 -255.5t-208 -201.5q-140 -92 -313.5 -136.5t-354.5 -44.5t-355 44.5t-314 136.5 q-129 85 -208 201.5t-79 255.5q0 36 6 71q-53 33 -83.5 88.5t-30.5 118.5q0 100 71 171.5t172 71.5q91 0 159 -60q265 170 638 177l144 456q10 29 40 29q24 0 384 -90q24 55 74 88t110 33q82 0 141 -59t59 -142t-59 -141.5t-141 -58.5q-83 0 -141.5 58.5t-59.5 140.5 l-339 80l-125 -395q349 -15 603 -179q71 63 163 63q101 0 172 -71.5t71 -171.5z" />
+<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf218;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf222;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h416q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-419 -420q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5 t431 200.5q144 12 276.5 -30.5t236.5 -129.5l419 419h-261q-14 0 -23 9t-9 23v64zM704 -128q117 0 223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123 t223.5 -45.5z" />
+<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="&#xf229;" horiz-adv-x="1792" d="M1728 1536q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-229 -230l156 -156q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-156 157l-99 -100q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5 t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5t431 200.5q144 12 276.5 -30.5t236.5 -129.5l99 99l-156 156q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l156 -156l229 229h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM1280 448q0 117 -45.5 223.5t-123 184t-184 123 t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5z" />
+<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M2029 685q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-131q-12 -119 -67 -226t-139 -183.5t-196.5 -121.5t-234.5 -45q-180 0 -330.5 91t-234.5 247 t-74 337q8 162 94 300t226.5 219.5t302.5 85.5q166 4 310.5 -71.5t235.5 -208.5t107 -296h131v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM640 128q104 0 198.5 40.5t163.5 109.5t109.5 163.5 t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
+<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
+<glyph unicode="&#xf23b;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/module/css/lib/fonts/fontawesome-webfont.ttf b/module/css/lib/fonts/fontawesome-webfont.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345
Binary files /dev/null and b/module/css/lib/fonts/fontawesome-webfont.ttf differ
diff --git a/module/css/lib/fonts/fontawesome-webfont.woff b/module/css/lib/fonts/fontawesome-webfont.woff
new file mode 100755
index 0000000000000000000000000000000000000000..8b280b98fa2fa261aa4b0f8fd061f772073ef83e
Binary files /dev/null and b/module/css/lib/fonts/fontawesome-webfont.woff differ
diff --git a/module/css/lib/fonts/fontawesome-webfont.woff2 b/module/css/lib/fonts/fontawesome-webfont.woff2
new file mode 100755
index 0000000000000000000000000000000000000000..3311d585145b1cc1b9581e914acbb32d8542b4f5
Binary files /dev/null and b/module/css/lib/fonts/fontawesome-webfont.woff2 differ
diff --git a/module/css/lib/fonts/glyphicons-halflings-regular.eot b/module/css/lib/fonts/glyphicons-halflings-regular.eot
new file mode 100755
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
Binary files /dev/null and b/module/css/lib/fonts/glyphicons-halflings-regular.eot differ
diff --git a/module/css/lib/fonts/glyphicons-halflings-regular.svg b/module/css/lib/fonts/glyphicons-halflings-regular.svg
new file mode 100755
index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
--- /dev/null
+++ b/module/css/lib/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/module/css/lib/fonts/glyphicons-halflings-regular.ttf b/module/css/lib/fonts/glyphicons-halflings-regular.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
Binary files /dev/null and b/module/css/lib/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/module/css/lib/fonts/glyphicons-halflings-regular.woff b/module/css/lib/fonts/glyphicons-halflings-regular.woff
new file mode 100755
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
Binary files /dev/null and b/module/css/lib/fonts/glyphicons-halflings-regular.woff differ
diff --git a/module/css/lib/fonts/glyphicons-halflings-regular.woff2 b/module/css/lib/fonts/glyphicons-halflings-regular.woff2
new file mode 100755
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
Binary files /dev/null and b/module/css/lib/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/module/css/lib/jquery-sortable/jquery-sortable.css b/module/css/lib/jquery-sortable/jquery-sortable.css
new file mode 100755
index 0000000000000000000000000000000000000000..70df33f62f0f6a8cdb9332bc38e549254187992e
--- /dev/null
+++ b/module/css/lib/jquery-sortable/jquery-sortable.css
@@ -0,0 +1,22 @@
+.dragged {
+	position: absolute;
+	opacity: 0.5;
+	z-index: 2000;
+}
+
+li.placeholder {
+	position: relative;
+	/** More li styles **/
+}
+li.placeholder:before {
+	position: absolute;
+    content: "";
+    width: 0;
+    height: 0;
+    margin-top: 5px;
+    left: 10px;
+    top: -4px;
+    border: 5px solid transparent;
+    border-left-color: #333;
+    border-right: none;
+}
\ No newline at end of file
diff --git a/module/css/mobile.less b/module/css/mobile.less
new file mode 100755
index 0000000000000000000000000000000000000000..fd900b75f297d667806837678592ecc6c66f8f34
--- /dev/null
+++ b/module/css/mobile.less
@@ -0,0 +1,289 @@
+/**
+ *
+ *  Fichier utilisé pour surcharger les définitions
+ *  pour les périphériques mobiles
+ *
+ */
+
+@top-bar-height: 40px;
+@location-search-form-height: 30px;
+@winheight:`$(window).height()`;
+@mobile-vh-correction: calc(100vh ~"-" ~"@{winheight}px");
+
+#opener-sidebar {
+    display: none;
+}
+
+#tool-sidebar {
+    display: none;
+}
+
+app-map > div {
+    position: initial !important;
+}
+
+.ol-zoom {
+    top: 2em;
+    left: .5em;
+}
+
+.ol-map-name {
+    top: 8px;
+    position: absolute;
+    left: 0;
+    right: 0;
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+    background-color: transparent;
+}
+
+.vmap_return_tool{
+    background-color: #dfdfdf;
+    margin: 3px 3px;
+}
+.vmap_mobile_return_modal{
+    background-color: #dfdfdf;
+    margin: -5px -6px;
+}
+
+.map-basic-tools{
+    height: @top-bar-height !important;
+}
+.map-basic-tools-row {
+    margin: 0px;
+}
+.vmap_mobile_tool{
+    color: #dfdfdf;
+    padding: 9px 13px;
+    font-size: 20px;
+}
+.vmap_mobile_tool.active{
+    color: #126673;
+    background-color: white;
+}
+.vmap_mobile_tool_search{
+    padding: 9px 25px;
+}
+.mobile-menu {
+    height: calc(100% ~"-" @top-bar-height);
+    width: 100%;
+    background-color: white;
+    position: fixed;
+    z-index: 9;
+}
+
+#basic-tools-bar {
+    font-size: 14px;
+}
+
+#location-search-input{
+    border: 1px solid #ccc;
+    width: 100%;
+    padding-left: 7px;
+}
+#location-search-input:focus{
+    outline: transparent;
+}
+
+#select-bo-select{
+    height: 25px;
+}
+#location-search-api-select {
+    height: 30px;
+    padding: 2px !important;
+    font-size: 12px;
+    border: 1px solid #ccc;
+    color: #555;
+}
+#location-search-api-select:hover{
+    color: #555;
+}
+#location-search-api-select:focus{
+    outline: transparent;
+}
+.location-search-dropdown-content{
+    width: 100%;
+}
+.list-group-item{
+    padding: 10px 15px;
+    height: auto;
+    border: 1px solid #ddd;
+}
+
+#location-search-form{
+    width: 100%;
+    height: @location-search-form-height;
+    margin-top: 10px;
+    margin-bottom: 20px;
+}
+#vmap_menu_location_results{
+    height: calc(100vh ~"-" @top-bar-height ~"-" @location-search-form-height);
+}
+
+#mobile-popup-bar{
+    position: fixed;
+    bottom: 0;
+    width: 100%;
+    background-color: white;
+    opacity: 0.9;
+    padding: 15px 15px;
+    z-index: 9;
+    font-size: 13px;
+    height: auto;
+}
+#mobile-popup-bar [class^="ol-popup-"]{
+    font-size: 22px;
+    margin: 10px 0px;
+}
+#mobile-popup-bar .dropdown-menu{
+    font-size: 22px;
+}
+.ol-popup-buttons-container{
+    height: 18px;
+}
+.ol-popup-closer {
+    top: 4px;
+    right: 17px;
+}
+.ol-popup-list{
+    top: 6px;
+    right: 55px;
+}
+.ol-popup-edit{
+    top: 6px;
+    left: 66px;
+}
+.ol-popup-card{
+    top: 6px;
+    left: 23px;
+}
+.popup-content{
+    overflow: auto;
+}
+
+.map-list-litle-panel-list{
+    max-height: calc(100% ~"-" 40px);
+}
+
+#layertree > ul.tree > div {
+    margin-bottom: 16px;
+}
+
+.layer-menu{
+    margin-left: 83px;
+}
+
+.mobile-full-modal{
+    height: calc(100vh ~"-" @mobile-vh-correction) !important;
+    width: 100vw !important;
+    margin: 0px !important;
+}
+.mobile-full-modal > .modal-content{
+    height: calc(100vh ~"-" @mobile-vh-correction) !important;
+    max-height: calc(100vh ~"-" @mobile-vh-correction) !important;
+    border-radius: 0px !important;
+}
+
+.mobile_menu_logo{
+    margin-right: 10px;
+}
+
+.icon-measure.mobile_menu_logo{
+    font-size: 14px;
+}
+
+.list-group-item.sublist-group-item {
+    font-size: 85%;
+    background-color: #ddd;
+    margin-left: 7px;
+    border-color: white;
+}
+
+
+.ol_draw_menu {
+    height: 100%;
+}
+.ol_draw_menu_horizontal_bar,
+.ol_geom_edit_menu_horizontal_bar{
+    height: 2px;
+    width: 100%;
+    background-color: black;
+    position: fixed;
+    top: 50%;
+}
+.ol_draw_menu_vertical_bar,
+.ol_geom_edit_menu_vertical_bar{
+    height: 100%;
+    width: 2px;
+    background-color: black;
+    position: fixed;
+    left: 50%;
+    top: 0px;
+}
+.ol_draw_menu_top_buttons_container{
+    background-color: black;
+    height: 43px;
+    width: 100%;
+    top: 0px;
+    z-index: 9999;
+    position: fixed;
+}
+.ol_draw_menu_bottom_buttons_container{
+    background-color: black;
+    height: 56px;
+    width: 100%;
+    bottom: 0px;
+    position: fixed;
+}
+.ol_draw_menu button {
+    width: 100%;
+    margin-top: 5px;
+}
+
+.icon-th:before {
+    content: "Colonnes" !important;
+    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+    font-size: 14px;
+    line-height: 1.42857143;
+    color: #333;
+}
+
+.insert_menu_logo{
+    margin-right: 10px;
+}
+
+.modal-body-big-3 {
+    max-height: calc(100vh ~"-" 58px ~"-" @mobile-vh-correction);
+    height: calc(100vh ~"-" 58px ~"-" @mobile-vh-correction);
+}
+.modal-body-big-with-footer-3 {
+    max-height: calc(100vh ~"-" 104px ~"-" @mobile-vh-correction);
+    height: calc(100vh ~"-" 104px ~"-" @mobile-vh-correction);
+}
+
+.advanced-select-mobile-accordion{
+    height: calc(100% ~"-" 45px);
+}
+.advanced-select-mobile-accordion-table{
+    height: calc(100% ~"-" 92px);
+}
+
+.notifyjs-bootstrap-base{
+    white-space: normal !important;
+}
+
+#select-bo-select{
+    max-width: 23vw;
+}
+
+.basic-tools-dropdown-select-getFeatureInfo-content{
+    display: block;
+    top: 0px !important;
+    height: 100%;
+    padding: 0px !important;
+    margin: 0px !important;
+    right: 0px !important;
+    width: 100% !important;
+    min-width: auto;
+}
diff --git a/module/css/ol.css b/module/css/ol.css
new file mode 100755
index 0000000000000000000000000000000000000000..707e7e61c57ae751780b0ef9ac9efe49ea6a45ad
--- /dev/null
+++ b/module/css/ol.css
@@ -0,0 +1 @@
+.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:#95b9e6;background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-viewport .ol-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-control{position:absolute;background-color:#eee;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:#7b98bc;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:#4c6079;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom: 2.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit}.ol-attribution button,.ol-attribution ul{display:inline-block;}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{position:absolute;top:4.5em;left:.5em;background:#eee;background:rgba(255,255,255,.4);width:24px;height:200px}.ol-zoomslider-thumb{position:absolute;background:#7b98bc;background:rgba(0,60,136,.5);border-radius:2px;cursor:pointer;height:10px;width:22px;margin:3px}.ol-touch .ol-zoomslider{top:5.5em;width:2.052em}.ol-touch .ol-zoomslider-thumb{width:1.8em}.ol-overviewmap{position:absolute;left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}
\ No newline at end of file
diff --git a/module/css/variables.less b/module/css/variables.less
new file mode 100755
index 0000000000000000000000000000000000000000..6bbf7597e3c560ba849302739a7b8d20e3026815
--- /dev/null
+++ b/module/css/variables.less
@@ -0,0 +1,25 @@
+
+/* Vmap colors */
+@base: @application-color-theme;
+@head-bar: @application-darken-color-theme;
+@disable: #808080;
+@color-text-1: #dfdfdf;
+@color-text-2: #333;
+@background: #dfdfdf;
+@basic-tool-active: #d4d4d4;
+
+/* bootstrap conventional colors */
+@info: #5bc0de;
+@primary: #337ab7;
+@success: #5cb85c;
+@warning: #f0ad4e;
+@danger: #d9534f;
+
+/* elements size */
+@left-sidebar-width: 23px;
+@left-sidebar-content-width: 225px;
+@right-sidebar-width: 23px;
+@right-sidebar-content-width: 300px;
+@top-bar-height: 32px;
+@botom-open-height: 40%;
+@botom-open2-height: 70%;
\ No newline at end of file
diff --git a/module/css/vmap.less b/module/css/vmap.less
new file mode 100644
index 0000000000000000000000000000000000000000..0afd13f194d292e38f188753422b6b48c5ebab8c
--- /dev/null
+++ b/module/css/vmap.less
@@ -0,0 +1,2373 @@
+/*
+    Created on : 31 mars 2015, 15:23:43
+    Author     : Marty Fabien - Armand Bahi
+*/
+
+@import "../../../conf/less/variables.less";
+@import "variables.less";
+
+html, body {
+    height: 100%;
+    margin: 0;
+    padding: 0;
+}
+.glyphicon{
+    font-family: 'Glyphicons Halflings' !important;
+}
+.modal-dialog{
+    height: ~"calc(100% - 60px)";
+}
+.modal-lg .modal-content{
+    height: 90%;
+}
+#app-vmap {
+    position: relative;
+    overflow: hidden;
+    height:100%;
+    width:100%;
+    padding: 0;
+    margin: 0;
+    font-size: 12px;
+
+    /* unselecetable */
+    /*    -webkit-user-select: none;  Chrome/Safari
+            -moz-user-select: none;  Firefox
+            -ms-user-select: none;  IE10+
+            -o-user-select: none;
+            user-select: none;*/
+}
+.lighen{
+    background-color: @application-lighen-color-theme !important;
+    color: white !important;
+}
+.darken{
+    background-color: @application-darken-color-theme !important;
+    color: white !important;
+}
+.hidden{
+    display: none !important;
+}
+.block{
+    display: inline-block !important;
+}
+.font-10{
+    font-size: 10px !important;
+}
+.font-11{
+    font-size: 11px !important;
+}
+.font-12{
+    font-size: 12px !important;
+}
+.font-14{
+    font-size: 14px !important;
+}
+.font-15{
+    font-size: 15px !important;
+}
+.font-16{
+    font-size: 16px !important;
+}
+.transparent{
+    background-color: transparent !important;
+}
+.gray{
+    background-color: gray !important;
+}
+.black{
+    background-color: black !important;
+}
+.white{
+    background-color: white !important;
+}
+.blue{
+    background-color: @primary !important;
+}
+.dark-blue{
+    background-color: @base !important;
+}
+.green{
+    background-color: @success !important;
+}
+.red{
+    background-color: @danger !important;
+}
+.disable{
+    background-color: @disable !important
+}
+.background{
+    background-color: @background !important
+}
+.color-gray{
+    color: gray !important;
+}
+.color-black{
+    color: black !important;
+}
+.color-white{
+    color: white !important;
+}
+.color-blue{
+    color: @primary !important;
+}
+.color-dark-blue{
+    color: @base !important;
+}
+.color-green{
+    color: @success !important;
+}
+.color-red{
+    color: @danger !important;
+}
+.color-disable{
+    color: @disable !important;
+}
+.color-background{
+    color: @background !important;
+}
+.color-text-1{
+    color: @color-text-1 !important;
+}
+.text-info{
+    color: @info;
+}
+.text-success{
+    color: @success;
+}
+.table {
+    width: 100%;
+    max-width: 100%;
+    margin-bottom: 20px;
+    background-color: transparent;
+    border-spacing: 0;
+    border-collapse: collapse;
+}
+.table-no-bordered{
+    border: 0px solid transparent !important;
+}
+.table-no-bordered>tbody>tr>td,
+.table-no-bordered>tbody>tr>th,
+.table-no-bordered>tfoot>tr>td,
+.table-no-bordered>tfoot>tr>th,
+.table-no-bordered>thead>tr>td,
+.table-no-bordered>thead>tr>th {
+    border: 0px solid transparent !important;
+}
+
+.width-100{
+    width: 100% !important;
+}
+.border-black{
+    border: 1px solid black;
+}
+.right{
+    float: right !important;
+}
+.left{
+    float: left !important;
+}
+.center{
+    margin-left: auto !important;
+    margin-right: auto !important;
+}
+.pointer{
+    cursor: pointer !important;
+}
+.absolute{
+    position: absolute !important;
+}
+.relative{
+    position: relative !important;
+}
+.scrollable{
+    overflow: scroll !important;
+}
+.auto-height{
+    height: auto !important;
+}
+.auto-overflow{
+    overflow: auto !important;
+}
+.lg{
+    height: 46px;
+    padding: 10px 16px;
+    font-size: 18px;
+    line-height: 1.3333333;
+    border-radius: 6px;
+}
+.sm{
+    height: 30px;
+    padding: 5px 10px;
+    font-size: 12px;
+    line-height: 1.5;
+    border-radius: 3px;
+}
+.minus{
+    height: 25px;
+    padding: 3px 7px;
+    font-size: 10px;
+    line-height: 1.5;
+    border-radius: 3px;
+}
+.reverse{
+    -webkit-transform: rotate(180deg) !important;
+    -moz-transform: rotate(180deg) !important;
+    -o-transform: rotate(180deg) !important;
+    transform: rotate(180deg) !important;
+}
+.opacity-hover:hover{
+    opacity: 0.5 !important;
+}
+.shadow-hover:hover{
+    box-shadow: 0px 0px 16px #000000 !important;
+}
+.underline-hover:hover{
+    text-decoration: underline;
+}
+.inline{
+    display: flex !important;
+}
+.bordered{
+    border: 1px solid #C8C8C8;
+    border-radius: 4px;
+}
+
+#container {
+    position: relative;
+    height: 100%;
+}
+app-map > div {
+    width: auto;
+    height: 100%;
+    background-color: @background;
+    position: relative;
+    overflow: hidden;
+    z-index: 2;
+}
+
+#left-sidebar {
+    display: block;
+    float: left;
+    width: @left-sidebar-content-width;
+    height: 100%;
+    background-color: @background;
+    margin-right: -(@left-sidebar-content-width);
+    -webkit-transition: all 300ms ease-out 0s;
+    -o-transition: all 300ms ease-out 0s;
+    transition: all 300ms ease-out 0s;
+}
+#left-sidebar.open {
+    margin-right: 0;
+}
+.right-sidebar {
+    overflow: auto;
+    display: block;
+    float: right;
+    width: @right-sidebar-content-width;
+    height: 100%;
+    background-color: @background;
+    margin-left: -(@right-sidebar-content-width);
+    position: relative;
+    visibility: hidden;
+    -webkit-transition: all 300ms ease-out 0s;
+    -o-transition: all 300ms ease-out 0s;
+    transition: all 300ms ease-out 0s;
+}
+.right-sidebar.open {
+    margin-left: 0;
+    visibility: visible;
+}
+#basic-tools-bar{
+    position: relative;
+    overflow: hidden;
+    font-size: 13px;
+}
+.map-basic-tools-row{
+    margin: 0px @right-sidebar-width 0px @left-sidebar-width;
+}
+.squared-btn{
+    background-color: gray;
+    border: 1px solid transparent;
+    height: 100%;
+    width: 100%;
+    position: relative;
+    text-align: center;
+    border-radius: 4px;
+    color: #fff;
+    padding: 5px;
+}
+.squared-btn:hover, .squared-btn.active{
+    background-color: white;
+    border: 1px solid gray;
+    cursor: pointer;
+    color: gray;
+}
+.squared-btn-text{
+    position: absolute;
+    bottom: 0
+}
+.btn-file {
+    position: relative;
+    overflow: hidden;
+}
+.btn-file input[type=file] {
+    position: absolute;
+    top: 0;
+    right: 0;
+    min-width: 100%;
+    min-height: 100%;
+    font-size: 100px;
+    text-align: right;
+    filter: alpha(opacity=0);
+    opacity: 0;
+    background: red;
+    cursor: inherit;
+    display: block;
+}
+input[readonly] {
+    background-color: white !important;
+    cursor: text !important;
+}
+#bottombar{
+    height: 0%;
+    background-color: @background;
+    z-index: 999;
+    display: -webkit-flex !important;
+    display: -moz-flex !important;
+    display: -ms-flex !important;
+    display: flex !important;
+    /*overflow: auto;*/
+    -webkit-transition: all 300ms ease-out 0s;
+    -o-transition: all 300ms ease-out 0s;
+    transition: all 300ms ease-out 0s;
+    width: -moz-calc(100% ~"-" @right-sidebar-width + @left-sidebar-width);
+    width: -webkit-calc(100% ~"-" @right-sidebar-width + @left-sidebar-width);
+    width: -o-calc(100% ~"-" @right-sidebar-width + @left-sidebar-width);
+    width: calc(100% ~"-" @right-sidebar-width + @left-sidebar-width);
+    position: inherit;
+}
+.bottombar_right_open{
+    width: -moz-calc(100% ~"-" @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -webkit-calc(100% ~"-" @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -o-calc(100% ~"-" @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: calc(100% ~"-" @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+}
+.bottombar_left_open{
+    width: -moz-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -webkit-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -o-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+}
+.bottombar_sides_open{
+    width: -moz-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -webkit-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: -o-calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+    width: calc(100% ~"-" @left-sidebar-content-width + @right-sidebar-content-width + @right-sidebar-width + @left-sidebar-width) !important;
+}
+#bottombar.open{
+    height: @botom-open-height;
+}
+#bottombar.open2{
+    height: @botom-open2-height;
+}
+#opener-bottombar{
+    visibility: hidden;
+    background-color: @head-bar;
+    border-radius: 4px 4px 0px 0px;
+    cursor: pointer;
+    display: -webkit-flex !important;
+    display: -moz-flex !important;
+    display: -ms-flex !important;
+    display: flex !important;
+}
+#map-container{
+    -webkit-transition: all 300ms ease-out 0s;
+    -o-transition: all 300ms ease-out 0s;
+    transition: all 300ms ease-out 0s;
+    height: 97%;
+    height: ~"-moz-calc(100% - 32px)";
+    height: ~"-webkit-calc(100% - 32px)";
+    height: ~"-o-calc(100% - 32px)";
+    height: ~"calc(100% - 32px)";
+}
+#map-container.minus{
+    height: 95%;
+    height: ~"-moz-calc(100% - 47px)";
+    height: ~"-webkit-calc(100% - 47px)";
+    height: ~"-o-calc(100% - 47px)";
+    height: ~"calc(100% - 47px)";
+    font-size: 12px;
+    padding: 0px 0px;
+}
+#map-container.open{
+    height: -moz-calc(100% ~"-" @botom-open-height ~"-" 47px);
+    height: -webkit-calc(100% ~"-" @botom-open-height ~"-" 47px);
+    height: -o-calc(100% ~"-" @botom-open-height ~"-" 47px);
+    height: calc(100% ~"-" @botom-open-height ~"-" 47px);
+}
+#map-container.open2{
+    height: -moz-calc(100% ~"-" @botom-open2-height ~"-" 47px);
+    height: -webkit-calc(100% ~"-" @botom-open2-height ~"-" 47px);
+    height: -o-calc(100% ~"-" @botom-open2-height ~"-" 47px);
+    height: calc(100% ~"-" @botom-open2-height ~"-" 47px);
+}
+#opener-sidebar {
+    display: block;
+    float: left;
+    width: @left-sidebar-width;
+    height: calc(~'100% - @{top-bar-height}');
+    background-color: @base;
+    margin-left: 0px;
+    cursor: pointer;
+    padding-top: 12px;
+    z-index: 9;
+    position: relative;
+}
+#tool-sidebar {
+    display: block;
+    float: right;
+    width: @right-sidebar-width;
+    height: calc(~'100% - @{top-bar-height}');
+    background-color: @base;
+    margin-left: 0px;
+    position: relative;
+    z-index: 99;
+}
+.map-basic-tools{
+    width: auto;
+    overflow: hidden;
+    z-index: 2;
+    height: @top-bar-height !important;
+    background-color: @head-bar;
+}
+
+#selection-info{
+    width:100%;
+}
+#opener-bottombar{
+    border: 0px solid #C8C8C8;
+    border-radius: 0px 0px 0px 0px;
+    color: white;
+    padding: 0px 0px 0px 15px;
+    height: 15px;
+    position: relative;
+    z-index: 9 !important;
+}
+
+hr{
+    border-top: 1px solid #D0D0D0;
+}
+
+app-layertree button {
+    background: none;
+    border: 0;
+}
+app-layertree button:hover {
+    opacity: 0.7;
+}
+[ngeo-popup] {
+    top: 20px;
+    max-width: 350px;
+    width: 350px;
+    margin-left: 10px;
+    left: 50%;
+    right: 50%;
+    max-height: 400px;
+    position: fixed;
+}
+[ngeo-popup] .popover-content {
+    overflow: auto;
+    /*
+     * popup's height - popover-title's height
+     * should be computed using bootstrap variables
+     */
+    max-height: ~"calc(400px - 38px)";
+}
+@media (max-width: 768px) {
+    #map {
+        height: 200px;
+        width: 200px;
+    }
+    [ngeo-popup] {
+        position: fixed;
+        top: 0;
+        left: auto;
+        right: auto;
+        max-width: 100%;
+        width: ~"calc(100% - 20px)";
+        height: ~"calc(100% - 20px)";
+        max-height: none;
+        margin: 10px;
+    }
+}
+@media (max-width: 768px) {
+    [ngeo-popup] .popover-content {
+        /*
+         * popup's height - popover-title's height
+         * should be computed using bootstrap variables
+         */
+        max-height: ~"calc(100% - 32px)";
+        -webkit-overflow-scrolling: touch;
+    }
+}
+
+[ngeo-btn-group] {
+    padding: 5px;
+}
+#app-vmap .tooltip {
+    position: relative;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 4px;
+    color: white;
+    padding: 4px 8px;
+    /*opacity: 0.7;*/
+    white-space: nowrap;
+    position: fixed !important;
+    background: transparent;
+}
+.tooltip-inner {
+    max-width: 2000px !important;
+}
+.tool-btn{
+    border-top-left-radius: 50%;
+    border-top-right-radius: 50%;
+    border-bottom-left-radius: 50%;
+    border-bottom-right-radius: 50%;
+    display: block;
+    float: right;
+    width: 40px;
+    height: 40px;
+    background-color: white;
+    margin-right: 7px;
+    margin-top: 15px;
+    cursor: pointer;
+    z-index: 3;
+    position: relative;
+    box-shadow: 0px 0px 5px #000000;
+    background-position: 2px -32px;
+    background-repeat: no-repeat;
+    background-size: 85%;
+    text-align: center;
+    font-size: 21px;
+    line-height: 1.8;
+    color: @disable;
+}
+.tool-btn:hover{
+    box-shadow: 0px 0px 10px #000000 !important;
+    background-color: white;
+    color: @base;
+}
+.tool-btn-active{
+    color: @base;
+    background-position: 2px 2px !important;
+    background-color: @background !important;
+}
+.right-sidebar-closeband{
+    width:100%;
+    height:100%;
+    position:absolute;
+    float:left;
+}
+.layer-tools-btn{
+    border-top-left-radius: 50%;
+    border-top-right-radius: 50%;
+    border-bottom-left-radius: 50%;
+    border-bottom-right-radius: 50%;
+    display: block;
+    float: right;
+    width: 43px;
+    height: 43px;
+    margin-right: -27px;
+    cursor: pointer;
+    z-index: 3;
+    position: relative;
+    box-shadow: 0px 0px 5px #000000;
+    background-position: -1.5px -1px;
+    background-color: white;
+    color: @disable;
+    text-align: center;
+    font-size: 26px;
+    line-height: 1.5;
+}
+.layer-tools-btn:hover{
+    color: @base;
+    background-color: white;
+}
+.layer-tools-btn.open{
+    background-color: @background;
+    color: @base;
+}
+.module-title{
+    text-align: center;
+    margin: 0px;
+    padding: 6px !important;
+    height: 32px !important;
+    font-size: 14px;
+}
+.side-tool{
+    margin-bottom: 0px;
+}
+
+.checkbox input[type="checkbox"] {
+    z-index: auto;
+    z-index: initial;
+}
+
+.tree {
+    min-height:20px;
+    padding-bottom: 10px;
+    margin-bottom:0px;
+    -webkit-padding-start: 5px;
+    padding-left: 5px;
+    overflow: hidden;
+    /* top: 0px; */
+}
+.tree li {
+    list-style-type:none;
+    margin:0;
+    padding: 10px 4px 0px 9px;
+    position:relative
+        ;
+}
+.tree li::before, .tree li::after {
+    content: '';
+    left: -10px;
+    position:absolute;
+    right:auto;
+}
+.tree li::before {
+    border-left:1px solid #999;
+    bottom: 50px;
+    height: 100%;
+    top: 0px;
+    width: 1px;}
+.tree li::after {
+    border-top:1px solid #999;
+    height: 20px;
+    top:25px;
+    width: 20px;}
+/*.tree li span {
+    -moz-border-radius:5px;
+    -webkit-border-radius:5px;
+    border:1px solid #999;
+    border-radius:5px;
+    display:inline-block;
+    padding:3px 8px;
+    text-decoration:none
+}*/
+.tree li.parent_li>span {
+    cursor:pointer
+}
+.tree>ul>li::before, .tree>ul>li::after {
+    border:0
+}
+.tree li:last-child::before {
+    height:30px
+}
+.tree li.parent_li>span:hover, .tree li.parent_li>span:hover+ul li span {
+    background:#eee;
+    border:1px solid #94a0b4;
+    color:#000
+}
+.layers-tree-ul{
+    padding-bottom: 7px;
+}
+.list-group-item {
+    padding-top: 1px;
+    padding-bottom: 2px;
+    padding-left: 8px;
+    padding-right: 0px;
+    height: 25px;
+    border: 1px solid #C8C8C8;
+    z-index: 0 !important;
+    border-top-right-radius: 0px !important;
+    border-top-left-radius: 0px !important;
+    border-bottom-right-radius: 0px !important;
+    border-bottom-left-radius: 0px !important;
+}
+.list-group-item-modal {
+    cursor: pointer;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    padding-left: 15px;
+    padding-right: 0px;
+    height: auto;
+    margin-bottom: -3px;
+    z-index: 0 !important;
+    font-size: 14px;
+}
+.layertree-item{
+    margin-bottom: -8px !important;
+    padding-bottom: 0px !important;
+}
+.layer-menu{
+    top: auto;
+    left: auto;
+    padding: 4px 20px;
+    margin-top: 5px;
+    margin-left: 128px;
+    max-height: 50vh;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+.layer-menu-button{
+    margin-right: 7px;
+    margin-top: -2px;
+}
+.layer-menu-list{
+    min-width: 200px;
+    padding: 5px 0;
+}
+.layer-menu-list>li {
+    list-style-type: none;
+    margin: 0;
+    padding: initial;
+    position: inherit;
+}
+.layer-menu-list>li::before, .layer-menu-list>li::after {
+    border: none;
+}
+.layer-menu-list>li>a {
+    display: block;
+    color: #333;
+    white-space: nowrap;
+}
+.layer-menu-list>li>a:focus, .layer-menu-list>li>a:hover {
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5;
+}
+.layer-menu-list-slider{
+    width: 100%;
+    transform: translate(0%, 0%);
+}
+.separate{
+    display: table;
+    border-collapse: separate;
+    width: 100%
+}
+.second-item{
+    padding: 6px 12px;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 1;
+    color: #555;
+    text-align: center;
+    background-color: transparent;
+    border-radius: 0px;
+    float: right;
+}
+.info-container-list-events-column{
+    font-size: 12px;
+}
+
+.ol-overviewmap{
+    bottom: 64px;
+}
+.ol-zoom-extent{
+    top: 5.2em;
+    left: .5em;
+}
+.ol-zoomslider{
+    top: 11.5em;
+    left: 0.65em;
+}
+.ol-zoom {
+    top: 7.5em;
+    left: .5em;
+}
+.ol-full-screen{
+    top: 30px;
+}
+.ol-attribution.ol-logo-only{
+    bottom: -1.6em;
+}
+/*.ol-current-projection{
+    bottom: 8px;
+    right: ~"calc(53% - 120px)";
+}*/
+/*.ol-map-name{
+    top: 8px;
+    right: ~"calc(53% - 80px)";
+}*/
+.ol-current-projection {
+    bottom: 8px;
+    position: absolute;
+    left: 0;
+    right: 0;
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+    background-color: transparent;
+}
+.ol-map-name {
+    top: 8px;
+    position: absolute;
+    left: 0;
+    right: 0;
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+    background-color: transparent;
+}
+#map-name, #current-projection{
+    position: initial;
+}
+.ol-current-scale{
+    bottom: 34px;
+    left: .5em;
+}
+#current-scale{
+    font-size: 12px;
+}
+.set-scale-btn:hover, .set-scale-btn:focus{
+    color: white !important;
+}
+.ol-mouse-position {
+    top: inherit;
+    bottom: 8px;
+    right: 8px;
+    position: absolute;
+    font-size: 12px;
+}
+.ol-rotate {
+    left: 0.5em;
+    right: auto;
+    right: initial;
+    top: 5em;
+}.ol-rotate-reset {
+    font-size: 10px;
+}
+.ol-control button {
+    font-weight: auto;
+    font-weight: initial;
+}
+.ol-overlaycontainer-stopevent-visible{
+    /*    height: 100%;
+        width: 100%;*/
+    top: 0;
+    left: 0;
+    position: absolute;
+}
+.ol-popup {
+    position: absolute;
+    background-color: white;
+    -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
+    filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
+    padding: 15px;
+    border-radius: 10px;
+    border: 1px solid #cccccc;
+    bottom: 12px;
+    left: -50px;
+    z-index: 10;
+}
+.ol-popup:after, .ol-popup:before {
+    top: 100%;
+    border: solid transparent;
+    content: " ";
+    height: 0;
+    width: 0;
+    position: absolute;
+    pointer-events: none;
+}
+.ol-popup:after {
+    border-top-color: white;
+    border-width: 10px;
+    left: 48px;
+    margin-left: -10px;
+}
+.ol-popup:before {
+    border-top-color: #cccccc;
+    border-width: 11px;
+    left: 48px;
+    margin-left: -11px;
+}
+.ol-popup-closer {
+    text-decoration: none;
+    position: absolute;
+    top: 4px;
+    right: 8px;
+}
+.ol-popup-closer:after {
+    content: "✖";
+}
+.ol-popup-list{
+    text-decoration: none;
+    position: absolute;
+    top: 6px;
+    right: 27px;
+}
+.ol-popup-edit{
+    text-decoration: none;
+    position: absolute;
+    top: 6px;
+    left: 28px;
+}
+.ol-popup-card{
+    text-decoration: none;
+    position: absolute;
+    top: 6px;
+    left: 8px;
+}
+.ol-popup-buttons-container{
+    height: 7px;
+}
+.map-popup-cell{
+    min-width: 70px;
+}
+.btn-default.active{
+    z-index: 0 !important;
+}
+.layer-order-list{
+    margin: 0px 0px 13px 0px;
+    padding: 0px 0px 0px 0px;
+}
+.order-layer{
+    width: 80%;
+    display: inline-block;
+    padding: 1px 8px;
+    text-decoration: none;
+    display: block;
+    float: left;
+    margin-top: 2px;
+    cursor: grab;
+    cursor: -webkit-grab;
+    cursor:-moz-grab;
+}
+.order-layer:active,
+.order-layer:focus{
+    cursor: grabbing;
+    cursor: -webkit-grabbing;
+    cursor:-moz-grabbing;
+}
+.layer-order-item{
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    border: 1px solid #C8C8C8;
+    border-radius: 5px;
+    display: inline-block;
+    text-decoration: none;
+    width: 96%;
+    min-width: 200px !important;
+    max-width: 216px !important;
+    height: 28px;
+    margin-bottom: -1px;
+    margin-left: 5px !important;
+    margin-right: 0px;
+    background-color: white;
+}
+.selection-layer-order-item{
+    display: none;
+}
+.toolcontainer{
+    margin-bottom: 0px;
+    background-color: #fbfbfb;
+    border: 1px solid #999;
+    -webkit-padding-start: 5px;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.tool{
+    padding-bottom: 19px;
+}
+.layers-tool{
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+.inline-checkbox{
+    float: right;
+    margin-top: 2px !important;
+    padding-left: 14px;
+    margin-bottom: 0px;
+    padding-right: 5px;
+}
+.inline-checkbox label{
+    padding-left: 0px;
+}
+.sublayer-checkbox{
+    margin-top: 2px !important;
+    margin-bottom: 0px;
+}
+.well{
+    margin-bottom: 10px !important;
+}
+.carousel-control.right {
+    right: -15 !important;
+    background-image: -webkit-linear-gradient(left,transparent 0,transparent 100%) !important;
+    background-image: -o-linear-gradient(left,transparent 0,transparent 100%) !important;
+    background-image: -webkit-gradient(linear,left top,right top,from(transparent),to(transparent)) !important;
+    background-image: linear-gradient(to right,transparent 0,transparent 100%) !important;
+}
+.carousel-control.left {
+    left: -15 !important;
+    background-image: -webkit-linear-gradient(left,transparent 0,transparent 100%) !important;
+    background-image: -o-linear-gradient(left,transparent 0,transparent 100%) !important;
+    background-image: -webkit-gradient(linear,left top,right top,from(transparent),to(transparent)) !important;
+    background-image: linear-gradient(to right,transparent 0,transparent 100%) !important;
+}
+.carousel-control {
+    color: black !important;
+}
+.carousel-indicators {
+    position: auto !important;
+    position: initial !important;
+    width: 100% !important;
+    margin-left: 0 !important;
+    margin-bottom: -17px !important;
+    margin-top: 5px !important;
+
+}
+.carousel-indicators li {
+    display: inline-block;
+    width: 10px;
+    height: 10px;
+    margin: 1px;
+    text-indent: -999px;
+    cursor: pointer;
+    background-color: transparent !important;
+    background-color: black !important;
+    opacity: .5 !important;
+    border: 1px solid #FFF;
+    border-radius: 10px;
+}
+.map-description-modal-button{
+    cursor: pointer;
+}.map-description-modal-button:hover{
+    opacity: 0.5;
+}
+.mapmodal-element{
+    position: absolute;
+    padding-right: 40px;
+    overflow: scroll;
+    height: 100%;
+    width: 97%;
+}
+/*with big header*/
+.modal-footer {
+    /*padding: 3px 15px;*/
+}
+.active{
+    z-index: 2;
+}
+/*.form-control{
+    padding: 6px 6px 6px 6px !important;
+}*/
+.legend{
+    border: 0px;
+}
+.legend-img{
+    max-width: (@left-sidebar-content-width - 30px);
+}
+.layer-name{
+    display: inline-block;
+    overflow: hidden;
+    font-size: 11px;
+    padding-top: 1px;
+}
+.layer-name-tree{
+    width: 77%;
+}
+.layer-name-order{
+    width: 85%;
+}
+.legend-glyphicon{
+    float: left;
+    padding-right: 8px;
+    padding-top: 2px;
+}
+.layer-checkboxes{
+    position: absolute;
+    top: 1px;
+    right: -5px;
+}
+.sublayer-checkboxes{
+    height: 25px;
+}
+.sublayer-checkboxes>div{
+    float: left !important;
+}
+.alert-warning {
+    font-size: 13px;
+}
+.WMSSuggestion{
+    max-width: 255px;
+    font-size: 12px;
+    overflow: hidden;
+}
+.WMSSuggestionTitle{
+    max-width: 255px;
+    font-size: 14px;
+    overflow: hidden;
+}
+.WMSSuggestionsButton{
+    text-align: right;
+    width: auto;
+}
+.selection-frame{
+    width: 100%;
+    border: 1px solid #999;
+    border-radius: 5px
+}
+.open-selection-info{
+    width: 94%
+}
+.open-more-selection-info{
+    width: 6%;
+    text-align: center;
+    opacity: .4;
+}
+.open-more-selection-info:hover{
+    opacity: .2;
+}
+.btn-open-more-selection-info{
+    font-size: 21px;
+    font-weight: 700;
+    line-height: 1;
+    color: white;
+    filter: alpha(opacity=20);
+    -webkit-appearance: none;
+    padding: 0;
+    cursor: pointer;
+    background: 0 0;
+    border: 0;
+}
+.table-selections {
+    font-size: 12px;
+}
+.load-img{
+    display: none;
+    text-align: center;
+    margin-top: 50px;
+}
+.layerstree-phather{
+    overflow: hidden;
+    /*    background-color: white;
+            margin-right: 5px;
+            border: 1px solid #ccc;
+            padding: 2px 0px 0px 10px;*/
+}
+.tree-father-collapse-btn{
+    overflow: hidden;
+    cursor: pointer;
+}.tree-father-collapse-btn:hover{
+    opacity: 0.5;
+}
+.layerstree-phather>.tree-father-collapse-btn{
+    width: 80%;
+}
+.legend_father_name{
+    overflow: hidden;
+    cursor: pointer;
+    float: left;
+    width: 92%;
+    margin-top: 4px;
+}.legend_father_name:hover{
+    opacity: 0.5;
+}
+.my-map-tree{
+    border: 0px;
+}
+
+/* Drop zone */
+.upload-drop-zone {
+    height: 125px;
+    border-width: 2px;
+    margin-bottom: 20px;
+}
+.upload-drop-zone {
+    color: #ccc;
+    border-style: dashed;
+    border-color: #ccc;
+    line-height: 125px;
+    text-align: center
+}
+.upload-drop-zone.drop {
+    color: #222;
+    border-color: #222;
+}
+.btn-map-manager{
+    width: ~"calc(100% - 4px)";
+    margin: 4px 2px 4px 2px;
+    padding: 2px 12px;
+}
+.layertree-button-content{
+    padding-left: 11px;
+    background-color: @head-bar !important;
+}
+.layersorder-button-content{
+    background-color: @head-bar !important;
+    padding: 0px 0px 0px 11px;
+}
+.list-group-icon{
+    font-size: 15px;
+    line-height: 0;
+    top: 2px;
+    position: relative;
+    padding: 0px 10px 0px 0px;
+}
+.list-group-icon2{
+    font-size: 21px;
+    line-height: 0;
+    position: relative;
+    padding: 8px 8px 0px 0px;
+    float: right;
+}
+.maplegend-button-content{
+    padding-left: 11px;
+    background-color: @head-bar !important;
+}
+.list-group-item.active{
+    border-color: @background !important;
+    padding-top: 4px;
+}
+.indicators{
+    text-align: right;
+    font-size: 15px;
+    word-spacing: 3px;
+    padding: 2px 8px 0px 0px;
+}
+.tree-element{
+    margin: -9px 0px 5px 0px !important;
+    padding-left: 25px;
+}
+.icon-measure {
+    font-size: 19px;
+    line-height: 0.7 !important;
+}
+.map-tooltip {
+    position: relative;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 4px;
+    color: white;
+    padding: 4px 8px;
+    opacity: 0.7;
+    white-space: nowrap;
+}
+.hr{
+    border-top: 1px solid #D0D0D0;
+    margin: 10px 15px;
+}
+.hr-gray{
+    border-top: 1px solid gray !important;
+    margin: 10px 15px;
+}
+.arrow-collapse {
+    margin: 0px 5px 0px 16px !important;
+    font-size: 24px;
+    line-height: 0;
+    top: 5px;
+}
+.list-menu{
+    padding: 0px;
+    margin: 10px 0px;
+}
+.list-menu>li {
+    cursor: pointer;
+}
+.list-menu>li>a {
+    display: block;
+    padding: 3px 25px;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.42857143;
+    color: @color-text-2;
+    white-space: nowrap;
+    min-height: 24px;
+}
+.list-menu>li>a.active,
+.list-menu>li>a:focus,
+.list-menu>li>a:hover {
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5;
+}
+.list-menu>li>a.active::before{
+    line-height: 0;
+    margin: 0px 8px 0px -16px;
+}
+.list-menu>li>a>.checkbox{
+    padding-left: 12px
+}
+
+.measure-tooltip {
+    position: relative;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 4px;
+    color: white;
+    padding: 4px 8px;
+    opacity: 0.7;
+    white-space: nowrap;
+}
+.measure-tooltip-measure {
+    opacity: 1;
+    font-weight: bold;
+}
+.measure-tooltip-static {
+    background-color: #ffcc33;
+    color: black;
+    border: 1px solid white;
+}
+.measure-tooltip-measure:before,
+.measure-tooltip-static:before {
+    border-top: 6px solid rgba(0, 0, 0, 0.5);
+    border-right: 6px solid transparent;
+    border-left: 6px solid transparent;
+    content: "";
+    position: absolute;
+    bottom: -6px;
+    margin-left: -7px;
+    left: 50%;
+}
+.measure-tooltip-static:before {
+    border-top-color: white;
+}
+.print-tooltip{
+    position: relative;
+    color: white;
+    padding: 4px 8px;
+    white-space: nowrap;
+}
+.print-tooltip-element{
+    color: black;
+    height: 100px;
+}
+.print-tooltip-title{
+    left: 0px;
+    top: 0px;
+    bottom: auto;
+    right: auto;
+    bottom: initial;
+    right: initial;
+    position: fixed;
+    width: 100%;
+    text-align: center;
+}
+.print-fixed{
+    position: fixed;
+    top: 15px;
+    right: 10px;
+    z-index: 4;
+    width: 215px;
+    background-color: @background;
+    border-radius: 4px;
+    padding: 0px 15px 0px 15px;
+}
+
+/* Bandeau "outils de base" */
+.basic-tools-dropdown-measure-content{
+    margin: -11px 0px 0px -119px !important;
+    width: auto;
+    text-align: center;
+    background-color: @head-bar;
+    border: 1px solid @head-bar;
+}
+.basic-tools-dropdown-select-content {
+    margin: -9px 0px 0px -90px !important;
+    width: auto;
+    text-align: center;
+    background-color: @head-bar;
+    border: 1px solid @head-bar;
+}
+.basic-tools-dropdown-basicselect-content{
+    margin: -9px 0px 0px 0px !important;
+    width: auto;
+}
+.basic-tools-dropdown-basicselect-content>li>ul {
+    list-style-type: none;
+    padding-left: 17px;
+}
+.basic-tools-dropdown-basicselect-content>li>ul>li>a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.42857143;
+    color: #333;
+    white-space: nowrap;
+}
+.basic-tools-dropdown-basicselect-content>li>ul>li>a:focus,
+.basic-tools-dropdown-basicselect-content>li>ul>li>a:hover {
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5;
+}
+.basic-tools-dropdown-select-modifypalette-content{
+    top: 38px !important;
+    width: auto;
+    text-align: center;
+    background-color: @head-bar;
+    border: 1px solid @head-bar;
+}
+.basic-tools-dropdown-select-getFeatureInfo-content{
+    top: 38px !important;
+    right: 25px;
+    height: ~"calc(100% - 68px)";
+    width: 40%;
+    min-width: 568px;
+}
+.basic-tools-dropdown-select-getFeatureInfo-calque-result{
+    overflow: auto;
+    height: 100%;
+}
+.basic-tools-dropdown-controls-content {
+    margin: -10px 0px 0px -135px !important;
+    width: auto;
+    text-align: center;
+    background-color: @head-bar;
+    border: 1px solid @head-bar;
+}
+.dropdown-menu>li>a
+.basic-tools-dropdown-btn{
+    cursor: pointer;
+}
+.gray-list-menu > li > div.active, .gray-list-menu > li > div:focus, .gray-list-menu > li > div:hover{
+    color: gray !important;
+}
+.list-menu > li > div.active, .list-menu > li > div:focus, .list-menu > li > div:hover{
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5;
+}
+.basic-tools-container-out{
+    padding-top: 100%;
+    background-color: rgb(105, 105, 105);
+    overflow: hidden;
+}
+.basic-tools-dropdown-title{
+    text-align: left;
+    font-size: 12px;
+    color: @color-text-1;
+}
+.basic-tools-dropdown-menu{
+    min-width: 160px;
+    padding: 0px;
+    margin-top: -5px;
+    font-size: 12px;
+    text-align: left;
+    list-style: none;
+    color: @color-text-1;
+}
+.basic-tools-dropdown-menu>li {
+    cursor: pointer;
+}
+.basic-tools-dropdown-menu>li>a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.42857143;
+    color: @color-text-1;
+    white-space: nowrap;
+    min-height: 24px;
+}
+.basic-tools-dropdown-menu>li>a.active,
+.basic-tools-dropdown-menu>li>a:focus,
+.basic-tools-dropdown-menu>li>a:hover {
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5;
+}
+.basic-tools-dropdown-menu>li>a.active::before{
+    line-height: 0;
+    margin: 0px 8px 0px -17px;
+}
+.basic-tools-dropdown-menu>li>a>.checkbox{
+    padding-left: 12px
+}
+.basic-tools-element{
+    background-color: transparent;
+    color: @color-text-1;
+}
+.basic-tools-element.inactive, .basic-tools-element.inactive:hover{
+    background-color: #838383 !important;
+    color: #A5A5A5 !important;
+    cursor : not-allowed !important;
+}
+.basic-tools-element.active{
+    background-color: @basic-tool-active !important;
+    color: @head-bar !important;
+}
+.basic-tools-element.active2{
+    background-color: white !important;
+    color: @head-bar !important;
+}
+.nav-pills>div>li>a:focus{
+    background-color: transparent;
+    color: white;
+}
+.basic-tools-nav>div>li>a:hover{
+    background-color: @basic-tool-active;
+    text-decoration: none;
+    color: gray;
+}
+.basic-tools-nav .open>a{
+    background-color: transparent;
+    color: white;
+}
+.basic-tools-nav>div>li>a {
+    border-radius: 0px;
+}
+.basic-tools-nav>div>li {
+    float: left;
+}
+.basic-tools-nav>div>li {
+    position: relative;
+    display: block;
+}
+
+.basic-tools-nav>div>li>a {
+    position: relative;
+    display: block;
+    padding: 8px 10px 15px 10px;
+}
+
+.basic-tools-dropdown-element{
+    top: auto;
+    left: auto;
+    top: initial;
+    left: initial;
+    position: fixed;
+    margin: -3px 0 0;
+    z-index: 1042;
+}
+.basic-tools-select-container{
+    margin: 8px 10px;
+}
+#basictools-select-geometry-selection-button.active{
+    box-shadow: none;
+    background-color: white;
+    color: @color-text-2;
+}
+.basic-tools-select-display-type-title{
+    font-size: 10px;
+    text-align: center;
+    margin-bottom: 6px;
+}
+.basic-tools-select-display-type-button{
+    cursor: pointer;
+    /*border: 1px solid transparent;*/
+    /*border-radius: 15px;*/
+}
+.basic-tools-select-display-type-button:hover,
+.basic-tools-select-display-type-button.active {
+    color: white;
+    /*border: 1px solid white;*/
+}
+.basic-tools-select-draw-tools,
+.basic-tools-insert-draw-tools{
+    width: 100%;
+    margin: 10px 0px 0px 0px;
+    text-align: center;
+}
+.basic-tools-select-draw-tools>div,
+.basic-tools-insert-draw-tools>div{
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+.basic-tools-select-draw-tools>div:hover,
+.basic-tools-select-draw-tools>.active,
+.basic-tools-insert-draw-tools>div:hover,
+.basic-tools-insert-draw-tools>.active{
+    cursor: pointer;
+    color: @color-text-2;
+    background-color: @color-text-1;
+    border-radius: 2px;
+}
+/*.select_modal_table_container{
+    height: ~"calc(100% - 60px)"
+}*/
+.modal{
+    text-align: left;
+}
+
+#infocontainer{
+    background-color: @background;
+    z-index: 9;
+}
+#infocontainer-info-container{
+    width: 100%;
+    height: 100%;
+}
+#infocontainer-info-lists{
+    width: 100%;
+    height: calc(100% ~"-" 28px);
+    position: relative;
+    overflow: auto;
+}
+.infocontainer-table{
+    width: 100%;
+}
+.infocontainer-table.active{
+    z-index: 1;
+}
+.infocontainer-nav-element {
+    padding-top: 0px !important;
+    padding-bottom: 0px !important;
+    background-color: gray;
+    margin-right: -5px !important;
+    border-radius: 0px !important;
+}
+.infocontainer-table-toolbar{
+    float: right;
+    margin: 2px 0px 0px 5px;
+}
+.infocontainer-table-content{
+    font-weight: 600;
+    position: absolute;
+    border: 1px solid gray;
+    top: -2px;
+}
+#infocontainer-nav{
+    margin-bottom: -8px;
+}
+.infocontainer-nav-title{
+    line-height: 1.8;
+}
+.nav-infocontainer{
+    margin-top: 2px;
+    margin-bottom: -1px;
+    max-width: ~"calc(100% - 175px)";
+}
+.nav-infocontainer>li>a:hover{
+    background-color: gray;
+    color: white;
+}
+.nav-infocontainer>li{
+    margin: 0px 6px;
+}
+.nav-infocontainer>li>a{
+    position: relative;
+    display: block;
+    padding: 0px 4px 0px 7px;
+    height: 27px;
+    margin-top: 1px;
+}
+.nav-infocontainer>li.active>a{
+    border: 1px solid darkgray;
+    border-bottom: transparent;
+}
+.nav-infocontainer>li.active>a, .nav-infocontainer>li.active>a:focus, .nav-infocontainer>li.active>a:hover{
+    color: black;
+    background-color: white;
+}
+.infocontainer-btn-close-tab{
+    height: 21px;
+    width: 13px;
+    line-height: 0.6;
+    margin-left: 0px;
+    padding: 2px 2px 1px 2px;
+    font-size: 11px;
+    border-radius: 3px;
+}
+.nav-infocontainer>li>a>.infocontainer-btn-close-tab:hover{
+    background-color: lightgray;
+    color: gray;
+}
+.nav-infocontainer>li.active>a>.infocontainer-btn-close-tab:hover{
+    background-color: gray;
+    color: lightgray;
+}
+.infocontainer-btn-reports{
+    position: absolute;
+    top: 4px;
+    right: 4px;
+}
+.infocontainer-btn-export{
+    position: absolute;
+    top: 4px;
+    right: 84px;
+}
+.infocontainer-btn-remove-location{
+    position: absolute;
+    top: 4px;
+    right: 176px;
+}
+.infocontainer-table>.bootstrap-table>.fixed-table-toolbar>.search>input{
+    margin-top: -23px;
+    height: 22px;
+    font-size: 12px;
+    line-height: 1.5;
+    border-radius: 3px;
+}
+.infocontainer-table>div>.fixed-table-toolbar>div>input {
+    width: 150px;
+    margin-left: -150px;
+    margin-right: 150px;
+}
+#info-container{
+    width: 100%
+}
+
+/* Print */
+.basic-tools-dropdown-print-content {
+    margin: -9px 0px 0px -123px !important;
+    padding: 9px 21px 9px 19px;
+    width: auto;
+    text-align: center;
+    background-color: @head-bar;
+    border: 1px solid @head-bar;
+}
+
+/*  Location  */
+.input-xs{
+    height: 25px;
+    padding: 5px 10px;
+    font-size: 12px;
+    line-height: 1.5;
+    border-radius: 3px;
+}
+.location-tool-search{
+    width: 220px;
+}
+.location-search-dropdown-content{
+    display: block;
+    width: 450px;
+    max-height: 370px;
+    overflow: auto;
+}
+.location-search-dropdown-result{
+    border-top: 1px solid #D0D0D0;
+    padding: 20px 20px 0px 20px;
+}
+.location-search-dropdown-result:hover{
+    box-shadow: 0px 0px 16px #000000 !important;
+}
+.location-search-dropdown-result:hover>.location-search-dropdown-result-buttons{
+    opacity: 1;
+}
+.location-search-dropdown-result-buttons{
+    opacity: 0;
+    text-align: right;
+}
+.location-search-dropdown-result-buttons.collapsed>i {
+    -ms-transform: rotate(-90deg);
+    -webkit-transform: rotate(-90deg);
+    transform: rotate(-90deg);
+}
+
+#location-search-form{
+    background-color: white;
+    border-radius: 3px;
+    height: 24px;
+    padding-top: 2px;
+    margin-top: 4px;
+    min-width: 128px;
+}
+#location-search-input{
+    border-radius: 3px;
+    border: 0px;
+    padding-left: 7px;
+    margin-right: -8px;
+    width: 120px;
+}
+#location-search-input:focus{
+    outline: transparent;
+}
+#location-search-api-select{
+    height: 22px;
+    padding: 0px !important;
+    font-size: 11px;
+    border-color: transparent;
+    background-color: transparent;
+    color: #337ab7;
+    overflow: visible;
+    cursor: pointer;
+    margin-right: -2px;
+}
+#location-search-api-select:hover{
+    color: #23527c
+}
+#location-search-api-select:focus{
+    outline: transparent;
+}
+#select-bo-select{
+    height: 22px;
+    padding: 0px !important;
+    font-size: 11px;
+    border-color: transparent;
+    background-color: transparent;
+    color: #337ab7;
+    overflow: visible;
+    cursor: pointer;
+    margin-right: -2px;
+}
+#select-bo-select:hover{
+    color: #23527c
+}
+#select-bo-select:focus{
+    outline: transparent;
+}
+
+
+
+/* DRAW */
+
+.btn-draw {
+    margin: 5px 0px;
+    text-align: left !important;
+    border-top-right-radius: 4px !important;
+    border-top-left-radius: 4px !important;
+    border-bottom-right-radius: 4px !important;
+    border-bottom-left-radius: 4px !important;
+}
+.btn-draw-group {
+    width: 100%;
+    padding: 0px 10px;
+}
+.draw-tooltip {
+    position: relative;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 4px;
+    color: white;
+    padding: 4px 8px;
+    opacity: 0.7;
+    white-space: nowrap;
+}
+.draw-tooltip-draw {
+    opacity: 1;
+    font-weight: bold;
+}
+.draw-tooltip-static {
+    color: black;
+    border: 1px solid white;
+}
+.draw-tooltip-draw:before,
+.draw-tooltip-static:before {
+    border-top: 6px solid rgba(0, 0, 0, 0.5);
+    border-right: 6px solid transparent;
+    border-left: 6px solid transparent;
+    content: "";
+    position: absolute;
+    bottom: -6px;
+    margin-left: -7px;
+    left: 50%;
+}
+.draw-tooltip-static:before {
+    border-top-color: white;
+}
+.save-form-btn {
+    float: right !important;
+    margin-top: 15px;
+}
+.color-span{
+    padding: 0px 18px;
+    background-image: url("../images/transparent.png");
+}
+.color-span2{
+    position: absolute;
+    width: 38px;
+    height: 31px;
+    left: 0px;
+    border-radius: 4px 0px 0px 4px !important;
+    background-color: transparent;
+}
+.draw-list-checkbox{
+    padding-left: 20px !important;
+    margin-right: -23px !important;
+    margin-top: 7px !important;
+    margin-bottom: 0px !important;
+}
+.draw-list-checkbox-all{
+    padding-left: 20px !important;
+    margin-right: -23px !important;
+    margin-top: 7px !important;
+    margin-bottom: 0px !important;
+}
+.order-by-column{
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: 2px;
+    vertical-align: middle;
+    border-top: 4px solid;
+    border-right: 4px solid transparent;
+    border-left: 4px solid transparent;
+}
+.draw-features-list{
+}
+.fixed-table-body{
+    /*    height: 85%;
+    */}
+.draw-features-list-container{
+}
+.draw-features-list-button-column{
+    width: 115px;
+}
+
+/* Cadastre */
+.fixed-table-toolbar .bars, .fixed-table-toolbar .columns, .fixed-table-toolbar .search{
+    margin-top: 0px;
+    margin-bottom: 2px;
+    line-height: 0;
+}
+.cadastre {
+    padding: 0px 4px 0px 4px;
+    width: 100%;
+    height: ~"-moz-calc(100% - 181px)";
+    height: ~"-webkit-calc(100% - 181px)";
+    height: ~"-o-calc(100% - 181px)";
+    height: ~"calc(100% - 181px)";
+    overflow-x: hidden;
+}
+.cadastre-map-search {
+    height: ~"-moz-calc(100% - 62px)";
+    height: ~"-webkit-calc(100% - 62px)";
+    height: ~"-o-calc(100% - 62px)";
+    height: ~"calc(100% - 62px)";
+}
+.cadastre.active{
+    z-index: 1;
+}
+.parcelle {
+    padding: 0px 0px;
+    width: 98%;
+    height: ~"-moz-calc(100% - 67px)";
+    height: ~"-webkit-calc(100% - 67px)";
+    height: ~"-o-calc(100% - 67px)";
+    height: ~"calc(100% - 67px)";
+}
+.btn-dropdown{
+    color: #555;
+    background-color: white;
+    border: 1px solid #ccc;
+    width: 100%;
+    text-align: left;
+}
+.cadastre-table-list>tbody>.selected>td {
+    background-color: #1E90FF;
+    color: white;
+}
+.cadastre-table-list>tbody>tr>.bs-checkbox,
+.cadastre-table-list>thead>tr>.bs-checkbox {
+    display: none;
+}
+.bootstrap-table .cadastre-table-list,
+.bootstrap-table .cadastre-table-list>tbody>tr>td,
+.bootstrap-table .cadastre-table-list>tbody>tr>th,
+.bootstrap-table .cadastre-table-list>tfoot>tr>td,
+.bootstrap-table .cadastre-table-list>tfoot>tr>th,
+.bootstrap-table .cadastre-table-list>thead>tr>td {
+    padding: 3px 10px !important;
+}
+.bootstrap-table .cadastre-table-list-with-checkbox,
+.bootstrap-table .cadastre-table-list-with-checkbox>tbody>tr>td,
+.bootstrap-table .cadastre-table-list-with-checkbox>tbody>tr>th,
+.bootstrap-table .cadastre-table-list-with-checkbox>tfoot>tr>td,
+.bootstrap-table .cadastre-table-list-with-checkbox>tfoot>tr>th,
+.bootstrap-table .cadastre-table-list-with-checkbox>thead>tr>td {
+    padding: 3px 10px !important;
+}
+.cadastre > .bootstrap-table > .fixed-table-container {
+    background-color: white;
+    max-height: 250px;
+    overflow: auto;
+}
+.cadastre-list-select-all{
+    padding: 4px 8px;
+    font-size: 8px;
+}
+.cadastre>.bootstrap-table>.fixed-table-toolbar>.search>input {
+    height: 22px;
+    padding: 5px 10px;
+    font-size: 11px;
+    line-height: 1.5;
+    border-radius: 3px;
+}
+.cadastre-select-on-map-btn-container{
+    width: 100%;
+    text-align: center;
+    margin-top: 10px
+}
+.cadastre-select-on-map-btn-dropdown{
+    right: 15px;
+    left: 15px;
+}
+.cadastre-btn-container{
+    position: absolute;
+    bottom: 0px;
+    background-color: #5CB85C;
+    width: 100%;
+}
+.cadastre-btn-container-title{
+    text-align: center;
+    color: white;
+    font-size: 12px;
+    margin: 6px 0px 2px 0px;
+}
+.cadastre-btn-container-actions{
+    height: 50px;
+}
+.cadastre-btn-container-actions-element{
+    float: left;
+    background-color: #449d44;
+    width: ~"-moz-calc(25% - 2px)";
+    width: ~"-webkit-calc(25% - 2px)";
+    width: ~"-o-calc(25% - 2px)";
+    width: ~"calc(25% - 2px)";
+    margin: 1px;
+    text-align: center;
+    color: white;
+    font-size: 10px;
+    position: relative;
+    height: 51px;
+}
+.cadastre-btn-container-actions-element:hover{
+    cursor: pointer;
+    background-color: #58AB58;
+}
+.cadastre-btn-container-actions-element-3{
+    float: left;
+    background-color: #449d44;
+    width: ~"-moz-calc(33.333333% - 2px)";
+    width: ~"-webkit-calc(33.333333% - 2px)";
+    width: ~"-o-calc(33.333333% - 2px)";
+    width: ~"calc(33.333333% - 2px)";
+    margin: 1px;
+    text-align: center;
+    color: white;
+    font-size: 10px;
+    position: relative;
+    height: 51px;
+}
+.cadastre-btn-container-actions-element-3:hover{
+    cursor: pointer;
+    background-color: #58AB58;
+}
+.cadastre-btn-container-rapports{
+    text-align: center;
+    margin: 7px 0px;
+}
+.cadastre-btn-container-rapports>.btn{
+    color: #fff;
+    background-color: #449d44;
+    width: 95%;
+    border-radius: 13px;
+}
+.cadastre-btn-container-rapports>.btn:hover{
+    background-color: #51A751;
+    border-color: #449d44;
+}
+.cadastre-btn-container-actions-element-icon{
+    font-size: 14px;
+    margin-top: 5px;
+    margin-left: 25%;
+    margin-right: 25%;
+}
+.forms-container{
+    width: 100%;
+    height: ~"-moz-calc(100% - 62px)";
+    height: ~"-webkit-calc(100% - 62px)";
+    height: ~"-o-calc(100% - 62px)";
+    height: ~"calc(100% - 62px)";
+}
+.cadastre-rapport-table-container{
+    max-height: ~"-moz-calc(100% - 100px)";
+    max-height: ~"-webkit-calc(100% - 100px)";
+    max-height: ~"-o-calc(100% - 100px)";
+    max-height: ~"calc(100% - 100px)";
+    overflow: scroll;
+}
+.cadastre-rapport-table-container>.bootstrap-table{
+    height: 100%;
+}
+.cadastre-rapport-table-container>.bootstrap-table>.fixed-table-container{
+    height: 100%;
+}
+.cadastre-rapports-fiche-btn{
+    cursor: pointer;
+    font-size: 14px;
+    border: 1px solid transparent;
+    padding: 0px 15px;
+    background-color: #fff;
+    width: 100%;
+    text-align: left;
+}
+.cadastre-rapports-fiche-btn:hover{
+    opacity: 0.7;
+    border: 1px solid gray;
+    border-radius: 5px;
+}
+.cadastre-rapports-fiche-btn:disabled{
+    opacity: 0.5;
+    cursor: not-allowed;
+}
+.cadastre-label{
+    font-size: 11px;
+    margin-top: 5px;
+}
+.cadastre-table-btn-group{
+    font-size: 12px;
+}
+
+.panel-title>.collapsed>i {
+    -ms-transform: rotate(-90deg);
+    -webkit-transform: rotate(-90deg);
+    transform: rotate(-90deg);
+}
+#cadastre-tools>.nav-tabs{
+    height: 30px;
+}
+#cadastre-tools>.nav-tabs>li>a{
+    cursor: pointer !important;
+    border-top: 0px solid #fff;
+    margin: 0px 8px 0px 8px;
+    font-size: 12px;
+    height: 30px;
+}
+#cadastre-tools>.nav-tabs>li.active>a, #cadastre-tools>.nav-tabs>li.active>a:focus, #cadastre-tools>.nav-tabs>li.active>a:hover{
+    cursor: pointer !important;
+    background-color: #ddd;
+    border-top: 1px solid #fff;
+    border-radius: 7px 7px 0px 0px;
+    margin: 0px 8px 0px 8px;
+    color: #337ab7;
+    font-weight: 700;
+    font-size: 12px;
+    height: 30px;
+}
+#cadastre-map-search-collapse-advanced-search{
+    overflow-y: scroll;
+    max-height: ~"calc(100vh - 313px)";
+}
+
+.map-list-litle-panel{
+    width: 550px;
+    margin-top: -4px;
+}
+.map-list-litle-panel-list{
+    width: 100%;
+    max-height: 500px;
+    overflow-y: scroll;
+    overflow-x: hidden;
+}
+@media only screen and (max-height:550px) {
+    .map-list-litle-panel-list{
+        max-height: 225px;
+    }
+}
+@media only screen and (max-height:400px) {
+    .map-list-litle-panel-list{
+        max-height: 130px;
+    }
+}
+@media only screen and (max-width:600px) {
+    .map-list-litle-panel-list{
+        max-height: 130px;
+    }
+}
+
+
+.img-map{
+    height: 60px;
+    width: 100px;
+    background-size: cover;
+    border: 1px solid #ABABAB;
+    margin-left: auto !important;
+    margin-right: auto !important;
+}
+.my-card-logo{
+    font-size: 20px;
+    vertical-align: text-bottom;
+    margin-right: 6px;
+}
+
+
+.tooltip-error{
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    z-index: 99999999999;
+    background-color: white;
+    padding: 3px 20px;
+    border-radius: 4px;
+    border: 2px solid gray;
+}
+.tooltip-error-top-left:after {
+    content: '';
+    position: absolute;
+    top: 100%;
+    left: ~"calc(100% - 33px)";
+    margin-top: 0px;
+    width: 0;
+    height: 0;
+    border-right: 20px solid gray;
+    border-top: 0px solid transparent;
+    border-bottom: 12px solid transparent;
+}
+.tooltip-error-top-right:after {
+    content: '';
+    position: absolute;
+    top: 100%;
+    left: 15px;
+    margin-top: 0px;
+    width: 0;
+    height: 0;
+    border-left: 20px solid gray;
+    border-top: 0px solid transparent;
+    border-bottom: 12px solid transparent;
+}
+.tooltip-error-bottom-left:after {
+    content: '';
+    position: absolute;
+    top: 0%;
+    left: ~"calc(100% - 33px)";
+    margin-top: -12px;
+    width: 0;
+    height: 0;
+    border-right: 20px solid gray;
+    border-top: 12px solid transparent;
+    border-bottom: 0px solid transparent;
+}
+.tooltip-error-bottom-right:after {
+    content: '';
+    position: absolute;
+    top: 0%;
+    left: 15px;
+    margin-top: -12px;
+    width: 0;
+    height: 0;
+    border-left: 20px solid gray;
+    border-top: 12px solid transparent;
+    border-bottom: 0px solid transparent;
+}
+.print_template {
+    position: absolute;
+    background-color: white;
+    top: 2000px;
+    left: 0px;
+}
+.print-form-label{
+    color: white;
+    text-align: left;
+    width: 100%;
+}
+/*Outil selection*/
+.bootstrap-table .select_modal_table,
+.bootstrap-table .select_modal_table>tbody>tr>td,
+.bootstrap-table .select_modal_table>tbody>tr>th,
+.bootstrap-table .select_modal_table>tfoot>tr>td,
+.bootstrap-table .select_modal_table>tfoot>tr>th,
+.bootstrap-table .select_modal_table>thead>tr>td {
+    padding: 3px 10px !important;
+    font-size: 10px;
+}
+.select_modal_table_buttons{
+    margin-top: 15px;
+}
+.panel-title-small {
+    margin-top: 0;
+    margin-bottom: 0;
+    font-size: 14px;
+    color: inherit;
+}
+.panel-heading-small{
+    padding: 5px 10px;
+}
+.select-img-enlarge-button{
+    color: white;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    cursor: pointer;
+}
+.select-download-img-button{
+    color: white;
+    position: absolute;
+    top: 10px;
+    right: 35px;
+    cursor: pointer;
+}
+.gray-list-menu>li{
+    list-style-type: none;
+}
+.gray-list-menu>li>a{
+    color: @color-text-1 !important;
+}
+.gray-list-menu>li>a:hover{
+    color: gray !important;
+}
+.gray-list-menu>li>a.active{
+    color: gray !important;
+}
+.basic-tools-insert-draw-tools>div[disabled] {
+    background: auto !important;
+    background: initial !important;
+    color: #333333 !important;
+    cursor: auto;
+    cursor: initial;
+}
+.infocontainer-table-content>tbody>tr>td>input[type="checkbox"] {
+    cursor: pointer;
+}
+.info-container-checkbox-column>div>input {
+    cursor: pointer;
+}
+
+// ** Admin Vmap **
+// Boutons pour changer l'ordre des calques.
+.map-layer-order-up {
+    position: absolute;
+    right: 22px;
+    top: 32px;
+}
+.map-layer-order-down {
+    position: absolute;
+    right: 22px;
+    bottom: 20px;
+}
+// **
+
+// Utilisé dans le formulaire de recherche du requêteur
+.advanced-select-geom-checkbox {
+    text-align: right !important;
+    margin: 25px -22px 0px 0px;
+}
+.advanced-select-geom-field-label{
+    margin-left: -34px;
+}
+.vmap-popup-title{
+    font-weight: bold;
+}
+
+div.export-vex-execute-step{
+    height: ~"calc(100% - 100px)";
+}
+div.export-vex-execute-step-button-container {
+    display: table;
+    height: ~"calc(100% - 220px)";
+}
+div.export-vex-execute-step-button {
+    display: table-cell;
+    vertical-align: middle;
+}
+
+// Snapping
+div.vmap-select-snapping-collapse-button{
+    margin: 5px 0px;
+    padding: 5px 0px;
+    border-radius: 4px;
+    text-align: center;
+}
+div.vmap-select-snapping-collapse-button:hover{
+    color: gray !important;
+    background-color: #f5f5f5
+}
+div.vmap-insert-snapping-collapse-button{
+    margin: 5px 0px;
+    padding: 5px 0px;
+    border-radius: 4px;
+    text-align: center;
+}
+div.vmap-insert-snapping-collapse-button:hover{
+    color: gray !important;
+    background-color: #f5f5f5
+}
+div.vmap-select-scale-alert{
+    padding: 5px 15px !important;
+    max-width: 197px !important;
+    text-align: center !important;
+}
diff --git a/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
new file mode 100755
index 0000000000000000000000000000000000000000..eed719d9aedd5f8c8024774e31b13b187c9ae6cc
--- /dev/null
+++ b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
@@ -0,0 +1,429 @@
+{
+    "datasources": {
+        "datasource_1": {
+            "type": "object",
+            "dataType": "text",
+            "name": "avaliable_controls",
+            "description": "",
+            "options": [
+                "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Attribution",
+                "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MousePosition",
+                "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|CurrentProjection",
+                "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapName",
+                "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Scale",
+                "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ScaleLine",
+                "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|OverviewMap",
+                "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Zoom",
+                "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ZoomSlider",
+                "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|RefreshSocket"
+            ]
+        }
+    },
+    "search": {},
+    "update": {
+        "name": "configuration_vmap_config_update_form",
+        "title": "",
+        "input_size": "xs",
+        "event": "updateProperties('vmap')",
+        "nb_cols": 7,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "title",
+                        "label": "TITLE_PROPERTIES_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "name": "title_properties",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "fop_root_dir",
+                        "label": "FORM_FOP_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "phantomjs_root_path",
+                        "label": "FORM_PHANTOM_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "printserver_alias",
+                        "label": "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "api_veremap",
+                        "label": "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "title",
+                        "label": "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "name": "title_properties_display",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "vmap.wmsTilesWidth",
+                        "label": "FORM_TILES_WIDTH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 6
+                    },
+                    {
+                        "type": "text",
+                        "name": "vmap.wmsTilesHeight",
+                        "label": "FORM_TILES_HEIGHT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "codemirror",
+                        "name": "popup.style",
+                        "label": "FORM_POPUP_STYLE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 12,
+                        "required": false,
+                        "codemirrorOptions": {
+                            "lineSeparator": "<return>",
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "css",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "20%"
+                        }
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "layers_collapsed_label",
+                        "label": "FORM_LAYERS_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "vmap.layers_collapsed",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": false,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "layerstree_collapsed_label",
+                        "label": "FORM_LAYERSTREE_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "vmap.layerstree_collapsed",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": false,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "layersorder_collapsed_label",
+                        "label": "FORM_LAYERSORDER_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "vmap.layersorder_collapsed",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": true,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "legend_collapsed_label",
+                        "label": "FORM_LEGEND_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "vmap.legend_collapsed",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": false,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "title",
+                        "label": "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "name": "title_properties_tools",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "controls.active_controls",
+                        "label_from": "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "label_to": "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12,
+                        "size": 10,
+                        "id": "Element_0_1_1",
+                        "name_to": "controls.active_controls",
+                        "name_from": "controls.active_control",
+                        "datasource": {
+                            "datasource_id": "datasource_1"
+                        },
+                        "id_from": "Element_0_1_1_from"
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "title",
+                        "label": "TITLE_SELECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "name": "title_properties_section",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "selection.limit_popup",
+                        "label": "FORM_SELECTION_LIMIT_POPUP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": true,
+                        "default_value": 1,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "selection.limit_list",
+                        "label": "FORM_SELECTION_LIMIT_LIST_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": true,
+                        "default_value": 50,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "selection.enable_getfeatureinfo_label",
+                        "label": "FORM_ENABLE_GETFEATUREINFO_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "selection.enable_getfeatureinfo",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": false,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "title",
+                        "label": "TITLE_SNAPPING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "name": "title_properties_section",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "snapping.defaut_limit",
+                        "label": "FORM_SNAPPING_DEFAUT_LIMIT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": true,
+                        "default_value": 2000,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "snapping.defaut_tolerance",
+                        "label": "FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": true,
+                        "default_value": 15,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "snapping.defaut_snapp_mode",
+                        "label": "FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "options": [
+                            "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|segment_edge_node",
+                            "FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|edge_node",
+                            "FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|node"
+                        ],
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline radio-list",
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "snapping_defaut_visibility_label",
+                        "label": "FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "nb_cols": 8
+                    },
+                    {
+                        "type": "radio",
+                        "name": "snapping.defaut_visibility",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                                    "value": false
+                                }]
+                        },
+                        "default_value": false,
+                        "nb_cols": 4
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert": {},
+    "display": {}
+}
diff --git a/module/forms/users/users_vitis_group_vmap_group.json b/module/forms/users/users_vitis_group_vmap_group.json
new file mode 100755
index 0000000000000000000000000000000000000000..16ceec6e67903143711d1c5715c238446d8c69d2
--- /dev/null
+++ b/module/forms/users/users_vitis_group_vmap_group.json
@@ -0,0 +1,153 @@
+{
+    "search":{
+
+    },
+    "update":{
+        "name":"vmap_group_update_form",
+        "title":"FORM_TITLE_USERS_GROUP",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":8,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"group_id",
+                        "label":"FORM_ID_USERS_GROUP_VMAP_GROUP",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"maps",
+                        "name_from":"map",
+                        "name_to":"maps",
+                        "label":"FORM_MAPS_USERS_GROUP_VMAP_GROUP",
+                        "label_from":"FORM_MAPS_AVAILABLE_USERS_GROUP_VMAP_GROUP",
+                        "label_to":"FORM_GROUP_MAPS_USERS_GROUP_VMAP_GROUP",
+                        "web_service":{
+                            "ressource_id":"vmap/maps",
+                            "id_key":"map_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "size":13,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"print_templates",
+                        "name_from":"print_template",
+                        "name_to":"print_templates",
+                        "label":"FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP",
+                        "label_from":"FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_GROUP",
+                        "label_to":"FORM_GROUP_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP",
+                        "web_service":{
+                            "ressource_id":"vmap/printtemplates",
+                            "id_key":"printtemplate_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "size":13,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+
+    },
+    "display":{
+        "name":"vmap_group_display_form",
+        "title":"FORM_TITLE_USERS_GROUP",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"group_id",
+                        "label":"FORM_ID_USERS_GROUP_VMAP_GROUP",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"maps_label",
+                        "label":"FORM_GROUP_MAPS_USERS_GROUP_VMAP_GROUP",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"print_templates_label",
+                        "label":"FORM_GROUP_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/users/users_vitis_users_vmap_user.json b/module/forms/users/users_vitis_users_vmap_user.json
new file mode 100755
index 0000000000000000000000000000000000000000..d922e45e1ba3d4d778a9e8e27b7b55a2a0e29ca5
--- /dev/null
+++ b/module/forms/users/users_vitis_users_vmap_user.json
@@ -0,0 +1,120 @@
+{
+    "search":{
+
+    },
+    "update":{
+        "name":"vmap_user_update_form",
+        "title":"FORM_TITLE_USERS_USER",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":8,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"user_id",
+                        "label":"FORM_ID_USERS_USER_VMAP_USER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"print_styles",
+                        "name_from":"print_style",
+                        "name_to":"print_styles",
+                        "label":"FORM_PRINT_STYLES_USERS_USER_VMAP_USER",
+                        "label_from":"FORM_PRINT_STYLES_AVAILABLE_USERS_USER_VMAP_USER",
+                        "label_to":"FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER",
+                        "web_service":{
+                            "ressource_id":"vmap/printstyles",
+                            "id_key":"printstyle_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "size":"6",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+
+    },
+    "display":{
+        "name":"vmap_user_display_form",
+        "title":"FORM_TITLE_USERS_USER",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"user_id",
+                        "label":"FORM_ID_USERS_USER_VMAP_USER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"print_styles_label",
+                        "label":"FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map.json
new file mode 100644
index 0000000000000000000000000000000000000000..6ee8877e61658bc9095b8fa0beca4debdb33508c
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map.json
@@ -0,0 +1,626 @@
+{
+    "search": {
+        "name": "vmap_map_search_form",
+        "title": "",
+        "input_size": "xxs",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_MAP",
+                        "nb_cols": 4
+                    },
+                    {
+                        "type": "select",
+                        "name": "maptheme_id",
+                        "label": "FORM_THEME_VMAP_MAP_MAP",
+                        "nb_cols": 4,
+                        "web_service": {
+                            "ressource_id": "vmap/mapthemes",
+                            "id_key": "maptheme_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        }
+                    },
+                    {
+                        "type": "select",
+                        "name": "crs_id",
+                        "label": "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP",
+                        "nb_cols": 4,
+                        "web_service": {
+                            "ressource_id": "vmap/crss",
+                            "id_key": "crs_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-xs",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "search",
+                                "label": "FORM_SEARCH_BUTTON",
+                                "class": "btn-primary",
+                                "event": "setGridFilter()"
+                            },
+                            {
+                                "type": "reset",
+                                "name": "reset",
+                                "label": "FORM_RESET_BUTTON",
+                                "class": "btn-primary",
+                                "event": "resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update": {
+        "name": "vmap_map_update_form",
+        "title": "FORM_TITLE_VMAP_MAP_MAP",
+        "input_size": "xs",
+        "initEvent": "initOLMapExtent()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "nb_cols": 8,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "map_id",
+                        "label": "FORM_MAP_ID_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_MAP",
+                        "required": true,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "crs_id",
+                        "label": "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "required": true,
+                        "web_service": {
+                            "ressource_id": "vmap/crss",
+                            "id_key": "crs_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "textarea",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_MAP",
+                        "size": 8,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "map_osm",
+                        "name": "map_extent",
+                        "label": "FORM_EXTENT_VMAP_MAP_MAP",
+                        "required": false,
+                        "nb_cols": 12,
+                        "id": "vmap_map_map_extent",
+                        "style": {
+                            "height": "ratio",
+                            "margin-bottom": "-20px"
+                        },
+                        "map_options": {
+                            "proj": "EPSG:3857",
+                            "type": "OSM",
+                            "center": {
+                                "extent": [
+                                    -1901744.2199433097,
+                                    4779520.942381757,
+                                    2501744.2199433097,
+                                    7220479.057618243
+                                ]
+                            },
+                            "controls": {
+                                "MP": false,
+                                "ZO": false,
+                                "SL": true,
+                                "CP": false
+                            },
+                            "layers": [],
+                            "interactions": {
+                                "multi_geometry": false,
+                                "full_scrren": true,
+                                "RA": false,
+                                "RO": false,
+                                "ED": false,
+                                "DP": false,
+                                "DL": false,
+                                "DPol": false,
+                                "SE": true
+                            },
+                            "draw_color": "rgba(54,184,255,0.6)",
+                            "contour_color": "rgba(0,0,0,0.4)",
+                            "contour_size": 2,
+                            "circle_radius": 6,
+                            "features": [],
+                            "coord_accuracy": 8
+                        }
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline form-field-inline-right-button",
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "extent",
+                        "required": true,
+                        "readonly": true,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "catalog_index",
+                        "label": "FORM_CATALOG_INDEX_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "class": "form-thumbnail",
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "width": 300,
+                        "height": 180,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_THUMBNAIL_VMAP_MAP_MAP_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "maptheme_id",
+                        "label": "FORM_THEME_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "web_service": {
+                            "ressource_id": "vmap/mapthemes",
+                            "id_key": "maptheme_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "groups",
+                        "name_from": "group",
+                        "name_to": "groups",
+                        "label": "FORM_GROUPS_VMAP_MAP_MAP",
+                        "label_from": "FORM_AVAILABLE_GROUPS_VMAP_MAP_MAP",
+                        "label_to": "FORM_MAP_GROUPS_VMAP_MAP_MAP",
+                        "web_service": {
+                            "ressource_id": "vitis/groups",
+                            "id_key": "group_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        },
+                        "size": 9,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "clone_form",
+                                "label": "FORM_CLONE",
+                                "class": "btn-primary",
+                                "event": "cloneSectionForm(['name'])"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert": {
+        "name": "vmap_map_insert_form",
+        "title": "FORM_TITLE_VMAP_MAP_MAP",
+        "input_size": "xs",
+        "initEvent": "initOLMapExtent()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "nb_cols": 8,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_MAP",
+                        "required": true,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "crs_id",
+                        "label": "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "required": true,
+                        "web_service": {
+                            "ressource_id": "vmap/crss",
+                            "id_key": "crs_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        },
+                        "default_value": "EPSG:3857"
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "textarea",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_MAP",
+                        "size": 8,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "map_osm",
+                        "name": "map_extent",
+                        "label": "FORM_EXTENT_VMAP_MAP_MAP",
+                        "required": false,
+                        "nb_cols": 12,
+                        "id": "vmap_map_map_extent",
+                        "style": {
+                            "height": "ratio",
+                            "margin-bottom": "-20px"
+                        },
+                        "map_options": {
+                            "proj": "EPSG:3857",
+                            "type": "OSM",
+                            "center": {
+                                "extent": [
+                                    -1901744.2199433097,
+                                    4779520.942381757,
+                                    2501744.2199433097,
+                                    7220479.057618243
+                                ]
+                            },
+                            "controls": {
+                                "MP": false,
+                                "ZO": false,
+                                "SL": true,
+                                "CP": false
+                            },
+                            "layers": [],
+                            "interactions": {
+                                "multi_geometry": false,
+                                "full_scrren": true,
+                                "RA": false,
+                                "RO": false,
+                                "ED": false,
+                                "DP": false,
+                                "DL": false,
+                                "DPol": false,
+                                "SE": true
+                            },
+                            "draw_color": "rgba(54,184,255,0.6)",
+                            "contour_color": "rgba(0,0,0,0.4)",
+                            "contour_size": 2,
+                            "circle_radius": 6,
+                            "features": [],
+                            "coord_accuracy": 8
+                        }
+                    }
+                ]
+            },
+            {
+                "class": "form-field-inline form-field-inline-right-button",
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "extent",
+                        "required": true,
+                        "readonly": true,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "catalog_index",
+                        "label": "FORM_CATALOG_INDEX_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "class": "form-thumbnail",
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "width": 300,
+                        "height": 180,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_THUMBNAIL_VMAP_MAP_MAP_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "maptheme_id",
+                        "label": "FORM_THEME_VMAP_MAP_MAP",
+                        "nb_cols": 6,
+                        "web_service": {
+                            "ressource_id": "vmap/mapthemes",
+                            "id_key": "maptheme_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "groups",
+                        "name_from": "group",
+                        "name_to": "groups",
+                        "label": "FORM_GROUPS_VMAP_MAP_MAP",
+                        "label_from": "FORM_AVAILABLE_GROUPS_VMAP_MAP_MAP",
+                        "label_to": "FORM_MAP_GROUPS_VMAP_MAP_MAP",
+                        "web_service": {
+                            "ressource_id": "vitis/groups",
+                            "id_key": "group_id",
+                            "label_key": "name",
+                            "parameters": {
+                                "order_by": "name"
+                            }
+                        },
+                        "size": 9,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display": {
+        "name": "vmap_map_display_form",
+        "title": "FORM_TITLE_VMAP_MAP_MAP",
+        "input_size": "xs",
+        "nb_cols": 8,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "map_id",
+                        "label": "FORM_MAP_ID_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "crs_id",
+                        "label": "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "extent",
+                        "label": "FORM_EXTENT_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "catalog_index",
+                        "label": "FORM_CATALOG_INDEX_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_MAP",
+                        "displayOnly": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "theme_name",
+                        "label": "FORM_THEME_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "groups_label",
+                        "label": "FORM_MAP_GROUPS_VMAP_MAP_MAP",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_available_layers.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_available_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..a43c52928aacf0a0c6f9377ce2cc9c0a050f75c1
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_available_layers.json
@@ -0,0 +1,73 @@
+{
+    "search":{
+        "name":"vmap_map_available_layers_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER",
+                        "nb_cols":4
+                    },
+                    {
+                        "type":"select",
+                        "name":"layertheme_id",
+                        "label":"FORM_THEME_VMAP_MAP_LAYER",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/layerthemes",
+                            "id_key":"layertheme_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    },
+                    {
+                        "type":"select",
+                        "name":"service_id",
+                        "label":"FORM_SERVICE_VMAP_MAP_LAYER",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/services",
+                            "id_key":"service_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_layers.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..1424a063c2c7b4c65d0d4a9d711f128c1e953bc9
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map_layers.json
@@ -0,0 +1,73 @@
+{
+    "update":{
+        "name":"vmap_map_map_layers_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_MAP_LAYERS",
+                        "nb_cols":4
+                    },
+                    {
+                        "type":"select",
+                        "name":"layertheme_id",
+                        "label":"FORM_THEME_VMAP_MAP_MAP_LAYERS",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/layerthemes",
+                            "id_key":"layertheme_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    },
+                    {
+                        "type":"select",
+                        "name":"service_id",
+                        "label":"FORM_SERVICE_VMAP_MAP_MAP_LAYERS",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/services",
+                            "id_key":"service_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_layer_theme.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layer_theme.json
new file mode 100755
index 0000000000000000000000000000000000000000..65767063d29bfd4cc98c319b0a11786a57482147
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layer_theme.json
@@ -0,0 +1,222 @@
+{
+    "search":{
+        "name":"vmap_layer_theme_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER_THEME",
+                        "nb_cols":4
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_layer_theme_update_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER_THEME",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layertheme_id",
+                        "label":"FORM_MAPTHEME_ID_VMAP_MAP_LAYER_THEME",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER_THEME",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER_THEME",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_layer_theme_insert_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER_THEME",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER_THEME",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER_THEME",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_layer_theme_display_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER_THEME",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layertheme_id",
+                        "label":"FORM_MAPTHEME_ID_VMAP_MAP_LAYER_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers.json
new file mode 100644
index 0000000000000000000000000000000000000000..9b95c9ac81ae907d6138e08ed48b96b72d01913d
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers.json
@@ -0,0 +1,963 @@
+{
+    "search":{
+        "name":"vmap_layer_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER",
+                        "nb_cols":4
+                    },
+                    {
+                        "type":"select",
+                        "name":"layertheme_id",
+                        "label":"FORM_THEME_VMAP_MAP_LAYER",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/layerthemes",
+                            "id_key":"layertheme_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    },
+                    {
+                        "type":"select",
+                        "name":"service_id",
+                        "label":"FORM_SERVICE_VMAP_MAP_LAYER",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/services",
+                            "id_key":"service_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_layer_update_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER",
+        "input_size":"xs",
+        "initEvent":"initVmapLayerForm()",
+        "event":"sendSimpleForm()",
+        "afterEvent":"showStudioIfLayerIsFiltered()",
+        "nb_cols":9,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layer_id",
+                        "label":"FORM_LAYER_ID_VMAP_MAP_LAYER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"service_id",
+                        "label":"FORM_SERVICE_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "required":true,
+                        "web_service":{
+                            "ressource_id":"vmap/services",
+                            "id_key":"service_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "options":["|"]
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER",
+                        "required":true,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER",
+                        "size":8,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layertheme_id",
+                        "label":"FORM_THEME_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "web_service":{
+                            "ressource_id":"vmap/layerthemes",
+                            "id_key":"layertheme_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"ui_grid",
+                        "name":"layer_list",
+                        "options": {
+                            "enableRowSelection": true,
+                            "enableSelectAll": true,
+                            "enablePagination": false,
+                            "enablePaginationControls": false,
+                            "enableColumnMenus": false,
+                            "enableColumnResizing": false,
+                            "appHeader": true,
+                            "appHeaderTitleBar": true,
+                            "appGridTitle": "TITLE_GRID_LAYER_LAYERS_VMAP_MAP_LAYER",
+                            "appEnableDragAndDrop": true,
+                            "appDragAndDropEvent": {
+                                "rowFinishDrag": "updateLayerLayersSorting"
+                            },
+                            "columnDefs": [
+                                {
+                                    "name": "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS",
+                                    "displayName": "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS",
+                                    "field": "name",
+                                    "enableSorting": true,
+                                    "type": "string",
+                                    "enableColumnMoving": true,
+                                    "enableColumnResizing": true,
+                                    "headerCellClass": "vmap_map_layers_name"
+                                }
+                            ],
+                            "appActions": [
+                                {
+                                    "label": "FORM_BTN_ADD_LAYER_LIST_VMAP_MAP_LAYER",
+                                    "name": "add_layers_to_layer_btn",
+                                    "event": "showAddLayersToLayerModalWindow()"
+                                },
+                                {
+                                    "label": "FORM_BTN_REMOVE_LAYER_LIST_VMAP_MAP_LAYER",
+                                    "name": "remove_layers_to_layer_btn",
+                                    "event": "removeLayersOfLayer()"
+                                },
+                                {
+                                    "label": "FORM_BTN_CHECK_LAYERS_VMAP_MAP_LAYER",
+                                    "name": "check_wms_layers",
+                                    "event": "checkVmapLayerWmsLayers()"
+                                }
+                            ],
+                            "data": [
+                            ]
+                        },
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"wmts_layer",
+                        "label":"FORM_WMTS_LAYER_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true,
+                        "onchange": "wmtsLayerSelected()"
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"matrix_set",
+                        "label":"FORM_MATRIX_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layer_style",
+                        "label":"FORM_STYLE_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": false
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layer_format",
+                        "label":"FORM_FORMAT_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"hidden",
+                        "name":"layer_options",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"bo_id_list",
+                        "name_to":"bo_id_list",
+                        "name_from":"bo_id_list_from",
+                        "label":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER",
+                        "label_from":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_FROM",
+                        "label_to":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_TO",
+                        "visible": false,
+                        "web_service":{
+                            "ressource_id":"vmap/businessobjects",
+                            "id_key":"business_object_id",
+                            "label_key":"business_object_id",
+                            "parameters":{
+                                    "order_by":"business_object_id"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_dynamic",
+                        "label": "FORM_DYNAMIC_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "default_value": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_filtered",
+                        "label": "FORM_FILTERED_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "default_value": false,
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_bo_filtered",
+                        "label": "FORM_BOFILTERED_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "default_value": true
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_queryable_getfeatureinfo",
+                        "label": "FORM_IS_QUERYABLE_GETFEATUREINFO_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "default_value": false,
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_layer_insert_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER",
+        "input_size":"xs",
+        "initEvent":"initVmapLayerForm()",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":9,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"service_id",
+                        "label":"FORM_SERVICE_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "required":true,
+                        "web_service":{
+                            "ressource_id":"vmap/services",
+                            "id_key":"service_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "options":["|"]
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER",
+                        "required":true,
+                        "visible": false,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER",
+                        "size":8,
+                        "visible": false,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layertheme_id",
+                        "label":"FORM_THEME_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "web_service":{
+                            "ressource_id":"vmap/layerthemes",
+                            "id_key":"layertheme_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"ui_grid",
+                        "name":"layer_list",
+                        "options": {
+                            "enableRowSelection": true,
+                            "enableSelectAll": true,
+                            "enablePagination": false,
+                            "enablePaginationControls": false,
+                            "enableColumnMenus": false,
+                            "enableColumnResizing": false,
+                            "appHeader": true,
+                            "appHeaderTitleBar": true,
+                            "appGridTitle": "TITLE_GRID_LAYER_LAYERS_VMAP_MAP_LAYER",
+                            "appEnableDragAndDrop": true,
+                            "appDragAndDropEvent": {
+                                "rowFinishDrag": "updateLayerLayersSorting"
+                            },
+                            "columnDefs": [
+                                {
+                                    "name": "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS",
+                                    "displayName": "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS",
+                                    "field": "name",
+                                    "enableSorting": true,
+                                    "type": "string",
+                                    "enableColumnMoving": true,
+                                    "enableColumnResizing": true,
+                                    "headerCellClass": "vmap_map_layers_name"
+                                }
+                            ],
+                            "appActions": [
+                                {
+                                    "label": "FORM_BTN_ADD_LAYER_LIST_VMAP_MAP_LAYER",
+                                    "name": "add_layers_to_layer_btn",
+                                    "event": "showAddLayersToLayerModalWindow()"
+                                },
+                                {
+                                    "label": "FORM_BTN_REMOVE_LAYER_LIST_VMAP_MAP_LAYER",
+                                    "name": "add_layers_to_layer_btn",
+                                    "event": "removeLayersOfLayer()"
+                                },
+                                {
+                                    "label": "FORM_BTN_CHECK_LAYERS_VMAP_MAP_LAYER",
+                                    "name": "check_wms_layers",
+                                    "event": "checkVmapLayerWmsLayers()"
+                                }
+                            ],
+                            "data": [
+                            ]
+                        },
+                        "visible": false,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"wmts_layer",
+                        "label":"FORM_WMTS_LAYER_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true,
+                        "onchange": "wmtsLayerSelected()"
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"matrix_set",
+                        "label":"FORM_MATRIX_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layer_style",
+                        "label":"FORM_STYLE_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": false
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"layer_format",
+                        "label":"FORM_FORMAT_VMAP_MAP_LAYER",
+                        "nb_cols":6,
+                        "visible": false,
+                        "required": true
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"hidden",
+                        "name":"layer_options",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"bo_id_list",
+                        "name_to":"bo_id_list",
+                        "name_from":"bo_id_list_from",
+                        "label":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER",
+                        "label_from":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_FROM",
+                        "label_to":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_TO",
+                        "visible": false,
+                        "web_service":{
+                            "ressource_id":"vmap/businessobjects",
+                            "id_key":"business_object_id",
+                            "label_key":"business_object_id",
+                            "parameters":{
+                                    "order_by":"business_object_id"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_dynamic",
+                        "label": "FORM_DYNAMIC_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "visible": false,
+                        "default_value": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_filtered",
+                        "label": "FORM_FILTERED_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "default_value": false,
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_bo_filtered",
+                        "label": "FORM_BOFILTERED_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "tooltip": {
+                            "title": "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE",
+                            "content": "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP",
+                            "container": "body"
+                        },
+                        "default_value": true,
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "is_queryable_getfeatureinfo",
+                        "label": "FORM_IS_QUERYABLE_GETFEATUREINFO_VMAP_MAP_LAYER",
+                        "nb_cols": 6,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "default_value": false,
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_layer_display_form",
+        "title":"FORM_TITLE_VMAP_MAP_LAYER",
+        "input_size":"xs",
+        "initEvent":"initVmapLayerForm()",
+        "nb_cols":9,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layer_id",
+                        "label":"FORM_LAYER_ID_VMAP_MAP_LAYER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"service_name",
+                        "label":"FORM_SERVICE_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_LAYER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_LAYER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"theme_name",
+                        "label":"FORM_THEME_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layer_list",
+                        "label":"TITLE_GRID_LAYER_LAYERS_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"wmts_layer",
+                        "label":"FORM_WMTS_LAYER_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"matrix_set",
+                        "label":"FORM_MATRIX_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layer_style",
+                        "label":"FORM_STYLE_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"layer_format",
+                        "label":"FORM_FORMAT_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"bo_id_list",
+                        "name_to":"bo_id_list",
+                        "name_from":"bo_id_list_from",
+                        "label":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER",
+                        "label_from":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_FROM",
+                        "label_to":"FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_TO",
+                        "visible": false,
+                        "disabled": true,
+                        "web_service":{
+                            "ressource_id":"vmap/businessobjects",
+                            "id_key":"business_object_id",
+                            "label_key":"business_object_id",
+                            "parameters":{
+                                    "order_by":"business_object_id"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"is_dynamic",
+                        "label":"FORM_DYNAMIC_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"is_filtered",
+                        "label":"FORM_FILTERED_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"is_bo_filtered",
+                        "label":"FORM_BOFILTERED_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"is_queryable_getfeatureinfo",
+                        "label":"FORM_IS_QUERYABLE_GETFEATUREINFO_VMAP_MAP_LAYER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers_openlayers_test.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers_openlayers_test.json
new file mode 100755
index 0000000000000000000000000000000000000000..2996b383e1e1b23f5bc30978edfddf136a8872cb
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers_openlayers_test.json
@@ -0,0 +1,100 @@
+{
+    "search": {
+    },
+    "update": {
+        "name": "layer_openlayers_test_update_form",
+        "title": "",
+        "input_size": "xs",
+        "event": "",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "map_vmap",
+                        "name": "layer_test_map",
+                        "required": false,
+                        "nb_cols": 12,
+                        "id": "layer_test_map",
+                        "style": {
+                            "height": "300px",
+                            "margin-bottom": "-20px"
+                        },
+                        "map_options": {
+                            "proj": "EPSG:3857",
+                            "center": {
+                                "extent": [
+                                    -1901744.2199433097,
+                                    4779520.942381757,
+                                    2501744.2199433097,
+                                    7220479.057618243
+                                ]
+                            },
+                            "type": "vmap",
+                            "controls": {
+                                "MP": false,
+                                "ZO": true,
+                                "SL": true,
+                                "CP": true
+                            },
+                            "layers": [],
+                            "interactions": {
+                                "multi_geometry": false,
+                                "full_screen": false,
+                                "RA": false,
+                                "RO": false,
+                                "ED": false,
+                                "DP": false,
+                                "DL": false,
+                                "DPol": false,
+                                "SE": true,
+                                "layer_tree": true
+                            },
+                            "draw_color": "rgba(54,184,255,0.6)",
+                            "contour_color": "rgba(0,0,0,0.4)",
+                            "contour_size": 2,
+                            "circle_radius": 6,
+                            "features": [],
+                            "coord_accuracy": 8,
+                            "tree": {
+                                "name": "Tree",
+                                "children": [
+                                    {
+                                        "view": {
+                                            "projection": "EPSG:3857",
+                                            "extent": [
+                                                -1901744.2199433097,
+                                                4779520.942381757,
+                                                2501744.2199433097,
+                                                7220479.057618243
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "name": "Open Street Map",
+                                        "children": [
+                                            {
+                                                "name": "Open Street Maps",
+                                                "visible": true,
+                                                "select": true,
+                                                "layerType": "osm",
+                                                "url": "https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",
+                                                "select": true,
+                                                "index": 0
+                                            }
+                                        ],
+                                        "visible": true
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        ]
+    },
+    "insert": {
+    },
+    "display": {
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_map_theme.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_map_theme.json
new file mode 100755
index 0000000000000000000000000000000000000000..c65df0763135ed3a845451a85b4fc601f70a52fc
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_map_theme.json
@@ -0,0 +1,222 @@
+{
+    "search":{
+        "name":"vmap_map_theme_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_MAP_THEME",
+                        "nb_cols":4
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_map_theme_update_form",
+        "title":"FORM_TITLE_VMAP_MAP_MAP_THEME",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"maptheme_id",
+                        "label":"FORM_MAPTHEME_ID_VMAP_MAP_MAP_THEME",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_MAP_THEME",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_MAP_THEME",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_map_theme_insert_form",
+        "title":"FORM_TITLE_VMAP_MAP_MAP_THEME",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_MAP_THEME",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_MAP_THEME",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_map_theme_display_form",
+        "title":"FORM_TITLE_VMAP_MAP_MAP_THEME",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"maptheme_id",
+                        "label":"FORM_MAPTHEME_ID_VMAP_MAP_MAP_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_MAP_MAP_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MAP_MAP_THEME",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_services.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_services.json
new file mode 100755
index 0000000000000000000000000000000000000000..62c8b8cdc6a2a9a9482afd8c450d066c83fe31d4
--- /dev/null
+++ b/module/forms/vmap_admin_map/vmap_admin_map_vmap_services.json
@@ -0,0 +1,682 @@
+{
+    "datasources": {
+    },
+    "search": {
+        "name": "vmap_map_search_form",
+        "title": "",
+        "input_size": "xxs",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_SERVICE",
+                        "nb_cols": 4
+                    },
+                    {
+                        "type": "select",
+                        "name": "service_type_id",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 4,
+                        "web_service": {
+                            "ressource_id": "vmap/servicetypes",
+                            "id_key": "service_type_id",
+                            "label_key": "service_type_id",
+                            "parameters": {
+                                "order_by": "service_type_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-xs",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "search",
+                                "label": "FORM_SEARCH_BUTTON",
+                                "class": "btn-primary",
+                                "event": "setGridFilter()"
+                            },
+                            {
+                                "type": "reset",
+                                "name": "reset",
+                                "label": "FORM_RESET_BUTTON",
+                                "class": "btn-primary",
+                                "event": "resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update": {
+        "name": "vmap_map_update_form",
+        "title": "FORM_TITLE_VMAP_MAP_SERVICE",
+        "input_size": "xs",
+        "initEvent": "initVmapServiceForm()",
+        "beforeEvent": "beforeVmapServiceForm()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "afterVmapServiceForm()",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_id",
+                        "label": "FORM_SERVICE_ID_VMAP_MAP_SERVICE",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_type_id",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "wms_service_type",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 2,
+                        "required": true,
+                        "visible": false,
+                        "options": ["WMS - Image unique|imagewms", "WMS - Multi tuilage|tilewms"]
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_SERVICE",
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "textarea",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_SERVICE",
+                        "size": 12,
+                        "nb_cols": 9
+                    }
+                ]
+            },
+            {
+                "class": "form-thumbnail",
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 3,
+                        "width": 300,
+                        "height": 180,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_THUMBNAIL_VMAP_MAP_SERVICE_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "url",
+                        "name": "url",
+                        "label": "FORM_URL_VMAP_MAP_SERVICE",
+                        "required": true,
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "key",
+                        "label": "FORM_KEY_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "service_type_type",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 6,
+                        "options": ["KVP|KVP", "REST|REST"],
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "service_type_version",
+                        "label": "FORM_SERVICE_TYPE_VERSION_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "lang",
+                        "label": "FORM_LANG_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "imagery",
+                        "label": "FORM_IMAGERY_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "service_login",
+                        "label": "FORM_LOGIN_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 3
+                    },
+                    {
+                        "type": "text",
+                        "name": "service_password",
+                        "label": "FORM_PASSWORD_VMAP_MAP_SERVICE",
+                        "autocomplete": true,
+                        "visible": false,
+                        "nb_cols": 3
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "hidden",
+                        "name": "service_options",
+                        "nb_cols": 3
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 6,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "wmts_test_button",
+                                "label": "FORM_TEST_VMAP_MAP_SERVICE",
+                                "class": "btn-success",
+                                "event": "testWMTSCapabilities()",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wmts_test_submit_button",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary",
+                                "event": "testWMTSCapabilities(true)",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wms_test_button",
+                                "label": "FORM_TEST_VMAP_MAP_SERVICE",
+                                "class": "btn-success",
+                                "event": "testWMSCapabilities()",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wms_test_submit_button",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary",
+                                "event": "testWMSCapabilities(true)",
+                                "visible": false
+                            },
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")",
+                                "visible": false
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert": {
+        "name": "vmap_map_insert_form",
+        "title": "FORM_TITLE_VMAP_MAP_SERVICE",
+        "input_size": "xs",
+        "initEvent": "initVmapServiceForm()",
+        "beforeEvent": "beforeVmapServiceForm()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "service_type_id",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 2,
+                        "required": true,
+                        "options": ["WMS - Image unique|imagewms", "WMS - Multi tuilage|tilewms", "Bing Maps|bing", "OpenStreetMap|osm", "WMTS|wmts", "XYZ|xyz"]
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_SERVICE",
+                        "required": true,
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "textarea",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_SERVICE",
+                        "size": 9,
+                        "visible": false,
+                        "nb_cols": 9
+                    }
+                ]
+            },
+            {
+                "class": "form-thumbnail",
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 3,
+                        "width": 300,
+                        "height": 180,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_THUMBNAIL_VMAP_MAP_SERVICE_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "url",
+                        "name": "url",
+                        "label": "FORM_URL_VMAP_MAP_SERVICE",
+                        "required": true,
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "key",
+                        "label": "FORM_KEY_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "service_type_type",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 6,
+                        "options": ["KVP|KVP", "REST|REST"],
+                        "visible": false
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "service_type_version",
+                        "label": "FORM_SERVICE_TYPE_VERSION_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "lang",
+                        "label": "FORM_LANG_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "imagery",
+                        "label": "FORM_IMAGERY_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "service_login",
+                        "label": "FORM_LOGIN_VMAP_MAP_SERVICE",
+                        "visible": false,
+                        "nb_cols": 3
+                    },
+                    {
+                        "type": "text",
+                        "name": "service_password",
+                        "label": "FORM_PASSWORD_VMAP_MAP_SERVICE",
+                        "autocomplete": true,
+                        "visible": false,
+                        "nb_cols": 3
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "hidden",
+                        "name": "service_options",
+                        "nb_cols": 3
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 6,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "wmts_test_button",
+                                "label": "FORM_TEST_VMAP_MAP_SERVICE",
+                                "class": "btn-success",
+                                "event": "testWMTSCapabilities()",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wmts_test_submit_button",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary",
+                                "event": "testWMTSCapabilities(true)",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wms_test_button",
+                                "label": "FORM_TEST_VMAP_MAP_SERVICE",
+                                "class": "btn-success",
+                                "event": "testWMSCapabilities()",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "wms_test_submit_button",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary",
+                                "event": "testWMSCapabilities(true)",
+                                "visible": false
+                            },
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary",
+                                "visible": false
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")",
+                                "visible": false
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display": {
+        "name": "vmap_map_display_form",
+        "title": "FORM_TITLE_VMAP_MAP_SERVICE",
+        "input_size": "xs",
+        "initEvent": "initVmapServiceForm()",
+        "nb_cols": 6,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_id",
+                        "label": "FORM_SERVICE_ID_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_type_id",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "description",
+                        "label": "FORM_DESCRIPTION_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "image_wsdata",
+                        "name": "thumbnail",
+                        "label": "FORM_THUMBNAIL_VMAP_MAP_SERVICE",
+                        "displayOnly": true,
+                        "visible": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "url",
+                        "label": "FORM_URL_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "key",
+                        "label": "FORM_KEY_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_type_type",
+                        "label": "FORM_TYPE_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "service_type_version",
+                        "label": "FORM_SERVICE_TYPE_VERSION_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "lang",
+                        "label": "FORM_LANG_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "imagery",
+                        "label": "FORM_IMAGERY_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "login",
+                        "label": "FORM_LOGIN_VMAP_MAP_SERVICE",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "password",
+                        "label": "FORM_PASSWORD_VMAP_MAP_SERVICE",
+                        "autocomplete": true,
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_module/vmap_admin_module_vmap_admin_module.json b/module/forms/vmap_admin_module/vmap_admin_module_vmap_admin_module.json
new file mode 100755
index 0000000000000000000000000000000000000000..89fee3944f72f7a0e8d108fbe2919cb4f3823716
--- /dev/null
+++ b/module/forms/vmap_admin_module/vmap_admin_module_vmap_admin_module.json
@@ -0,0 +1,115 @@
+{
+    "search":{
+        "name":"vmap_module_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"label",
+                        "label":"FORM_LABEL_VMAP_MODULE_MODULE",
+                        "nb_cols":4
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+    },
+    "insert":{
+    },
+    "display":{
+        "name":"vmap_module_display_form",
+        "title":"FORM_TITLE_VMAP_MODULE_MODULE",
+        "input_size":"xs",
+        "nb_cols":8,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"module_id",
+                        "label":"FORM_MODULE_ID_VMAP_MODULE_MODULE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"label",
+                        "label":"FORM_LABEL_VMAP_MODULE_MODULE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_MODULE_MODULE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"rolname",
+                        "label":"FORM_ROLNAME_VMAP_MODULE_MODULE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_print_parameter.json b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_print_parameter.json
new file mode 100755
index 0000000000000000000000000000000000000000..112e17fb7da76c4c8298ef263a5164d1408f4fd6
--- /dev/null
+++ b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_print_parameter.json
@@ -0,0 +1,418 @@
+{
+    "search":{
+        "name":"vmap_print_parameter_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_PARAMETER",
+                        "nb_cols":4
+                    },
+                    {
+                        "type":"select",
+                        "name":"printtemplate_id",
+                        "label":"FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/printparameters",
+                            "id_key":"printparameter_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"radio",
+                        "name":"editable",
+                        "label":"FORM_EDITABLE_VMAP_PRINT_PARAMETER",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_EDITABLE_YES_VMAP_PRINT_PARAMETER",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_EDITABLE_NO_VMAP_PRINT_PARAMETER",
+                                    "value": false
+                                }]
+                        },
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_print_parameter_update_form",
+        "title":"FORM_TITLE_VMAP_PRINT_PARAMETER",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printparameter_id",
+                        "label":"FORM_PRINTPARAMETER_ID_VMAP_PRINT_PARAMETER",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_PARAMETER",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"label",
+                        "label":"FORM_LABEL_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"printtemplate_id",
+                        "label":"FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER",
+                        "required":true,
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/printtemplates",
+                            "id_key":"printtemplate_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"radio",
+                        "name":"editable",
+                        "label":"FORM_EDITABLE_VMAP_PRINT_PARAMETER",
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_EDITABLE_YES_VMAP_PRINT_PARAMETER",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_EDITABLE_NO_VMAP_PRINT_PARAMETER",
+                                    "value": false
+                                }]
+                        },
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"placeholder",
+                        "label":"FORM_PLACEHOLDER_VMAP_PRINT_PARAMETER",
+                        "size":8,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"defaultvalue",
+                        "label":"FORM_DEFAULTVALUE_VMAP_PRINT_PARAMETER",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_print_parameter_insert_form",
+        "title":"FORM_TITLE_VMAP_PRINT_PARAMETER",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_PARAMETER",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"label",
+                        "label":"FORM_LABEL_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"printtemplate_id",
+                        "label":"FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER",
+                        "required":true,
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/printtemplates",
+                            "id_key":"printtemplate_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "options":["|"]
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"radio",
+                        "name":"editable",
+                        "label":"FORM_EDITABLE_VMAP_PRINT_PARAMETER",
+                        "default_value": false,
+                        "options": {
+                            "choices": [{
+                                    "label": "FORM_EDITABLE_YES_VMAP_PRINT_PARAMETER",
+                                    "value": true
+                                },
+                                {
+                                    "label": "FORM_EDITABLE_NO_VMAP_PRINT_PARAMETER",
+                                    "value": false
+                                }]
+                        },
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"placeholder",
+                        "label":"FORM_PLACEHOLDER_VMAP_PRINT_PARAMETER",
+                        "size":8,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"defaultvalue",
+                        "label":"FORM_DEFAULTVALUE_VMAP_PRINT_PARAMETER",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_print_parameter_display_form",
+        "title":"FORM_TITLE_VMAP_PRINT_PARAMETER",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printparameter_id",
+                        "label":"FORM_PRINTPARAMETER_ID_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"label",
+                        "label":"FORM_LABEL_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"print_template",
+                        "label":"FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"editable",
+                        "label":"FORM_EDITABLE_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"placeholder",
+                        "label":"FORM_PLACEHOLDER_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"defaultvalue",
+                        "label":"FORM_DEFAULTVALUE_VMAP_PRINT_PARAMETER",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_style.json b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_style.json
new file mode 100755
index 0000000000000000000000000000000000000000..f5db002ab76d4ae7d748def8d5690a09aee13d57
--- /dev/null
+++ b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_style.json
@@ -0,0 +1,313 @@
+{
+    "search":{
+        "name":"vmap_style_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_STYLE",
+                        "nb_cols":4
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_style_update_form",
+        "title":"FORM_TITLE_VMAP_PRINT_STYLE",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printstyle_id",
+                        "label":"FORM_PRINTSTYLE_ID_VMAP_PRINT_STYLE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_STYLE",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"users",
+                        "name_from":"user",
+                        "name_to":"users",
+                        "label":"FORM_USERS_VMAP_PRINT_STYLE",
+                        "label_from":"FORM_AVAILABLE_USERS_VMAP_PRINT_STYLE",
+                        "label_to":"FORM_MAP_USERS_VMAP_PRINT_STYLE",
+                        "web_service":{
+                            "ressource_id":"vitis/users",
+                            "id_key":"user_id",
+                            "label_key":"login",
+                            "parameters":{
+                                "order_by":"login"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_STYLE",
+                        "nb_cols":10,
+                        "required":true,
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"text/css",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_style_insert_form",
+        "title":"FORM_TITLE_VMAP_PRINT_STYLE",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_STYLE",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"users",
+                        "name_from":"user",
+                        "name_to":"users",
+                        "label":"FORM_USERS_VMAP_PRINT_STYLE",
+                        "label_from":"FORM_AVAILABLE_USERS_VMAP_PRINT_STYLE",
+                        "label_to":"FORM_MAP_USERS_VMAP_PRINT_STYLE",
+                        "web_service":{
+                            "ressource_id":"vitis/users",
+                            "id_key":"user_id",
+                            "label_key":"login",
+                            "parameters":{
+                                "order_by":"login"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_STYLE",
+                        "nb_cols":10,
+                        "required":true,
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"text/css",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_style_display_form",
+        "title":"FORM_TITLE_VMAP_PRINT_STYLE",
+        "input_size":"xs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printstyle_id",
+                        "label":"FORM_PRINTSTYLE_ID_VMAP_PRINT_STYLE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_STYLE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"users_label",
+                        "label":"FORM_MAP_USERS_VMAP_PRINT_STYLE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_STYLE",
+                        "nb_cols":10,
+                        "required":true,
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"text/css",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%",
+                            "readOnly":"nocursor"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_template.json b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_template.json
new file mode 100755
index 0000000000000000000000000000000000000000..051f2e45eff4391b0349a7f5e645b538b56f6c2c
--- /dev/null
+++ b/module/forms/vmap_admin_print/vmap_admin_print_vmap_admin_template.json
@@ -0,0 +1,506 @@
+{
+    "search":{
+        "name":"vmap_template_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":4
+                    },
+                    {
+                        "type":"select",
+                        "name":"rt_format_id",
+                        "label":"FORM_FORMAT_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/formats",
+                            "id_key":"rt_format_id",
+                            "label_key":"rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        }
+                    },
+                    {
+                        "type":"select",
+                        "name":"rt_orientation_id",
+                        "label":"FORM_ORIENTATION_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/orientations",
+                            "id_key":"rt_orientation_id",
+                            "label_key":"rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"outputformats_id",
+                        "label":"FORM_OUTPUT_FORMATS_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":4,
+                        "web_service":{
+                            "ressource_id":"vmap/outputformats",
+                            "id_key":"outputformats_id",
+                            "label_key":"outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_template_update_form",
+        "title":"FORM_TITLE_VMAP_PRINT_TEMPLATE",
+        "input_size":"xs",
+        "beforeEvent":"beforeVmapAdminTemplateSubmit()",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printtemplate_id",
+                        "label":"FORM_PRINTTEMPLATE_ID_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"rt_format_id",
+                        "label":"FORM_FORMAT_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/formats",
+                            "id_key":"rt_format_id",
+                            "label_key":"rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"rt_orientation_id",
+                        "label":"FORM_ORIENTATION_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/orientations",
+                            "id_key":"rt_orientation_id",
+                            "label_key":"rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "class": "hidden",
+                        "class_label": "hidden",
+                        "name":"outputformats_id",
+                        "label":"FORM_OUTPUT_FORMATS_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/outputformats",
+                            "id_key":"outputformats_id",
+                            "label_key":"outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        },
+                        "default_value": "pdf"
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"groups",
+                        "name_from":"group",
+                        "name_to":"groups",
+                        "label":"FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "label_from":"FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "label_to":"FORM_PRINT_TEMPLATES_LINKED_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "web_service":{
+                            "ressource_id":"vitis/groups",
+                            "id_key":"group_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":10,
+                        "required":true,
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"htmlmixed",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%",
+                            "appName":"definition"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_template_insert_form",
+        "title":"FORM_TITLE_VMAP_PRINT_TEMPLATE",
+        "input_size":"xs",
+        "beforeEvent":"beforeVmapAdminTemplateSubmit()",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"rt_format_id",
+                        "label":"FORM_FORMAT_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/formats",
+                            "id_key":"rt_format_id",
+                            "label_key":"rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        },
+                        "options":["|"]
+                        }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "name":"rt_orientation_id",
+                        "label":"FORM_ORIENTATION_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/orientations",
+                            "id_key":"rt_orientation_id",
+                            "label_key":"rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        },
+                        "options":["|"]
+                        }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"select",
+                        "class": "hidden",
+                        "class_label": "hidden",
+                        "name":"outputformats_id",
+                        "label":"FORM_OUTPUT_FORMATS_VMAP_PRINT_TEMPLATE",
+                        "required":true,
+                        "nb_cols":3,
+                        "web_service":{
+                            "ressource_id":"vmap/outputformats",
+                            "id_key":"outputformats_id",
+                            "label_key":"outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        },
+                        "default_value": "pdf"
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"double_select",
+                        "name":"groups",
+                        "name_from":"group",
+                        "name_to":"groups",
+                        "label":"FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "label_from":"FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "label_to":"FORM_PRINT_TEMPLATES_LINKED_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "web_service":{
+                            "ressource_id":"vitis/groups",
+                            "id_key":"group_id",
+                            "label_key":"name",
+                            "parameters":{
+                                "order_by":"name"
+                            }
+                        },
+                        "size":9,
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":10,
+                        "required":true,
+                        "default_value": "<style>\r    #A4_print_template {\r        width: 21cm;\r    }\r    #map_legend {\r\r    }\r    #map_image {\r        background-color: #DFDFDF;\r        height: 19cm;\r        width: 14cm;\r        border: 1px solid black;\r    }\r    #map_overview {\r        background-color: #DFDFDF;\r        height: 4cm;\r        width: 4cm;\r        border: 1px solid black;\r    }\r    .logo {\r        height: 1cm;\r    }\r    .head_element, .body_element, .footer_element {\r        text-align: center;\r        position: absolute;\r    }\r\r</style>\r<div id=\"A4_print_template\">\r\r    <!-- Entête -->\r    <div class=\"head_element\" style=\"top: 1.5cm; left: 2cm;\">\r        <img class=\"logo\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM8AAAA+CAIAAAADLdi0AAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfgARUXDAt3OP8+AAAAB3RJTUUH4AUGCDYTNKrgnQAAAAlwSFlzAAAK8AAACvABQqw0mAAAEXlJREFUeNrtXAdXFMkW3n/x3q6ugBkERQXJJsyYwZwWs+IqYFofAq6rYiAYwAwrAkqWDIqouwbAAAiSEURgFQTFCCrq+5iLtb09Mz0zCL53PHVPHc7QU9VVfe9XN9Xt+e4TJ05fi77jLODE0caJo40TJ442ThxtnDhxtHHiaOPE0caJE0cbJ442ITU1NRUXF6deSA09GxYbE3v71u2GhgbOcY62DqYHDx64u7qbGpv9+EO3H/7VhbV+ffVXr3QoLCzkfOdo6wB6+/bt3t17e2j3FIJM1HS0uvuf8G9paeHc52hrP71582bp4mUMVSOGjfTY6ZGclJx+I/3K5StH/I5MmjCpy7+74iv89fL0/vjxIxcAR1t7CLrK2XE94czQYGBUZFRzc7Ooz7t370LPhJLmg5FNiE/gAuBoaw/Fx8WT3rIwtawor5DQW+dTzmt11UbPAfqGtbW1XAYcbZoRlNYwq+EAUHetHnfv3pXuDCDu3bOPtOAvm7Zwe8rRphnBLSP0uGxxUaf/y5cvh1uNQH9Y1bKyMi4GjjYxPW14eu/ePdjBjPSMyPDIDx8+QC35+R5+8/qNs1Orx9b1+x9LS0qp8/v37wNPnc7KylZ2t5joGAKo21Z3rt442sTU+KyR/K1uXbQArC2bt5wJOYuA4OnTp0OMTHB97OhxiAwyMzILCwsXLfgJV7a6uAb4BwQHBadeSBVBCnC0NLNEH93ees+fP9do0biVy5atM21nLpy/UNOxnP6v0dZQ31BZWYmQs7ioWJStJazk5ubCXcPnnx3WOjs6A4jaP+rQt/hMH0aPHP3mzRvRnY8dPU7fhoWGa7ToBw8eUGA7b/Y8qFguxW8Hbfv2ekK0C+YuMDe16NZVSx5tyUnJ9HnWjNnKMroIV8eNHl9dXS288+NHjwmmdtNnaGRM/Xz96Lbnos5xEX47aIPmIJuorPXtpet/wp8+T5wwSaInoUqYhAPCli1pzQbrdOsO9anmit++fTtqxGiMMujXn5vRbwptoWfDSP0oazCarlvdPpvLMdJoQ9uxfYfwzIrpxUMHfdVccdadLErsbVy/kcvv20FbfX2DXt9+KgEEb12Waes+sP8glZ0BFB/v/cJUiNFA41akWo959+6dOitGfEC3upl5k8vv20Hb+ZTzKtGD1qdnX8rr9tTppbLz4p8WIxoVzuLutq0Vhd93vX37tsrlwhDr6xmgv5X5UIXxAWKR/Pz8yIhI34O+3p7eRw4fTYhPqHxQKVEEAIMO64w7M7jjQ42MFPZved9S9bAqOSnl+LHjmOLg/oPhoeF5uXlNb5okVo6nbpYR81Ax6f2y+xdT02LOxaQkp+TnF7x8+UqZ//rixYu8vLykxCR0vph6sbSktKmpSX0xY66y0jKM9fM9jDX7HfI7F32upKQE19UZDqVw7dr104FBgadOX7l8paGhoX1JKym07fbYow7aNGrWw0e5u7ojjGWz3L2bS6GryxYXlc+QmJDYZnkPHBKnA58+9drnZWFqSXZW2LS6ak+fapuYmKQQc0CA7TQ7MxNzx3VOWEBiQtLY0eMw5JdNv8gjBgKbOnkaC7qFzcLMEqsCLBSu3MvTG1OgPfrr0atXr04cPzli2EgWs1MbZDjYzdX94cOHwoEV5RWbNmwy7D9QZCIQtAHouJU0x16/fh3g/7v1iFGiueioeuyocWdCzsifaP+9tVpazoScNR5kLKoc8/HykRjVHrQtW7K8w9FGbYbtzIqKtrNUqCiYUTo2ld6v6L/EfglFFRguvH7p0mWjf3JEvoHdSxcvkw8sMKmJsSk6zJk197Dv4W5dtD6fqv0DbTXVNTPtZomgLI/soZbDcrJz5LcNcwAy0jPGjRkvsc5+fftFRkR9lFFYaDiZDmVt4viJ9U/qlXEMGtd6uLV41L/FN5k+dboI4ixG9NjpIQ9TauudNmhaNvadhGjtFy3uJLSR5fU91BYZnDh+gi4iaJBYK0xbr+69Kc0mFCdEQmnn1vKT/gOhO1MvpBbkFxQVFv1x5Q/oG0iXwWLMqLF1dXUK0abbW48lFPv21t3jsYf1wd2MBw9hK8c+jAiPyM7KLiu7n5l5MyQ4BLzCHmCuxdU/r4oAx9Cmr2tAH4YYmfzqvh33gWUMDgoBuLHfGIjDwyIC/ANI0vg7YZyNt5dPfFxCUmLyyeMn7RfZs+lmz5yj0KlIu5jWu2cfljpY77Q+Pi4e+IMVvnH9xskTJ+2m2bGtZTxoSHl5hegOMNzMOKz7eV1sTFxYaNiCeQtZ2Rim6DDdBjWAndpJaJsw1oYZHRgXytYusV8qsZ6AkwE0NioyWshTBjUITGExOixgVGQUOXxo8+fMF/orDG3URg6zhqsndE3qaussTC3alj3OBm6AvOrCFfhVNuMnUjcDvf7l5eUK0UaHMYCyvBGsr6//aaE99QFDKBuAPYDFw1kUdYabC8srk3qXS2mX5LUai/CwEx5WKlZd2BWmxmZtDz7curGxUdiBPc5hvyPskcFMZ0dnur5i2QqNHDgp3Qb4M0F2eEu/kS6ci7gM1VX7uFaZlz3JZnKrodHVZ0x58uTJ4IFGdEPPfV7S5wpwEPX6tAngVMAphWjD7oLIRQNXrVhN306ZNFUkD7Ev//wF+lBn2OWPHz4qRJvnXk9lQoI/Du0rtNTQfMqmg+YmZWy/0F54HVEOu8nPDmubm5qlD2ZMPz++21Z3dh1PSuoTqBWdAxUXF5PSNTex0MiYKkUbNjf2cedZ0tEjx4Cz8ok3mA+F68m/l9+WZtuwiV302LWbRkEpikJdhQQlwXQP3Gd5tKGDaMitm7dIogMMDB8/fqxyCrh3+rr6ZP4uX74ijzYri6HSuZ74+ATGpdUrHSR6QtJTZeCGdX7e+Lc/Cr++zW2wHiMNNaKbmTcJWD11epXfb1PJCOTJzkLniSCFf48dPY54H/GHRieHStEWHXWu86BGaeEjfkfkE29QYAq3y47tO2hg5uc0GywRmRJwSs03a3Dn8WMn0H0iIyJFaIPxqqqqEg1xWufUZk18D6vJ0wM+B2jI8qXL5dHmtc9bejiUK9ws6qzSMUJsSCrwXt49ZiiYBbx86bI6C8YQwJrpXRbjU+gNtsjr+w7Ot7H90UktLjZetC1cXVzJpyksKJQ3o4RFCzNLhsWMjEwW4arvPYQEn6FRK5evEqENTrrIl4IFoeAAJh5KS80pAFlKPRr069/4rFGEtgvnL6iU/fChI4gVKrUpswmIHugKoktSVDBz6icprl27TqYDu5FxeIRsGWiIil69fNVZaMMDO6xy6FS06Wh1F5V+wPsmb2DXjl0i9MALplH7fQ6wr1gJiY+3z7u379RslZWVJAyzIWZkfBnaDA0GMvPKcl1kRuFUILBQcwr0nDZ5Gq3tbs5dEdpysnNUSsV2mh2ltRobVRwE37mTRbcNPBVIVy6mptGVtWvWqc8W7CvsDQo/mYcTejaUxfImRiZgOKD8JS/LKdVtRw8fZfq8s8LScTbCsnLAaPTI1uN2yF7k2axeuZoAKgz06BCCsh7w7tVsluZWBCA8HYIMabRlpGfQFNBV6k+BxpJkcbFxIrTBAVUTbXguoWurkIqKisi7Orj/IF059fsploPVaM0spVJUVMyCVm8vH+1uOsI8+eSJU06e8JeOljSPEuobpJOQHdKwXf4B8SNH6fq1q9eEfgzFkqLEkvM65y9Srt26wxGWRhvTE+1u8KNFaKt6WNWBaCsuKia0Hdh/gK7Aef/CNV+7el2oArLuZC2cv0iU4zU3tbh+/UaHoQ0KU52aji9sUDAOq9awcPLRo0eUZFq7Zu3fnlZQiMKAcet/2uS3eNHiX923a9p2/rYTjrA02gD6tndjh45sxxRomRmZXxltLCtpO822fWu+X3Zf3rNCrLp3zz6W4iZf9s7tOx2DNmgRlmmUbyPlz0M0bxvXb8zOyhYKGJPayyaFMiMoAPS2U21bg3w9A+ZxE/keaqupDAkO+RLXVQJtpaVltKfnzZn/hQ7yV0MbwgWaaPuvv3V4EQeiKMTmdKLTmoCcOKVjMiCgmHMxymwQnWyq32AEMQpWn4RnaWYFKCsMuBI+Z5siwiLw7/375cRNZ8f1op5//nmVejqtc+oktEHYVEY12NBI5fn3/wna4NpS5mLq5GmdVEYfHxvPogeFB6ztQRs8UIXQmTVjVpfvu2qEtiFGJqcDT0dHncvOztm5Y5dEfhz8hWhby+bsZoFZnvu82g6zP5skYRFOf/0BlGh49uyZmoml04FBHrt2o7EElQTa0H/N6p9pAedTLqjJUyyVpogWFLJ/NbRhzXSQgOulpaVqrjkxIZHWfPXPq6TDtrlt27RhM/iv8JiOHWlKiFIztFVXV8vjBu4h8ULT1qdX3wq5c1+F5OriRhq0rLTMzMScdKHCo4Jft22nm+/x2KNOyu3WrdssIGUZSwm0geB40ZDxYydIV7CxPUCSwO6Pj4v/+mgDBQUG0VyrVqxShy0VFRUUh+l008nLzaM6JVLqgwwHK1TqzMsCTDsGbbB0un30hBU7RoOMD+w/2L7D0x7aPdU0RjnZOV1lupOVG3h7Ks6/I6qgugnEFpfSVOTNa2pqLM2t5MvjpNEmrIVR+epry/sWx7VO7C0NYR7na6INT0SONbgHXa7CFXv5arrMM0ZzXOfEjO9kmykkdIVVrqNkuSo0jSJTKbSBWeGh4YMGDJYdNGn7+fohWlmyeGn7YgI8uco0OhOw9YhRQjdRPkoS+nnkC/bU6RkRHqkw90gFGsMsh9MNJ0+cIiykk0YblaiQcccjbNq4WRkCENYgvmbxWkF+wf/Eb2NZ3949+lCGDApCYY0u2FJVVcWgBiZQArLt/G3/gc+xrZ2o7vBS2iXiOR7zxYuXHYM22dFNEyLHhfMXpV5IBeorKyvpyLl9yQ4bWbmOOss6euTY3+89yBw4ic6+B33J2AENc2fNTUpKfvTocXNzM5CHMBZR+i+bt+hotaUuh1kNFx2GqkSbTHh3WMESfIkTx0+W3y+HqobAXr96Dcf82JFjrJwTWjwhPvF/FSUwiouNY28wjR8zPjwsAg+Oh8WaAZGCggKPnbtZVZKBXv+cnH/8gEtdXR0rmZk7ex4sLJwEGJPgoGDd3nrt+50D1W/44XaYg26K+dR51UW+AQ3nU87To6qzrJrqGsYpaCyViww6HSx8KwJ7DrI3G2IOJgrLayeMs5EXtjpo+ySrGLMyHyrMqoMVQN6gAYOEheP6ugYpySkStbtfDW2y7PRFtkla/Q3tHkYDjcxNLAwNDIUvoluYWSo8T4uKjGZJXcwywMCwV4/eQmaKclJfijb50/Gj7UpVQwZpF9PUD8gp24dHlU+zKTO+4Pv8uQuU+ZSIW2FQFIIJaDM3Mcdcgw0HS6Dtk6y8dPu239jOlk8MrV7p8FAJmFxdXDEFmnyZiTzNtJ0pW4+RSrSVFJdgXnQ+KPeiBrGlurrGca0jU+2iBmvrttVNGYchheioaCFeme5wWOVACdFORBsImmbalOmjBH6VSq2GaA4KRlg+qQ7VPq6FOpHw2BQyF2HssaPH4D/BHZk4fhIMq8t/tsKuSYgNPAVSMVdhYaE6+wFcjoyI2rxx8+yZczCF3fQZa9es+z3gd+nM0181f2EKNHVec4JppvWoPALHVrmXdw+d62rrpCMkhAsIAmZMn4E1z7KbtcF5I2yr0FFTRk+e1AeeOg3IImhbsWyF1z6v3Ny8jn/nSlk+rKXlQ3JSMiualW5aP2r7n/SHSlfnNJrTt03t/P026IDtn3Nd0g32PvduLmc0p09f8muBlZUPWYwt/6IbqwWCCyL6sRlOHG3toaLCovT0DKgueHJwVOXftbwiKMznxKljfgk1Nib2xo10xFDAnF6fftB2K5evhAfKf1yNU8ejjTy5+Lj4kpLS9+/fv3jxgv/WFadORBsnThxtnDjaOHG0ceLE0caJo40TJ442ThxtnDh9+i8Ul9vHscwxiAAAAABJRU5ErkJggg==\">\r    </div>\r    <div class=\"head_element\" style=\"top: 1cm; left: 0cm; width: 21cm\">\r        <h1 style=\"margin-bottom: 0px; padding-bottom: 0px;\">{{title}}</h1>\r        <i>{{headline}}</i>\r    </div>\r    <div class=\"head_element\" style=\"top: 1.5cm; left: 16cm;\">\r        <img class=\"logo\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM8AAAA+CAIAAAADLdi0AAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfgARUXDAt3OP8+AAAAB3RJTUUH4AUGCDYTNKrgnQAAAAlwSFlzAAAK8AAACvABQqw0mAAAEXlJREFUeNrtXAdXFMkW3n/x3q6ugBkERQXJJsyYwZwWs+IqYFofAq6rYiAYwAwrAkqWDIqouwbAAAiSEURgFQTFCCrq+5iLtb09Mz0zCL53PHVPHc7QU9VVfe9XN9Xt+e4TJ05fi77jLODE0caJo40TJ442ThxtnDhxtHHiaOPE0caJE0cbJ442ITU1NRUXF6deSA09GxYbE3v71u2GhgbOcY62DqYHDx64u7qbGpv9+EO3H/7VhbV+ffVXr3QoLCzkfOdo6wB6+/bt3t17e2j3FIJM1HS0uvuf8G9paeHc52hrP71582bp4mUMVSOGjfTY6ZGclJx+I/3K5StH/I5MmjCpy7+74iv89fL0/vjxIxcAR1t7CLrK2XE94czQYGBUZFRzc7Ooz7t370LPhJLmg5FNiE/gAuBoaw/Fx8WT3rIwtawor5DQW+dTzmt11UbPAfqGtbW1XAYcbZoRlNYwq+EAUHetHnfv3pXuDCDu3bOPtOAvm7Zwe8rRphnBLSP0uGxxUaf/y5cvh1uNQH9Y1bKyMi4GjjYxPW14eu/ePdjBjPSMyPDIDx8+QC35+R5+8/qNs1Orx9b1+x9LS0qp8/v37wNPnc7KylZ2t5joGAKo21Z3rt442sTU+KyR/K1uXbQArC2bt5wJOYuA4OnTp0OMTHB97OhxiAwyMzILCwsXLfgJV7a6uAb4BwQHBadeSBVBCnC0NLNEH93ees+fP9do0biVy5atM21nLpy/UNOxnP6v0dZQ31BZWYmQs7ioWJStJazk5ubCXcPnnx3WOjs6A4jaP+rQt/hMH0aPHP3mzRvRnY8dPU7fhoWGa7ToBw8eUGA7b/Y8qFguxW8Hbfv2ekK0C+YuMDe16NZVSx5tyUnJ9HnWjNnKMroIV8eNHl9dXS288+NHjwmmdtNnaGRM/Xz96Lbnos5xEX47aIPmIJuorPXtpet/wp8+T5wwSaInoUqYhAPCli1pzQbrdOsO9anmit++fTtqxGiMMujXn5vRbwptoWfDSP0oazCarlvdPpvLMdJoQ9uxfYfwzIrpxUMHfdVccdadLErsbVy/kcvv20FbfX2DXt9+KgEEb12Waes+sP8glZ0BFB/v/cJUiNFA41akWo959+6dOitGfEC3upl5k8vv20Hb+ZTzKtGD1qdnX8rr9tTppbLz4p8WIxoVzuLutq0Vhd93vX37tsrlwhDr6xmgv5X5UIXxAWKR/Pz8yIhI34O+3p7eRw4fTYhPqHxQKVEEAIMO64w7M7jjQ42MFPZved9S9bAqOSnl+LHjmOLg/oPhoeF5uXlNb5okVo6nbpYR81Ax6f2y+xdT02LOxaQkp+TnF7x8+UqZ//rixYu8vLykxCR0vph6sbSktKmpSX0xY66y0jKM9fM9jDX7HfI7F32upKQE19UZDqVw7dr104FBgadOX7l8paGhoX1JKym07fbYow7aNGrWw0e5u7ojjGWz3L2bS6GryxYXlc+QmJDYZnkPHBKnA58+9drnZWFqSXZW2LS6ak+fapuYmKQQc0CA7TQ7MxNzx3VOWEBiQtLY0eMw5JdNv8gjBgKbOnkaC7qFzcLMEqsCLBSu3MvTG1OgPfrr0atXr04cPzli2EgWs1MbZDjYzdX94cOHwoEV5RWbNmwy7D9QZCIQtAHouJU0x16/fh3g/7v1iFGiueioeuyocWdCzsifaP+9tVpazoScNR5kLKoc8/HykRjVHrQtW7K8w9FGbYbtzIqKtrNUqCiYUTo2ld6v6L/EfglFFRguvH7p0mWjf3JEvoHdSxcvkw8sMKmJsSk6zJk197Dv4W5dtD6fqv0DbTXVNTPtZomgLI/soZbDcrJz5LcNcwAy0jPGjRkvsc5+fftFRkR9lFFYaDiZDmVt4viJ9U/qlXEMGtd6uLV41L/FN5k+dboI4ixG9NjpIQ9TauudNmhaNvadhGjtFy3uJLSR5fU91BYZnDh+gi4iaJBYK0xbr+69Kc0mFCdEQmnn1vKT/gOhO1MvpBbkFxQVFv1x5Q/oG0iXwWLMqLF1dXUK0abbW48lFPv21t3jsYf1wd2MBw9hK8c+jAiPyM7KLiu7n5l5MyQ4BLzCHmCuxdU/r4oAx9Cmr2tAH4YYmfzqvh33gWUMDgoBuLHfGIjDwyIC/ANI0vg7YZyNt5dPfFxCUmLyyeMn7RfZs+lmz5yj0KlIu5jWu2cfljpY77Q+Pi4e+IMVvnH9xskTJ+2m2bGtZTxoSHl5hegOMNzMOKz7eV1sTFxYaNiCeQtZ2Rim6DDdBjWAndpJaJsw1oYZHRgXytYusV8qsZ6AkwE0NioyWshTBjUITGExOixgVGQUOXxo8+fMF/orDG3URg6zhqsndE3qaussTC3alj3OBm6AvOrCFfhVNuMnUjcDvf7l5eUK0UaHMYCyvBGsr6//aaE99QFDKBuAPYDFw1kUdYabC8srk3qXS2mX5LUai/CwEx5WKlZd2BWmxmZtDz7curGxUdiBPc5hvyPskcFMZ0dnur5i2QqNHDgp3Qb4M0F2eEu/kS6ci7gM1VX7uFaZlz3JZnKrodHVZ0x58uTJ4IFGdEPPfV7S5wpwEPX6tAngVMAphWjD7oLIRQNXrVhN306ZNFUkD7Ev//wF+lBn2OWPHz4qRJvnXk9lQoI/Du0rtNTQfMqmg+YmZWy/0F54HVEOu8nPDmubm5qlD2ZMPz++21Z3dh1PSuoTqBWdAxUXF5PSNTex0MiYKkUbNjf2cedZ0tEjx4Cz8ok3mA+F68m/l9+WZtuwiV302LWbRkEpikJdhQQlwXQP3Gd5tKGDaMitm7dIogMMDB8/fqxyCrh3+rr6ZP4uX74ijzYri6HSuZ74+ATGpdUrHSR6QtJTZeCGdX7e+Lc/Cr++zW2wHiMNNaKbmTcJWD11epXfb1PJCOTJzkLniSCFf48dPY54H/GHRieHStEWHXWu86BGaeEjfkfkE29QYAq3y47tO2hg5uc0GywRmRJwSs03a3Dn8WMn0H0iIyJFaIPxqqqqEg1xWufUZk18D6vJ0wM+B2jI8qXL5dHmtc9bejiUK9ws6qzSMUJsSCrwXt49ZiiYBbx86bI6C8YQwJrpXRbjU+gNtsjr+w7Ot7H90UktLjZetC1cXVzJpyksKJQ3o4RFCzNLhsWMjEwW4arvPYQEn6FRK5evEqENTrrIl4IFoeAAJh5KS80pAFlKPRr069/4rFGEtgvnL6iU/fChI4gVKrUpswmIHugKoktSVDBz6icprl27TqYDu5FxeIRsGWiIil69fNVZaMMDO6xy6FS06Wh1F5V+wPsmb2DXjl0i9MALplH7fQ6wr1gJiY+3z7u379RslZWVJAyzIWZkfBnaDA0GMvPKcl1kRuFUILBQcwr0nDZ5Gq3tbs5dEdpysnNUSsV2mh2ltRobVRwE37mTRbcNPBVIVy6mptGVtWvWqc8W7CvsDQo/mYcTejaUxfImRiZgOKD8JS/LKdVtRw8fZfq8s8LScTbCsnLAaPTI1uN2yF7k2axeuZoAKgz06BCCsh7w7tVsluZWBCA8HYIMabRlpGfQFNBV6k+BxpJkcbFxIrTBAVUTbXguoWurkIqKisi7Orj/IF059fsploPVaM0spVJUVMyCVm8vH+1uOsI8+eSJU06e8JeOljSPEuobpJOQHdKwXf4B8SNH6fq1q9eEfgzFkqLEkvM65y9Srt26wxGWRhvTE+1u8KNFaKt6WNWBaCsuKia0Hdh/gK7Aef/CNV+7el2oArLuZC2cv0iU4zU3tbh+/UaHoQ0KU52aji9sUDAOq9awcPLRo0eUZFq7Zu3fnlZQiMKAcet/2uS3eNHiX923a9p2/rYTjrA02gD6tndjh45sxxRomRmZXxltLCtpO822fWu+X3Zf3rNCrLp3zz6W4iZf9s7tOx2DNmgRlmmUbyPlz0M0bxvXb8zOyhYKGJPayyaFMiMoAPS2U21bg3w9A+ZxE/keaqupDAkO+RLXVQJtpaVltKfnzZn/hQ7yV0MbwgWaaPuvv3V4EQeiKMTmdKLTmoCcOKVjMiCgmHMxymwQnWyq32AEMQpWn4RnaWYFKCsMuBI+Z5siwiLw7/375cRNZ8f1op5//nmVejqtc+oktEHYVEY12NBI5fn3/wna4NpS5mLq5GmdVEYfHxvPogeFB6ztQRs8UIXQmTVjVpfvu2qEtiFGJqcDT0dHncvOztm5Y5dEfhz8hWhby+bsZoFZnvu82g6zP5skYRFOf/0BlGh49uyZmoml04FBHrt2o7EElQTa0H/N6p9pAedTLqjJUyyVpogWFLJ/NbRhzXSQgOulpaVqrjkxIZHWfPXPq6TDtrlt27RhM/iv8JiOHWlKiFIztFVXV8vjBu4h8ULT1qdX3wq5c1+F5OriRhq0rLTMzMScdKHCo4Jft22nm+/x2KNOyu3WrdssIGUZSwm0geB40ZDxYydIV7CxPUCSwO6Pj4v/+mgDBQUG0VyrVqxShy0VFRUUh+l008nLzaM6JVLqgwwHK1TqzMsCTDsGbbB0un30hBU7RoOMD+w/2L7D0x7aPdU0RjnZOV1lupOVG3h7Ks6/I6qgugnEFpfSVOTNa2pqLM2t5MvjpNEmrIVR+epry/sWx7VO7C0NYR7na6INT0SONbgHXa7CFXv5arrMM0ZzXOfEjO9kmykkdIVVrqNkuSo0jSJTKbSBWeGh4YMGDJYdNGn7+fohWlmyeGn7YgI8uco0OhOw9YhRQjdRPkoS+nnkC/bU6RkRHqkw90gFGsMsh9MNJ0+cIiykk0YblaiQcccjbNq4WRkCENYgvmbxWkF+wf/Eb2NZ3949+lCGDApCYY0u2FJVVcWgBiZQArLt/G3/gc+xrZ2o7vBS2iXiOR7zxYuXHYM22dFNEyLHhfMXpV5IBeorKyvpyLl9yQ4bWbmOOss6euTY3+89yBw4ic6+B33J2AENc2fNTUpKfvTocXNzM5CHMBZR+i+bt+hotaUuh1kNFx2GqkSbTHh3WMESfIkTx0+W3y+HqobAXr96Dcf82JFjrJwTWjwhPvF/FSUwiouNY28wjR8zPjwsAg+Oh8WaAZGCggKPnbtZVZKBXv+cnH/8gEtdXR0rmZk7ex4sLJwEGJPgoGDd3nrt+50D1W/44XaYg26K+dR51UW+AQ3nU87To6qzrJrqGsYpaCyViww6HSx8KwJ7DrI3G2IOJgrLayeMs5EXtjpo+ySrGLMyHyrMqoMVQN6gAYOEheP6ugYpySkStbtfDW2y7PRFtkla/Q3tHkYDjcxNLAwNDIUvoluYWSo8T4uKjGZJXcwywMCwV4/eQmaKclJfijb50/Gj7UpVQwZpF9PUD8gp24dHlU+zKTO+4Pv8uQuU+ZSIW2FQFIIJaDM3Mcdcgw0HS6Dtk6y8dPu239jOlk8MrV7p8FAJmFxdXDEFmnyZiTzNtJ0pW4+RSrSVFJdgXnQ+KPeiBrGlurrGca0jU+2iBmvrttVNGYchheioaCFeme5wWOVACdFORBsImmbalOmjBH6VSq2GaA4KRlg+qQ7VPq6FOpHw2BQyF2HssaPH4D/BHZk4fhIMq8t/tsKuSYgNPAVSMVdhYaE6+wFcjoyI2rxx8+yZczCF3fQZa9es+z3gd+nM0181f2EKNHVec4JppvWoPALHVrmXdw+d62rrpCMkhAsIAmZMn4E1z7KbtcF5I2yr0FFTRk+e1AeeOg3IImhbsWyF1z6v3Ny8jn/nSlk+rKXlQ3JSMiualW5aP2r7n/SHSlfnNJrTt03t/P026IDtn3Nd0g32PvduLmc0p09f8muBlZUPWYwt/6IbqwWCCyL6sRlOHG3toaLCovT0DKgueHJwVOXftbwiKMznxKljfgk1Nib2xo10xFDAnF6fftB2K5evhAfKf1yNU8ejjTy5+Lj4kpLS9+/fv3jxgv/WFadORBsnThxtnDjaOHG0ceLE0caJo40TJ442ThxtnDh9+i8Ul9vHscwxiAAAAABJRU5ErkJggg==\">\r    </div>\r\r    <!-- Corps -->\r    <div class=\"body_element\" style=\"top: 4cm; left: 1cm;width: 4cm;\">\r        <!--Pour afficher la légende, utiliser id=\"map_legend\"-->\r        <div id=\"map_legend\"></div>\r    </div>\r    <div class=\"body_element\" style=\"top: 4cm; left: 6cm;\">\r        <!--Pour afficher la carte, utiliser id=\"map_image\"-->\r        <img id=\"map_image\" src=\"images/transparent.png\">\r    </div>\r\r    <!-- Pied de page -->\r    <div class=\"footer_element\" style=\"top: 24cm; left: 1cm;\">\r        <!-- Pour afficher l'overview utiliser id=\"map_overview-->\r        <img id=\"map_overview\">\r    </div>\r    <div class=\"footer_element\" style=\"top: 27.5cm; left: 0cm; width: 21cm\">\r        <label class=\"ng-binding\">{{footer}}</label>\r    </div>\r    <div class=\"footer_element\" style=\"top: 27.5cm; left: 17cm;\">\r        <!-- Pour afficher l'échelle actuelle utiliser {{map_scale}}-->\r        <label class=\"ng-binding\">Echelle: {{map_scale}}</label>\r    </div>\r\r\r</div>",
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"htmlmixed",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%",
+                            "appName":"definition"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_template_display_form",
+        "title":"FORM_TITLE_VMAP_PRINT_TEMPLATE",
+        "input_size":"xs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"printtemplate_id",
+                        "label":"FORM_PRINTTEMPLATE_ID_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"name",
+                        "label":"FORM_NAME_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"rt_format_id",
+                        "label":"FORM_FORMAT_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"rt_orientation_id",
+                        "label":"FORM_ORIENTATION_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"groups_label",
+                        "label":"FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":6
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"codemirror",
+                        "name":"definition",
+                        "label":"FORM_DEFINITION_VMAP_PRINT_TEMPLATE",
+                        "nb_cols":10,
+                        "required":true,
+                        "codemirrorOptions":{
+                            "runnable":true,
+                            "lineNumbers":true,
+                            "matchBrackets":true,
+                            "mode":"htmlmixed",
+                            "indentUnit":4,
+                            "indentWithTabs":true,
+                            "enterMode":"keep",
+                            "tabMode":"shift",
+                            "appHeight":"50%",
+                            "readOnly":"nocursor"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
new file mode 100644
index 0000000000000000000000000000000000000000..ad663b75ea42b64cae3ef34ae7ed92a5700ea8f9
--- /dev/null
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
@@ -0,0 +1,260 @@
+var oFormScope;
+
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire
+ * @param {type} scope
+ */
+ constructor_form = function (scope) {
+    console.log("constructor_form");
+
+    oFormScope = scope;
+};
+
+/**
+ * Charge la liste des schemas
+ */
+ angular.element(vitisApp.appMainDrtv).scope()["loadVMapBoFormSchemas"] = function(){
+    console.log('loadVMapBoFormSchemas');
+
+    if (!angular.isDefined(oFormScope['oFormValues'])) {
+        return;
+    }
+
+    var oFormValues = oFormScope['oFormValues'][oFormScope['sFormDefinitionName']];
+    if (!angular.isDefined(oFormValues)) {
+        return;
+    }
+
+    var sDatabase = oFormValues['database'];
+    if (angular.isDefined(sDatabase['selectedOption'])) {
+        if (angular.isDefined(sDatabase['selectedOption']['value'])) {
+            sDatabase = sDatabase['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sDatabase)) {
+        $.notify('Base de données incorrecte');
+        return;
+    } else if (!sDatabase.length > 0) {
+        $.notify('Base de données incorrecte');
+        return;
+    }
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oFormScope['oProperties']['web_server_name'] + '/' +  oFormScope['oProperties']['services_alias'] + '/vitis/genericquerys/' + sDatabase + '/schemas',
+        'params': {
+            'distinct':true,
+            'order_by':'schema_name',
+            'sort_order':'ASC'
+        },
+        'scope': oFormScope,
+        'success': function (response) {
+
+            var aSchemasOptions = [];
+            if (angular.isDefined(response['data'])) {
+                if (angular.isArray(response['data']['genericquerys'])) {
+                    for (var i = 0; i < response['data']['genericquerys'].length; i++) {
+                        aSchemasOptions.push({
+                            'label': response['data']['genericquerys'][i]['schema_name'],
+                            'value': response['data']['genericquerys'][i]['schema_name']
+                        });
+                    }
+                }
+            }
+
+            oFormScope.$applyAsync(function(){
+                if (angular.isDefined(oFormValues['schema'])) {
+                    if (angular.isDefined(oFormValues['schema']['options'])) {
+                        oFormValues['schema']['options'] = aSchemasOptions;
+                    }
+                }
+            });
+
+        },
+        'error': function (error){
+            console.error('error', error);
+        }
+    });
+};
+
+/**
+ * Charge la liste des tables
+ */
+ angular.element(vitisApp.appMainDrtv).scope()["loadVMapBoFormTables"] = function(){
+    console.log('loadVMapBoFormTables');
+
+    if (!angular.isDefined(oFormScope['oFormValues'])) {
+        return;
+    }
+
+    var oFormValues = oFormScope['oFormValues'][oFormScope['sFormDefinitionName']];
+    if (!angular.isDefined(oFormValues)) {
+        return;
+    }
+
+    var sDatabase = oFormValues['database'];
+    if (angular.isDefined(sDatabase['selectedOption'])) {
+        if (angular.isDefined(sDatabase['selectedOption']['value'])) {
+            sDatabase = sDatabase['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sDatabase)) {
+        $.notify('Base de données incorrecte');
+        return;
+    } else if (!sDatabase.length > 0) {
+        $.notify('Base de données incorrecte');
+        return;
+    }
+
+    var sSchema = oFormValues['schema'];
+    if (angular.isDefined(sSchema['selectedOption'])) {
+        if (angular.isDefined(sSchema['selectedOption']['value'])) {
+            sSchema = sSchema['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sSchema)) {
+        $.notify('Nom du schema incorrect');
+        return;
+    } else if (!sSchema.length > 0) {
+        $.notify('Nom du schema incorrect');
+        return;
+    }
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oFormScope['oProperties']['web_server_name'] + '/' +  oFormScope['oProperties']['services_alias'] + '/vitis/genericquerys',
+        'params': {
+            'database':sDatabase,
+            'schema':sSchema,
+            'distinct':true,
+            'order_by':'table_name',
+            'sort_order':'ASC'
+        },
+        'scope': oFormScope,
+        'success': function (response) {
+
+            var aTablesOptions = [];
+            if (angular.isDefined(response['data'])) {
+                if (angular.isArray(response['data']['genericquerys'])) {
+                    for (var i = 0; i < response['data']['genericquerys'].length; i++) {
+                        aTablesOptions.push({
+                            'label': response['data']['genericquerys'][i]['table_name'],
+                            'value': response['data']['genericquerys'][i]['table_name']
+                        });
+                    }
+                }
+            }
+
+            oFormScope.$applyAsync(function(){
+                if (angular.isDefined(oFormValues['table'])) {
+                    if (angular.isDefined(oFormValues['table']['options'])) {
+                        oFormValues['table']['options'] = aTablesOptions;
+                    }
+                }
+            });
+
+        },
+        'error': function (error){
+            console.error('error', error);
+        }
+    });
+};
+
+/**
+ * Charge la liste des colonnes
+ */
+ angular.element(vitisApp.appMainDrtv).scope()["loadVMapBoFormColumns"] = function(){
+    console.log('loadVMapBoFormColumns');
+
+    if (!angular.isDefined(oFormScope['oFormValues'])) {
+        return;
+    }
+
+    var oFormValues = oFormScope['oFormValues'][oFormScope['sFormDefinitionName']];
+    if (!angular.isDefined(oFormValues)) {
+        return;
+    }
+
+    var sDatabase = oFormValues['database'];
+    if (angular.isDefined(sDatabase['selectedOption'])) {
+        if (angular.isDefined(sDatabase['selectedOption']['value'])) {
+            sDatabase = sDatabase['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sDatabase)) {
+        $.notify('Base de données incorrecte');
+        return;
+    } else if (!sDatabase.length > 0) {
+        $.notify('Base de données incorrecte');
+        return;
+    }
+
+    var sSchema = oFormValues['schema'];
+    if (angular.isDefined(sSchema['selectedOption'])) {
+        if (angular.isDefined(sSchema['selectedOption']['value'])) {
+            sSchema = sSchema['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sSchema)) {
+        $.notify('Nom du schema incorrect');
+        return;
+    } else if (!sSchema.length > 0) {
+        $.notify('Nom du schema incorrect');
+        return;
+    }
+
+    var sTable = oFormValues['table'];
+    if (angular.isDefined(sTable['selectedOption'])) {
+        if (angular.isDefined(sTable['selectedOption']['value'])) {
+            sTable = sTable['selectedOption']['value'];
+        }
+    }
+    if (!angular.isString(sTable)) {
+        $.notify('Table incorrecte');
+        return;
+    } else if (!sTable.length > 0) {
+        $.notify('Table incorrecte');
+        return;
+    }
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oFormScope['oProperties']['web_server_name'] + '/' +  oFormScope['oProperties']['services_alias'] + '/vitis/genericquerys/workspace/columns',
+        'params': {
+            'database':sDatabase,
+            'schema':sSchema,
+            'table':sTable,
+            'distinct':true,
+            'order_by':'column_name',
+            'sort_order':'ASC'
+        },
+        'scope': oFormScope,
+        'success': function (response) {
+
+            var aColumnsOptions = [];
+            if (angular.isDefined(response['data'])) {
+                if (angular.isArray(response['data']['genericquerys'])) {
+                    for (var i = 0; i < response['data']['genericquerys'].length; i++) {
+                        aColumnsOptions.push({
+                            'label': response['data']['genericquerys'][i]['column_name'],
+                            'value': response['data']['genericquerys'][i]['column_name']
+                        });
+                    }
+                }
+            }
+
+            oFormScope.$applyAsync(function(){
+                if (angular.isDefined(oFormValues['id_field'])) {
+                    if (angular.isDefined(oFormValues['id_field']['options'])) {
+                        oFormValues['id_field']['options'] = aColumnsOptions;
+                    }
+                }
+            });
+
+        },
+        'error': function (error){
+            console.error('error', error);
+        }
+    });
+};
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
new file mode 100644
index 0000000000000000000000000000000000000000..b5697404c934a44fa2069f9ed2ce3be2fec2b480
--- /dev/null
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
@@ -0,0 +1,1116 @@
+{
+    "datasources": {
+        "use_strict": {
+            "type": "object",
+            "dataType": "text",
+            "name": "use_strict",
+            "description": "",
+            "options": [
+                "FORM_SEARCH_USE_STRICT_4|false",
+                "FORM_SEARCH_USE_STRICT_1|true",
+                "FORM_SEARCH_USE_STRICT_2|left",
+                "FORM_SEARCH_USE_STRICT_3|right"
+            ]
+        },
+        "form_size": {
+            "type": "object",
+            "dataType": "text",
+            "name": "form_size",
+            "description": "",
+            "options": [
+                "FORM_SIZE_1|1",
+                "FORM_SIZE_2|2",
+                "FORM_SIZE_3|3"
+            ]
+        },
+        "datasource_1": {
+            "type": "web_service",
+            "dataType": "webService",
+            "name": "database",
+            "description": "",
+            "ressource_id": "vitis/genericquerys/databases",
+            "webservice": {
+                "name": "vitis"
+            },
+            "ressource": {
+                "name": "genericquerys/databases"
+            },
+            "id": "datasource_1"
+        }
+    },
+    "search": {
+        "name": "vmap_business_object_search_form",
+        "title": "",
+        "input_size": "xxs",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    },{
+                        "type": "text",
+                        "name": "title",
+                        "label": "FORM_TITLE_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    },{
+                        "type": "text",
+                        "name": "database",
+                        "label": "FORM_DATABASE_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    },{
+                        "type": "text",
+                        "name": "schema",
+                        "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    },{
+                        "type": "text",
+                        "name": "table",
+                        "label": "FORM_TABLE_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    },{
+                        "type": "text",
+                        "name": "id_field",
+                        "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                        "nb_cols": 2
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-xs",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "search",
+                                "label": "FORM_SEARCH_BUTTON",
+                                "class": "btn-primary",
+                                "event": "setGridFilter()"
+                            },
+                            {
+                                "type": "reset",
+                                "name": "reset",
+                                "label": "FORM_RESET_BUTTON",
+                                "class": "btn-primary",
+                                "event": "resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update": {
+        "name": "vmap_business_object_update_form",
+        "title": "Paramètres de l'objet métier",
+        "input_size": "xs",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "javascript": true,
+        "nb_cols": 12,
+        "rows": [{
+                "fields": [{
+                        "type": "label",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0",
+                        "nb_cols": 6,
+                        "id": "ééé_1_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "title",
+                        "label": "FORM_TITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "formtitle",
+                        "label": "FORM_FORMTITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "summarytitle",
+                        "label": "FORM_SUMMARYTITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "database",
+                        "label": "FORM_DATABASE_DEVELOPMENT_0",
+                        "required": true,
+                        "datasource": {
+                            "datasource_id": "datasource_1",
+                            "sort_order": "ASC",
+                            "distinct": "true",
+                            "label_key": "database",
+                            "order_by": "database",
+                            "id_key": "database",
+                            "attributs": "database|database"
+                        },
+                        "nb_cols": 6
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "schema",
+                        "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "schema-datalist",
+                                "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormSchemas()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "table",
+                        "label": "FORM_TABLE_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_TABLE_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormTables()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "id_field",
+                        "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_ID_FIELD_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "textarea",
+                        "name": "sql_summary",
+                        "label": "FORM_SQL_SUMMARY_DEVELOPMENT_0",
+                        "id": "New_el_6_8_1",
+                        "nb_cols": 9,
+                        "size": 8,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SQL_SUMMARY_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "textarea",
+                        "name": "sql_list",
+                        "label": "FORM_SQL_LIST_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 9,
+                        "size": 8,
+                        "id": "New_el_7_9_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SQL_LIST_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "sorted_by",
+                        "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                        "required": false,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "New_el_9_11_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "geom_column",
+                        "label": "FORM_GEOM_COLUMN_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "New_el_10_12_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "search_field",
+                        "label": "FORM_SEARCH_FIELD_0",
+                        "nb_cols": 6,
+                        "id": "New_el_11_13_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SEARCH_FIELD_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "result_field",
+                        "label": "FORM_RESULT_FIELD_0",
+                        "nb_cols": 6,
+                        "id": "New_el_12_14_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_RESULT_FIELD_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "search_use_strict",
+                        "label": "FORM_SEARCH_USE_STRICT_0",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_1",
+                        "default_value": "false",
+                        "datasource": {
+                            "datasource_id": "use_strict"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "edit_form_size",
+                        "label": "EDIT_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "display_form_size",
+                        "label": "DISPLAY_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "add_form_size",
+                        "label": "ADD_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "event_id",
+                        "label": "FORM_EVENT_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/businessobjectevents",
+                            "id_key": "event_id",
+                            "label_key": "event_id",
+                            "parameters":{
+                                "order_by":"event_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "selection_buffer",
+                        "label": "FORM_BUFFER_VMAP_BUSINESS_OBJECT",
+                        "default_value": 5,
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "index",
+                        "label": "FORM_INDEX_VMAP_BUSINESS_OBJECT",
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "min_edition_scale",
+                        "label": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "required": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "max_edition_scale",
+                        "label": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "required": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 6,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"development\")"
+                            }
+                        ]
+                    }
+                ]
+            }]
+    },
+    "insert": {
+        "name": "vmap_business_object_insert_form",
+        "title": "Création Objet métier",
+        "input_size": "xs",
+        "beforeEvent": "checkBoSchema()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "javascript": true,
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "^[A-Za-z0-9_]{1,32}$",
+                        "nb_cols": 6,
+                        "id": "ééé_1_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "title",
+                        "label": "FORM_TITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "formtitle",
+                        "label": "FORM_FORMTITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "summarytitle",
+                        "label": "FORM_SUMMARYTITLE_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "éé_2_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "database",
+                        "label": "FORM_DATABASE_DEVELOPMENT_0",
+                        "required": true,
+                        "datasource": {
+                            "datasource_id": "datasource_1",
+                            "sort_order": "ASC",
+                            "distinct": "true",
+                            "label_key": "database",
+                            "order_by": "database",
+                            "id_key": "database",
+                            "attributs": "database|database"
+                        },
+                        "nb_cols": 6
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "schema",
+                        "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "schema-datalist",
+                                "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormSchemas()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "table",
+                        "label": "FORM_TABLE_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_TABLE_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormTables()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "editable_select",
+                        "name": "id_field",
+                        "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 5,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_ID_FIELD_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "textarea",
+                        "name": "sql_summary",
+                        "label": "FORM_SQL_SUMMARY_DEVELOPMENT_0",
+                        "id": "New_el_6_8_1",
+                        "nb_cols": 9,
+                        "size": 8,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SQL_SUMMARY_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "textarea",
+                        "name": "sql_list",
+                        "label": "FORM_SQL_LIST_DEVELOPMENT_0",
+                        "required": true,
+                        "nb_cols": 9,
+                        "size": 8,
+                        "id": "New_el_7_9_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SQL_LIST_DEVELOPMENT_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "sorted_by",
+                        "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                        "required": false,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "New_el_9_11_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "geom_column",
+                        "label": "FORM_GEOM_COLUMN_DEVELOPMENT_0",
+                        "required": true,
+                        "pattern": "",
+                        "nb_cols": 6,
+                        "id": "New_el_10_12_1"
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "search_field",
+                        "label": "FORM_SEARCH_FIELD_0",
+                        "nb_cols": 6,
+                        "id": "New_el_11_13_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SEARCH_FIELD_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "text",
+                        "name": "result_field",
+                        "label": "FORM_RESULT_FIELD_0",
+                        "nb_cols": 6,
+                        "id": "New_el_12_14_1",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_RESULT_FIELD_0_TOOLTIP",
+                            "container": "body"
+                        }
+                    }]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "search_use_strict",
+                        "label": "FORM_SEARCH_USE_STRICT_0",
+                        "required": false,
+                        "default_value": "false",
+                        "nb_cols": 6,
+                        "id": "Element_0_2_1",
+                        "datasource": {
+                            "datasource_id": "use_strict"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "edit_form_size",
+                        "label": "EDIT_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "display_form_size",
+                        "label": "DISPLAY_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "add_form_size",
+                        "label": "ADD_FORM_SIZE",
+                        "required": false,
+                        "nb_cols": 6,
+                        "id": "Element_0_2_2",
+                        "default_value": "1",
+                        "datasource": {
+                            "datasource_id": "form_size"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "event_id",
+                        "label": "FORM_EVENT_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/businessobjectevents",
+                            "id_key": "event_id",
+                            "label_key": "event_id",
+                            "parameters":{
+                                "order_by":"event_id"
+                            }
+                        }
+                    }]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "selection_buffer",
+                        "label": "FORM_BUFFER_VMAP_BUSINESS_OBJECT",
+                        "default_value": 5,
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "index",
+                        "label": "FORM_INDEX_VMAP_BUSINESS_OBJECT",
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "min_edition_scale",
+                        "label": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "required": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "max_edition_scale",
+                        "label": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "required": false,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 6,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"development\")"
+                            }
+                        ]
+                    }
+                ]
+            }]
+    },
+    "display": {
+        "name": "vmap_business_object_display_form",
+        "title": "Paramètres de l'objet métier",
+        "input_size": "xs",
+        "nb_cols": 6,
+        "rows": [{
+                "fields": [{
+                        "type": "label",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0",
+                        "id": "ééé_1_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "title",
+                        "label": "FORM_TITLE_DEVELOPMENT_0",
+                        "id": "éé_2_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "formtitle",
+                        "label": "FORM_FORMTITLE_DEVELOPMENT_0",
+                        "id": "éé_2_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "summarytitle",
+                        "label": "FORM_SUMMARYTITLE_DEVELOPMENT_0",
+                        "id": "éé_2_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "id_field",
+                        "label": "FORM_ID_FIELD_DEVELOPMENT_0",
+                        "id": "New_el_1_3_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "database",
+                        "label": "FORM_DATABASE_DEVELOPMENT_0",
+                        "id": "New_el_2_4_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "schema",
+                        "label": "FORM_SCHEMA_DEVELOPMENT_0",
+                        "id": "New_el_3_5_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "table",
+                        "label": "FORM_TABLE_DEVELOPMENT_0",
+                        "id": "New_el_4_6_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "sql_summary",
+                        "label": "FORM_SQL_SUMMARY_DEVELOPMENT_0",
+                        "id": "New_el_6_8_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "sql_form",
+                        "label": "FORM_SQL_FORM_DEVELOPMENT_0",
+                        "id": "New_el_8_10_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "sorted_by",
+                        "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                        "id": "New_el_9_11_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "geom_column",
+                        "label": "FORM_GEOM_COLUMN_DEVELOPMENT_0",
+                        "id": "New_el_10_12_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "search_field",
+                        "label": "FORM_SEARCH_FIELD_0",
+                        "id": "New_el_11_13_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "result_field",
+                        "label": "FORM_RESULT_FIELD_0",
+                        "id": "New_el_12_14_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "search_use_strict",
+                        "label": "FORM_SEARCH_USE_STRICT_0",
+                        "id": "New_el_12_14_1",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "edit_form_size",
+                        "label": "EDIT_FORM_SIZE",
+                        "id": "New_el_12_14_2",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "display_form_size",
+                        "label": "DISPLAY_FORM_SIZE",
+                        "id": "New_el_12_14_2",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "add_form_size",
+                        "label": "ADD_FORM_SIZE",
+                        "id": "New_el_12_14_2",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "event_id",
+                        "label": "FORM_EVENT_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "selection_buffer",
+                        "label": "FORM_BUFFER_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [{
+                        "type": "label",
+                        "name": "index",
+                        "label": "FORM_INDEX_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "max_snapping_scale",
+                        "label": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "number",
+                        "name": "min_snapping_scale",
+                        "label": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"development\")"
+                            }
+                        ]
+                    }
+                ]
+            }]
+    }
+}
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_event.json b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_event.json
new file mode 100755
index 0000000000000000000000000000000000000000..3523d8edf9ef09124ce3476a6b78aaf16f6d1eba
--- /dev/null
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_event.json
@@ -0,0 +1,211 @@
+{
+    "search":{
+        "name":"vmap_business_object_event_search_form",
+        "title":"",
+        "input_size":"xxs",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"event_id",
+                        "label":"FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT",
+                        "nb_cols":4
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-xs",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"search",
+                                "label":"FORM_SEARCH_BUTTON",
+                                "class":"btn-primary",
+                                "event":"setGridFilter()"
+                            },
+                            {
+                                "type":"reset",
+                                "name":"reset",
+                                "label":"FORM_RESET_BUTTON",
+                                "class":"btn-primary",
+                                "event":"resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update":{
+        "name":"vmap_business_object_event_update_form",
+        "title":"FORM_TITLE_VMAP_BUSINESS_OBJECT_EVENT",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"event_id",
+                        "label":"FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT",
+                        "nb_cols":6,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT",
+                        "size":13,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_UPDATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert":{
+        "name":"vmap_business_object_event_insert_form",
+        "title":"FORM_TITLE_VMAP_BUSINESS_OBJECT_EVENT",
+        "input_size":"xs",
+        "event":"sendSimpleForm()",
+        "afterEvent":"editSectionForm()",
+        "nb_cols":12,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"text",
+                        "name":"event_id",
+                        "label":"FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT",
+                        "required":true,
+                        "nb_cols":6,
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT_TOOLTIP",
+                            "container": "body"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"textarea",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT",
+                        "size":12,
+                        "nb_cols":9
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":6,
+                        "buttons":[
+                            {
+                                "type":"submit",
+                                "name":"form_submit",
+                                "label":"FORM_CREATE",
+                                "class":"btn-primary"
+                            },
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display":{
+        "name":"vmap_business_object_event_display_form",
+        "title":"FORM_TITLE_VMAP_BUSINESS_OBJECT_EVENT",
+        "input_size":"xs",
+        "nb_cols":6,
+        "rows":[
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"event_id",
+                        "label":"FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"label",
+                        "name":"description",
+                        "label":"FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT",
+                        "nb_cols":12
+                    }
+                ]
+            },
+            {
+                "fields":[
+                    {
+                        "type":"button",
+                        "class":"btn-ungroup btn-group-sm",
+                        "nb_cols":12,
+                        "buttons":[
+                            {
+                                "type":"button",
+                                "name":"return_list",
+                                "label":"FORM_RETURN_LIST",
+                                "class":"btn-primary",
+                                "event":"setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_printreport.json b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_printreport.json
new file mode 100755
index 0000000000000000000000000000000000000000..63ec08b04f34f51b3496d68671ac7e76b65995c7
--- /dev/null
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object_printreport.json
@@ -0,0 +1,622 @@
+{
+    "search": {
+        "name": "vmap_printreport_search_form",
+        "title": "",
+        "input_size": "xxs",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_PRINTREPORT",
+                        "nb_cols": 3
+                    },
+                    {
+                        "type": "select",
+                        "name": "rt_format_id",
+                        "label": "FORM_FORMAT_VMAP_PRINTREPORT",
+                        "nb_cols": 2,
+                        "web_service": {
+                            "ressource_id": "vmap/formats",
+                            "id_key": "rt_format_id",
+                            "label_key": "rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        }
+                    },
+                    {
+                        "type": "select",
+                        "name": "rt_orientation_id",
+                        "label": "FORM_ORIENTATION_VMAP_PRINTREPORT",
+                        "nb_cols": 2,
+                        "web_service": {
+                            "ressource_id": "vmap/orientations",
+                            "id_key": "rt_orientation_id",
+                            "label_key": "rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        }
+                    },
+                    {
+                        "type": "select",
+                        "name": "outputformats_id",
+                        "label": "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT",
+                        "nb_cols": 2,
+                        "web_service": {
+                            "ressource_id": "vmap/outputformats",
+                            "id_key": "outputformats_id",
+                            "label_key": "outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        }
+                    },
+                    {
+                        "type": "select",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT",
+                        "nb_cols": 2,
+                        "web_service": {
+                            "ressource_id": "vmap/businessobjects",
+                            "id_key": "business_object_id",
+                            "label_key": "business_object_id",
+                            "parameters":{
+                                "order_by":"business_object_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-xs",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "search",
+                                "label": "FORM_SEARCH_BUTTON",
+                                "class": "btn-primary",
+                                "event": "setGridFilter()"
+                            },
+                            {
+                                "type": "reset",
+                                "name": "reset",
+                                "label": "FORM_RESET_BUTTON",
+                                "class": "btn-primary",
+                                "event": "resetGridFilter()"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "update": {
+        "name": "vmap_printreport_update_form",
+        "title": "FORM_TITLE_VMAP_PRINTREPORT",
+        "input_size": "xs",
+        "beforeEvent": "beforeVmapAdminTemplateSubmit()",
+        "event": "sendSimpleForm()",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "printreport_id",
+                        "label": "FORM_PRINTTEMPLATE_ID_VMAP_PRINTREPORT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "rt_format_id",
+                        "label": "FORM_FORMAT_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/formats",
+                            "id_key": "rt_format_id",
+                            "label_key": "rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "rt_orientation_id",
+                        "label": "FORM_ORIENTATION_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/orientations",
+                            "id_key": "rt_orientation_id",
+                            "label_key": "rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "outputformats_id",
+                        "label": "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/outputformats",
+                            "id_key": "outputformats_id",
+                            "label_key": "outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/businessobjects",
+                            "id_key": "business_object_id",
+                            "label_key": "business_object_id",
+                            "parameters":{
+                                "order_by":"business_object_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "multiobject",
+                        "label": "FORM_MULTIOBJECT_VMAP_PRINTREPORT",
+                        "nb_cols": 12,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "default_value": false
+                    }
+                ]
+            },
+            {
+                "fields": [{
+                        "type": "codemirror",
+                        "name": "htmldefinition",
+                        "label": "FORM_HTML_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 8,
+                        "required": true,
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "appName": "htmldefinition"
+                        }
+                    }, {
+                        "type": "codemirror",
+                        "name": "jsonobjects",
+                        "label": "FORM_JSON_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 4,
+                        "required": true,
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "appName": "jsonobjects"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_UPDATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "insert": {
+        "name": "vmap_printreport_insert_form",
+        "title": "FORM_TITLE_VMAP_PRINTREPORT",
+        "input_size": "xs",
+        "beforeEvent": "beforeVmapAdminTemplateSubmit()",
+        "event": "sendSimpleForm()",
+        "afterEvent": "editSectionForm()",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "text",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "rt_format_id",
+                        "label": "FORM_FORMAT_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/formats",
+                            "id_key": "rt_format_id",
+                            "label_key": "rt_format_id",
+                            "parameters":{
+                                "order_by":"rt_format_id"
+                            }
+                        },
+                        "options": ["|"]
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "rt_orientation_id",
+                        "label": "FORM_ORIENTATION_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/orientations",
+                            "id_key": "rt_orientation_id",
+                            "label_key": "rt_orientation_id",
+                            "parameters":{
+                                "order_by":"rt_orientation_id"
+                            }
+                        },
+                        "options": ["|"]
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "outputformats_id",
+                        "label": "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/outputformats",
+                            "id_key": "outputformats_id",
+                            "label_key": "outputformats_id",
+                            "parameters":{
+                                "order_by":"outputformats_id"
+                            }
+                        },
+                        "default_value": "pdf"
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "business_object_id",
+                        "label": "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT",
+                        "required": true,
+                        "nb_cols": 3,
+                        "web_service": {
+                            "ressource_id": "vmap/businessobjects",
+                            "id_key": "business_object_id",
+                            "label_key": "business_object_id",
+                            "parameters":{
+                                "order_by":"business_object_id"
+                            }
+                        }
+                    }
+                ]
+            },
+            
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "name": "multiobject",
+                        "label": "FORM_MULTIOBJECT_VMAP_PRINTREPORT",
+                        "nb_cols": 12,
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "default_value": false
+                    }
+                ]
+            },
+            {
+                "fields": [{
+                        "type": "codemirror",
+                        "name": "htmldefinition",
+                        "label": "FORM_HTML_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 8,
+                        "required": true,
+                        "default_value": "",
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "appName": "htmldefinition"
+                        }
+                    }, {
+                        "type": "codemirror",
+                        "name": "jsonobjects",
+                        "label": "FORM_JSON_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 4,
+                        "required": true,
+                        "default_value": "",
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "appName": "jsonobjects"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [
+                            {
+                                "type": "submit",
+                                "name": "form_submit",
+                                "label": "FORM_CREATE",
+                                "class": "btn-primary"
+                            },
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    "display": {
+        "name": "vmap_printreport_display_form",
+        "title": "FORM_TITLE_VMAP_PRINTREPORT",
+        "input_size": "xs",
+        "nb_cols": 12,
+        "rows": [
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "printreport_id",
+                        "label": "FORM_PRINTTEMPLATE_ID_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "name",
+                        "label": "FORM_NAME_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "rt_format_id",
+                        "label": "FORM_FORMAT_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "rt_orientation_id",
+                        "label": "FORM_ORIENTATION_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "outputformats_id",
+                        "label": "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "business_object_title",
+                        "label": "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "multiobject",
+                        "label": "FORM_MULTIOBJECT_VMAP_PRINTREPORT",
+                        "nb_cols": 6
+                    }
+                ]
+            },
+            {
+                "fields": [{
+                        "type": "codemirror",
+                        "name": "htmldefinition",
+                        "label": "FORM_HTML_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 8,
+                        "required": true,
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "readOnly": "nocursor"
+                        }
+                    }, {
+                        "type": "codemirror",
+                        "name": "jsonobjects",
+                        "label": "FORM_JSON_DEFINITION_VMAP_PRINTREPORT",
+                        "nb_cols": 4,
+                        "required": true,
+                        "codemirrorOptions": {
+                            "runnable": true,
+                            "lineNumbers": true,
+                            "matchBrackets": true,
+                            "mode": "htmlmixed",
+                            "indentUnit": 4,
+                            "indentWithTabs": true,
+                            "enterMode": "keep",
+                            "tabMode": "shift",
+                            "appHeight": "50%",
+                            "readOnly": "nocursor"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 6,
+                        "buttons": [
+                            {
+                                "type": "button",
+                                "name": "return_list",
+                                "label": "FORM_RETURN_LIST",
+                                "class": "btn-primary",
+                                "event": "setMode(\"search\")"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/module/images/ajax-big-loader.GIF b/module/images/ajax-big-loader.GIF
new file mode 100755
index 0000000000000000000000000000000000000000..ab4871214b14361e4491cd549bb05a7e49a190ac
Binary files /dev/null and b/module/images/ajax-big-loader.GIF differ
diff --git a/module/images/ajax-load-big.gif b/module/images/ajax-load-big.gif
new file mode 100755
index 0000000000000000000000000000000000000000..e2a116c7280b4d9786ddb960fff4439a542866ec
Binary files /dev/null and b/module/images/ajax-load-big.gif differ
diff --git a/module/images/ajax-load.gif b/module/images/ajax-load.gif
new file mode 100755
index 0000000000000000000000000000000000000000..d0bce1542342e912da81a2c260562df172f30d73
Binary files /dev/null and b/module/images/ajax-load.gif differ
diff --git a/module/images/icon.png b/module/images/icon.png
new file mode 100755
index 0000000000000000000000000000000000000000..ed886623d54cc7972175302fad216a541dd349c3
Binary files /dev/null and b/module/images/icon.png differ
diff --git a/module/images/logo-veremes.jpg b/module/images/logo-veremes.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..4f2ab1b2db40fdc0c2adc4f1d9aa9212214f839e
Binary files /dev/null and b/module/images/logo-veremes.jpg differ
diff --git a/module/images/logo_departement_herault.jpg b/module/images/logo_departement_herault.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..e2bbae5c70df244a1e6234b3dca765758ad457da
Binary files /dev/null and b/module/images/logo_departement_herault.jpg differ
diff --git a/module/images/transparent.png b/module/images/transparent.png
new file mode 100755
index 0000000000000000000000000000000000000000..acc856928fc84de2f19fb85c326c943386f244ce
Binary files /dev/null and b/module/images/transparent.png differ
diff --git a/module/index-debug.html b/module/index-debug.html
new file mode 100755
index 0000000000000000000000000000000000000000..e7282b489604c39e6042c2d0d94050b436c1e6e2
--- /dev/null
+++ b/module/index-debug.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>vmap 2015</title>
+	<meta charset="utf-8">
+	<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+	<link rel="stylesheet" href="css/lib/bootstrap/css/bootstrap.min.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/bootstrap-toggle/bootstrap-toggle.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/bootstrap-checkbox/font-awesome.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/bootstrap-checkbox/build.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/colorpicker/css/bootstrap-colorpicker.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/bootstrap-table/bootstrap-table.min.css" type="text/css">
+	<link rel="stylesheet" href="css/lib/jquery-sortable/jquery-sortable.css" type="text/css">
+	<link rel="stylesheet" href="css/ol.css" type="text/css">
+	<link rel="stylesheet" href="css/fonts.css" type="text/css">
+	<link rel="stylesheet/less" href="css/vmap.less" type="text/css"/>
+	<script src="javascript/externs/less/less.min.js"></script>
+</head>
+<body ng-app='vmap'>
+
+	<!-- Contient l'application Vmap -->
+	<div app-vmap id="app-vmap"></div>
+
+	<script src="../closure/closure-library/closure/goog/base.js"></script>
+	<script src="javascript/externs/angular/angular.min.js"></script>
+	<script src="javascript/externs/angular/angular-animate.min.js"></script>
+	<script src="javascript/externs/jquery/jquery-1.9.1.min.js"></script>
+	<script src="javascript/externs/bootstrap/bootstrap.min.js"></script>
+	<script src="javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js"></script>
+	<script src="javascript/externs/colorpicker/js/bootstrap-colorpicker.min.js"></script>
+	<script src="javascript/externs/bootstrap-table/bootstrap-table.min.js"></script>
+	<script src="javascript/externs/bootstrap-table/bootstrap-table-export.js"></script>
+	<script src="javascript/externs/bootstrap-table/tableExport.js"></script>
+	<script src="javascript/externs/bootbox/bootbox.min.js"></script>
+	<script src="javascript/externs/jquery-sortable/jquery-sortable.js"></script>
+	<script src="javascript/externs/html2canvas/html2canvas.js"></script>
+	<script src="javascript/externs/jspdf/jspdf.debug.js"></script>
+
+	<script src="javascript/externs/ol.compiled/ol-debug.js"></script>
+	<!--<script src="javascript/app/modules/modules.list.js"></script>-->
+
+	<script src="javascript/app/vmap/map/map.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/wmssuggestions.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/wfssuggestions.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/loadgeometry.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/osmsuggestions.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/bingsuggestions.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/ignsuggestions.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/mymap.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/maplist.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmodal/mapmodal.js"></script>
+	<script src="javascript/app/vmap/mapmanager/layerstree.js"></script>
+	<script src="javascript/app/vmap/mapmanager/layersorder.js"></script>
+	<script src="javascript/app/vmap/mapmanager/maplegend.js"></script>
+	<script src="javascript/app/vmap/mapmanager/mapmanager.js"></script>
+	<script src="javascript/app/modules/Dessin/draw.js"></script>
+	<script src="javascript/app/modules/Cadastre/cadastre.js"></script>
+	<script src="javascript/app/vmap/tools/controls.js"></script>
+	<script src="javascript/app/vmap/tools/select.js"></script>
+	<script src="javascript/app/vmap/tools/measure.js"></script>
+	<script src="javascript/app/vmap/tools/location.js"></script>
+	<script src="javascript/app/vmap/tools/print.js"></script>
+	<script src="javascript/app/vmap/tools/basictools.js"></script>
+	<script src="javascript/app/vmap/tools/infocontainer.js"></script>
+	<script src="javascript/app/vmap/tools/toolsmanager.js"></script>
+	<script src="javascript/app/vmap/vmap.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/module/index-vitis.html b/module/index-vitis.html
new file mode 100755
index 0000000000000000000000000000000000000000..b372f3efcd2215af3c93458f03b55aa3c3148051
--- /dev/null
+++ b/module/index-vitis.html
@@ -0,0 +1,5 @@
+
+<!-- Contient l'application Vmap -->
+<!--<div app-vmap id="app-vmap"></div>-->
+
+<div app-vmap-loader id="app-vmap-loader" style="height:100%"></div>
diff --git a/module/index.html b/module/index.html
new file mode 100755
index 0000000000000000000000000000000000000000..b0da47bec279146ebc063dc7b29401ce1377b77c
--- /dev/null
+++ b/module/index.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>vmap 2015</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+		<link rel="stylesheet" href="css/lib/bootstrap/css/bootstrap.min.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/bootstrap-toggle/bootstrap-toggle.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/bootstrap-checkbox/font-awesome.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/bootstrap-checkbox/build.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/colorpicker/css/bootstrap-colorpicker.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/bootstrap-table/bootstrap-table.min.css" type="text/css">
+		<link rel="stylesheet" href="css/lib/jquery-sortable/jquery-sortable.css" type="text/css">
+		<link rel="stylesheet" href="css/ol.css" type="text/css">
+		<link rel="stylesheet" href="css/fonts.css" type="text/css">
+		<link rel="stylesheet/less" href="css/vmap.less" type="text/css"/>
+		<script src="javascript/externs/less/less.min.js"></script>
+	</head>
+	<body ng-app='vmap'>
+		
+		<!-- Contient l'application Vmap -->
+		<div app-vmap id="app-vmap"></div>
+
+		<script src="javascript/externs/angular/angular.min.js"></script>
+		<script src="javascript/externs/angular/angular-animate.min.js"></script>
+		<script src="javascript/externs/jquery/jquery-1.9.1.min.js"></script>
+		<script src="javascript/externs/bootstrap/bootstrap.min.js"></script>
+		<script src="javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js"></script>
+		<script src="javascript/externs/colorpicker/js/bootstrap-colorpicker.min.js"></script>
+		<script src="javascript/externs/bootstrap-table/bootstrap-table.min.js"></script>
+		<script src="javascript/externs/bootstrap-table/bootstrap-table-export.js"></script>
+		<script src="javascript/externs/bootstrap-table/tableExport.js"></script>
+		<script src="javascript/externs/bootbox/bootbox.min.js"></script>
+		<script src="javascript/externs/jquery-sortable/jquery-sortable.js"></script>
+		<script src="javascript/externs/html2canvas/html2canvas.js"></script>
+		<script src="javascript/externs/jspdf/jspdf.debug.js"></script>
+		<script src="javascript/app/vmap.min.js"></script>
+	</body>
+</html>
\ No newline at end of file
diff --git a/module/javascript/app/modules/Cadastre/cadastre.js b/module/javascript/app/modules/Cadastre/cadastre.js
new file mode 100644
index 0000000000000000000000000000000000000000..eaed9561ddf04f859db73cc3d68093fbb45210e4
--- /dev/null
+++ b/module/javascript/app/modules/Cadastre/cadastre.js
@@ -0,0 +1,3997 @@
+/* global goog, nsVmap, oVmap, ol, angular, bootbox */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.nsModules.Cadastre
+ * cette classe permet l'initialisation du module cadastre
+ */
+goog.provide('nsVmap.nsToolsManager.nsModules.Cadastre');
+
+goog.require('oVmap');
+
+goog.require('ol.geom.Point');
+goog.require('ol.format.WKT');
+goog.require('ol.Feature');
+goog.require('ol.source.Vector');
+goog.require('ol.layer.Vector');
+goog.require('ol.Collection');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.nsModules.Cadastre}: Add the cadastre tools defined in data/tools.json
+ * @param {object} opt_options options
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre');
+};
+goog.exportProperty(nsVmap.nsToolsManager.nsModules, 'Cadastre', nsVmap.nsToolsManager.nsModules.Cadastre);
+
+/**
+ * Check all the rows in a table and reset the view
+ * @param {string} table table html identifier
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.tableCheckAll = function (table) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.tableCheckAll');
+
+    $(table).bootstrapTable('checkAll');
+    $(table).bootstrapTable('toggleView');
+    $(table).bootstrapTable('toggleView');
+};
+
+/**
+ * Uncheck all the rows in a table and reset the view
+ * @param {string} table table html identifier
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.tableUncheckAll = function (table) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.tableCheckAll');
+
+    $(table).bootstrapTable('uncheckAll');
+    $(table).bootstrapTable('toggleView');
+    $(table).bootstrapTable('toggleView');
+};
+
+/**
+ * App-specific directive wrapping the cadastre tools. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreDirective");
+    return {
+        restrict: 'C',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'selection': '=appInfos',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppcadastreController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/modules/cadastre.html'
+    };
+};
+
+/**
+ * Cadastre controller
+ * @param {object} $scope
+ * @export
+ * @constructor
+ * @ngInject
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController = function ($scope, $sce) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController");
+
+    /**
+     * Limite des valeurs sélectionnables
+     */
+    this.limit = 100;
+
+    if (goog.isDefAndNotNull(oVmap['properties']['cadastre'])) {
+        if (goog.isDefAndNotNull(oVmap['properties']['cadastre']['selection_limit'])) {
+            this.limit = oVmap['properties']['cadastre']['selection_limit'];
+        }
+    }
+
+    /**
+     * @type {ol.interaction.Draw}
+     * @private
+     */
+    this.draw_;
+
+    /**
+     * Query buffer in mm on screen (look postgis st_buffer for more information)
+     * @type integer
+     */
+    this.buffer_ = oVmap['properties']["cadastre"]["selection_buffer"];
+
+    /**
+     * temp for bootstrap table
+     * type {array<object>}
+     */
+    this.bootstrapTableTemp = [];
+
+    this['isCadastreLightUser'] = sessionStorage['privileges'].indexOf('vmap_cadastre_user') === -1 && sessionStorage['privileges'].indexOf('vmap_cadastre_light_user') !== -1;
+
+    /**
+     * Current mode
+     * @type {string}
+     */
+    this['currentMode'] = '';
+
+    /**
+     * Current parcelle mode
+     * @type {string}
+     */
+    this['currentParcelleMode'] = '';
+
+    /**
+     * Current mode
+     * @type {string}
+     */
+    this['searchOnMapCurrentMode'] = '';
+
+    /**
+     * Current parcelle mode
+     * @type {string}
+     */
+    this['searchOnMapCurrentDrawMode'] = '';
+
+    /**
+     * temp variable witch contains id_par
+     * @type {string}
+     */
+    this['tmpID_PAR'] = '';
+
+    /**
+     * temp variable witch contains id_par
+     * @type {string}
+     */
+    this['tmpID_DNUPRO'] = '';
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$sce_ = $sce;
+
+    /**
+     * Infos sur la parcelle à décrire dans la fiche descriptive
+     * @type {object}
+     */
+    this['oParcelleInfos'] = {};
+
+    /**
+     * Tableau des communes
+     * @type {object}
+     */
+    this['aCommunes'] = [];
+
+    /**
+     * Tableau des sections
+     * @type {array<object>}
+     */
+    this['aSections'] = [];
+
+    /**
+     * Tableau des adresses
+     * @type {array<object>}
+     */
+    this['aAdresses'] = [];
+
+    /**
+     * Définit si la sélection est multiple ou pas
+     * @type {boolean}
+     */
+    this['locationMultiple'] = false;
+
+    this['tablesSelection'] = {
+        '#Cadastre-rapports-table-parcelle': [],
+        '#Cadastre-rapports-table-comptes': []
+    };
+
+    /**
+     * List of the form elements
+     * @type {array}
+     * @private
+     */
+    this.aFormList_ = [];
+
+    /**
+     * Number of elemnts on the aFormList_ displayed
+     * @type {integer}
+     * @private
+     */
+    this.aFormElementsDisplayed_ = 0;
+
+    /**
+     * Projection of the cadastre database
+     * @type {string}
+     * @private
+     */
+    this.cadastreProjection_ = oVmap['properties']['cadastre']['database_projection'];
+
+    /**
+     * Name of the cadastre api
+     * @type string
+     * @private
+     */
+    this['cadastreAPI_'] = oVmap["properties"]["cadastre"]["api"];
+
+    // Charge les communes
+    this.getBaseElem(oVmap["properties"]["cadastre"]["api"] + '/communes', 'aCommunes', '', 'nom');
+
+    $('#Section-table-section').bootstrapTable({data: {}});
+    $('#Lieu-dit-table-lieu-dit').bootstrapTable({data: {}});
+    $('#Parcelle-table-parcelle').bootstrapTable({data: {}});
+    // $('#Parcelle-par-adresse-DGFiP-table-voie').bootstrapTable({data:{}});
+    // $('#Parcelle-par-proprietaire-table-proprietaire').bootstrapTable({data:{}});
+    $('#Parcelle-par-proprietaire-table-comptes').bootstrapTable({data: {}});
+    $('#Parcelle-par-proprietaire-table-parcelles').bootstrapTable({data: {}});
+    // $('#Bati-par-proprietaire-table-proprietaire').bootstrapTable({data:{}});
+    $('#Bati-par-proprietaire-table-comptes').bootstrapTable({data: {}});
+    $('#Bati-par-proprietaire-table-invariants').bootstrapTable({data: {}});
+    $('#Bati-par-proprietaire-table-parcelles').bootstrapTable({data: {}});
+
+    // Donne au bouton dropdown la valeur qui lui correspond
+    $(".dropdown-menu-auto li a").click(function () {
+        var selText = $(this).text();
+        $(this).parents('.btn-group').find('.dropdown-toggle').find('div').html(selText);
+        $('.inactive').removeClass('active');
+    });
+
+    // Auto-scroll en haut de la modale quand on la ferme
+    $('#descriptive-parcelle-sheet-modal').on('shown.bs.modal', function () {
+        $('#descriptive-parcelle-sheet-content').scrollTop(0);
+    })
+    $('#descriptive-invariant-sheet-modal').on('shown.bs.modal', function () {
+        $('#descriptive-invariant-sheet-content').scrollTop(0);
+    })
+
+    $scope['parseFloat'] = function (value) {
+        return parseFloat(value);
+    };
+    $scope['trim'] = function (value) {
+        return value.trim();
+    };
+    $scope['isLink'] = function (sString) {
+        return oVmap.isLink(sString, 'link');
+    };
+    $scope['getRenderedParsedLink'] = function (sString) {
+
+        if(sString.indexOf('<a') === 0 && sString.indexOf('[') !== 0 ){
+            sString = oVmap.checkLink(sString);
+        }else{
+            sString = oVmap.parseLink(sString, 'link');
+        }
+        return $sce.trustAsHtml(sString);
+    };
+};
+
+/**
+ * Add a item to the Card (selection)
+ * @param {string} type (commune/section/lieuDit/parcelle/bati)
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addToCard = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addToCard');
+    oVmap.log('addToCard: ' + type);
+
+    var this_ = this;
+
+    // timeout le temps que le curçeur se mette à wait
+    setTimeout(function () {
+
+        if (type === "commune") {
+
+            this_.selectCommuneForm('#Commune-select-commune');
+
+        } else if (type === "section") {
+
+            this_.selectSectionForm('#Section-select-commune', '#Section-table-section');
+
+        } else if (type === "lieuDit") {
+
+            this_.selectLieuDitForm('#Lieu-dit-select-commune', '#Lieu-dit-table-lieu-dit');
+
+        } else if (type === "parcelle") {
+
+            oVmap.log('addToCard: ' + this_['currentParcelleMode']);
+            if (this_['currentParcelleMode'] === 'section') {
+
+                this_.selectParcelleBySectionForm('#Parcelle-select-commune',
+                        '#Parcelle-select-section',
+                        '#Parcelle-table-parcelle');
+
+            } else if (this_['currentParcelleMode'] === 'adresse') {
+
+                this_.selectParcelleByAdresse('#Parcelle-par-adresse-DGFiP-select-commune',
+                        '#Parcelle-par-adresse-DGFiP-table-voie',
+                        '#Parcelle-par-adresse-DGFiP-select-adresse');
+
+            } else if (this_['currentParcelleMode'] === 'proprietaire') {
+
+                this_.selectParcelleByProprietaire('#Parcelle-par-proprietaire-select-commune',
+                        '#Parcelle-par-proprietaire-table-proprietaire',
+                        '#Parcelle-par-proprietaire-table-comptes',
+                        '#Parcelle-par-proprietaire-table-parcelles');
+            }
+
+        } else if (type === "bati") {
+
+            this_.selectBatiByProprietaire('#Bati-par-proprietaire-select-commune',
+                    '#Bati-par-proprietaire-table-proprietaire',
+                    '#Bati-par-proprietaire-table-comptes',
+                    '#Bati-par-proprietaire-table-invariants',
+                    '#Bati-par-proprietaire-table-parcelles');
+        }
+    }, 100);
+};
+
+/**
+ * Add a item to the location
+ * @param {string} type (commune/section/lieuDit/parcelle/bati)
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateSelection = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateSelection');
+
+    if (type === "commune") {
+
+        this.localiseFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', '#Commune-select-commune');
+
+    } else if (type === "section") {
+
+        this.localiseFromTable(oVmap["properties"]["cadastre"]["api"] + '/sections', 'id_sec', '#Section-table-section');
+
+    } else if (type === "lieuDit") {
+
+        this.localiseFromTable(oVmap["properties"]["cadastre"]["api"] + '/lieudits', 'oid', '#Lieu-dit-table-lieu-dit');
+
+    } else if (type === "parcelle") {
+
+        oVmap.log(this['currentParcelleMode']);
+
+        if (this['currentParcelleMode'] === 'section') {
+
+            this.localiseFromTable(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', '#Parcelle-table-parcelle');
+
+        } else if (this['currentParcelleMode'] === 'adresse') {
+
+            this.localiseParcelleByAdresse('#Parcelle-par-adresse-DGFiP-table-voie', '#Parcelle-par-adresse-DGFiP-select-adresse');
+
+        } else if (this['currentParcelleMode'] === 'proprietaire') {
+
+            this.localiseFromTable(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', '#Parcelle-par-proprietaire-table-parcelles', 'ID_PAR');
+
+        }
+
+    } else if (type === "bati") {
+
+        this.localiseFromTable(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', '#Bati-par-proprietaire-table-parcelles');
+
+    }
+};
+
+/**
+ * Select the located elements
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectLocation = function () {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectLocation');
+
+    var aLocatedFeatures = oVmap.getMap().getLocationOverlayFeatures().getArray();
+    var tmpType = '';
+
+    // Contiendra toutes les features de chache type
+    var tempFeatures = {
+        'commune': [],
+        'section': [],
+        'lieuDit': [],
+        'parcelle': [],
+        'bati': []
+    };
+
+    // Stocke toutes les features de chache type
+    for (var i = 0; i < aLocatedFeatures.length; i++) {
+        tmpType = aLocatedFeatures[i].get('type');
+        tempFeatures[tmpType].push(aLocatedFeatures[i]);
+    }
+
+    // Ajoute les elements stockés au panier
+    for (var typeItem in tempFeatures) {
+
+        if (tempFeatures[typeItem].length > 0) {
+
+            // Récupère les infos
+            for (var i = 0; i < tempFeatures[typeItem].length; i++) {
+                tempFeatures[typeItem][i] = tempFeatures[typeItem][i].get('infos');
+            }
+
+            if (typeItem === "commune") {
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', tempFeatures[typeItem], 'id_com', 'veremes_cadastre_commune', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_commune');
+                });
+
+            } else if (typeItem === "section") {
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_section') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_section', tabName: 'Section', actions: ['zoom', 'delete']});
+
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/sections', 'id_sec', tempFeatures[typeItem], 'id_sec', 'veremes_cadastre_section', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_section');
+                });
+
+            } else if (typeItem === "lieuDit") {
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_lieu_dit') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_lieu_dit', tabName: 'Lieu-dit', actions: ['zoom', 'delete']});
+
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/lieudits', 'oid', tempFeatures[typeItem], 'oid', 'veremes_cadastre_lieu_dit', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_lieu_dit');
+                });
+
+            } else if (typeItem === "parcelle") {
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', tempFeatures[typeItem], 'id_par', 'veremes_cadastre_parcelle', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_parcelle');
+                });
+
+            } else if (typeItem === "bati") {
+
+                // Crée l'onglet correspondant à la parcelle
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_invariant') === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_invariant', tabName: 'Invariant', actions: ['delete']});
+
+                // Ajoute les infos de l'invariant
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/invariants', 'ID_PAR', tempFeatures[typeItem], 'id_par', 'veremes_cadastre_invariant', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_invariant');
+                    oVmap.getToolsManager().getInfoContainer().displayTabByCode('veremes_cadastre_invariant');
+                });
+
+                // Ajoute les infos de la parcelle
+                this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', tempFeatures[typeItem], 'id_par', 'veremes_cadastre_parcelle', function () {
+                    oVmap.getToolsManager().getInfoContainer().showBar();
+                    oVmap.getToolsManager().getInfoContainer().displayTabFeatures('veremes_cadastre_parcelle');
+                    oVmap.getToolsManager().getInfoContainer().displayTabByCode('veremes_cadastre_invariant');
+                });
+
+            }
+        }
+    }
+};
+
+/**
+ * Select the cadastre infos on the map
+ * @param {string} type Type of selection
+ * @param {boolean} isActive true if the action is already active
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateCadastreOnMap = function (type, isActive) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateCadastreOnMap');
+
+    this.removeMapInteractions();
+
+    if (isActive) {
+        return 0;
+    }
+
+    if (this['searchOnMapCurrentMode'] === '')
+        return 0;
+
+    if (type === 'Point') {
+
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur un point pour sélectionner');
+        // Active l'évènement sur la carte
+        oVmap.getMap().setEventOnMap('singleclick', this.locateByPoint, this, 'cadastre-selectBy' + type);
+
+    } else if (type === 'LineString') {
+
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Dessiner une ligne pour sélectionner');
+        this.locateByDrawing('LineString');
+
+    } else if (type === 'Polygon') {
+
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Dessiner un polygone pour sélectionner');
+        this.locateByDrawing('Polygon');
+
+    } else if (type === 'Circle') {
+
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Dessiner un cercle pour sélectionner');
+        this.locateByDrawing('Circle');
+
+    }
+};
+
+/**
+ * Select the cadastre infos on the map
+ * @param {string} type Type of selection
+ * @param {boolean} isActive true if the action is already active
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectCadastreOnMap = function (type, isActive) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectCadastreOnMap');
+
+    this.removeMapInteractions();
+
+    if (isActive) {
+        return 0;
+    }
+
+    if (type === 'FicheDescriptive') {
+
+        // Change de mode
+        this['searchOnMapCurrentMode'] = 'FicheDescriptive';
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur un point pour générer la fiche descriptive');
+        // Active l'évènement sur la carte
+        oVmap.getMap().setEventOnMap('singleclick', function (evt) {
+            this.selectRapportOnMap(evt, 'ficheDescriptive');
+        }, this, 'cadastre-' + type);
+
+    }
+    if (type === 'ReleveDePropriete') {
+
+        // Change de mode
+        this['searchOnMapCurrentMode'] = 'ReleveDePropriete';
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur un point pour générer le relevé de propriété');
+        // Active l'évènement sur la carte
+        oVmap.getMap().setEventOnMap('singleclick', function (evt) {
+            this.selectRapportOnMap(evt, 'releveDePropriete');
+        }, this, 'cadastre-' + type);
+
+    }
+    if (type === 'FicheUrbanisme') {
+
+        // Change de mode
+        this['searchOnMapCurrentMode'] = 'FicheUrbanisme';
+        // Affiche la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur un point pour générer la fiche d\'urbanisme');
+        // Active l'évènement sur la carte
+        oVmap.getMap().setEventOnMap('singleclick', function (evt) {
+            this.selectRapportOnMap(evt, 'ficheUrbanisme');
+        }, this, 'cadastre-' + type);
+
+    }
+};
+
+/**
+ *
+ * @param {event} evt
+ * @param {string} type (ficheDescriptive/releveDePropriete/ficheUrbanisme
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectRapportOnMap = function (evt, type) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectRapportOnMap');
+
+    // Construction d'une feature en wkt dans la projection de la base
+    var geometry = new ol.geom.Point(evt.coordinate);
+    var EWKTGeometry = oVmap.getEWKTFromGeom(geometry);
+
+    this['tmpID_PAR'] = '';
+    this['tmpID_DNUPRO'] = '';
+
+    var buffer = 0.01;
+    var scale = oVmap.getMap().getScale();
+    buffer = (this.buffer_ * scale) / 1000;
+
+    // Trouve la parcelle correspondante
+    var filter = {
+        "column": "geom",
+        "compare_operator": "intersect",
+        "compare_operator_options": {
+            "source_proj": this.cadastreProjection_.substring(5),
+            "intersect_buffer": buffer,
+            "intersect_buffer_geom_type": 'point'
+        },
+        "value": EWKTGeometry
+    };
+
+    var cadastreController = this;
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/parcelles',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'filter': filter,
+            'limit': 1,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vide les text features
+            oVmap.getMap().getTextOverlayFeatures().clear();
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                oVmap.getMap().addTextOverlayFeature('Pas de données à afficher', evt.coordinate);
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            if (data.length >= cadastreController.limit) {
+                var sAlert = '<h4>Attention, vous avez atteint la limite d\'objects affichables sur la carte</h4>';
+                bootbox.alert(sAlert);
+            }
+
+            var id_par = data[0]['id_par'];
+            cadastreController['tmpID_PAR'] = id_par;
+
+            // Vide la locatlisation
+            if (cadastreController['locationMultiple'] === false)
+                oVmap.getMap().getLocationOverlayFeatures().clear();
+
+            // Ajoute la nouvelle localisation
+            cadastreController.addLocationGeometries(data, 'parcelle', false);
+
+            // Fiche descriptive de la parcelle
+            if (type === 'ficheDescriptive')
+                cadastreController.displayParcelleDescriptiveSheet(id_par);
+
+            // Relevé de propriété
+            if (type === 'releveDePropriete') {
+                $('#releve-propriete-modal-menu').modal('show');
+            }
+
+            // Fiche d'urbanisme
+            if (type === 'ficheUrbanisme') {
+                cadastreController.displayUrbanismeSheet(id_par);
+            }
+            if (cadastreController['cadastreAPI_'] === "cadastre") {
+                var param = "ID_PAR";
+            } else {
+                var param = "id_par";
+            }
+
+            // Récupère d'IDDNUPRO
+            ajaxRequest({
+                'method': 'GET',
+                'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/descriptionparcelles',
+                'headers': {
+                    'Accept': 'application/x-vm-json'
+                },
+                'params': {
+                    'filter': {
+                        "column": param,
+                        "compare_operator": "=",
+                        "value": id_par
+                    },
+                    'limit': cadastreController.limit,
+                    'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+                },
+                'scope': cadastreController.$scope_,
+                'success': function (response) {
+
+                    // Vérifie si il y a un résultat
+                    if (!goog.isDef(response['data']['data'])) {
+                        console.error('Pas de données à afficher');
+                        return 0;
+                    }
+
+                    var data = response['data']['data'];
+
+                    if (data.length >= cadastreController.limit) {
+                        var sAlert = 'Attention, vous avez atteint la limite d\'objects affichables sur la carte';
+                        $.notify(sAlert, "warn");
+                    }
+
+                    cadastreController['tmpID_DNUPRO'] = data[0]['ID_DNUPRO'];
+                }
+            });
+        }
+    });
+};
+
+/**
+ * Locate item by EWKT geometry
+ * @param {string} WKTGeometry EWKT Geometry
+ * @param {string} currentMode the current mode (parcelle/commune...)
+ * @param {string} lastPointCoordinates last Point Coordinates
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByWKTGeom = function (EWKTGeometry, currentMode, lastPointCoordinates) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByWKTGeom');
+
+    var ressource = '';
+    var cadastreController = this;
+
+    var sGeomType = oVmap.getGeomFromEWKT(EWKTGeometry).getType();
+    var buffer = null;
+    if (sGeomType === 'Point' || sGeomType === 'LineString') {
+        var scale = oVmap.getMap().getScale();
+        buffer = (this.buffer_ * scale) / 1000;
+    }
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    var filter = {
+        "column": "geom",
+        "compare_operator": "intersect",
+        "compare_operator_options": {
+            "source_proj": this.cadastreProjection_.substring(5)
+        },
+        "value": EWKTGeometry
+    };
+
+    if (goog.isDefAndNotNull(buffer)) {
+        filter['compare_operator_options']['intersect_buffer'] = buffer;
+        filter['compare_operator_options']['intersect_buffer_geom_type'] = 'point';
+    }
+
+    if (currentMode === 'commune') {
+        // Sélection de la commune
+        ressource = 'communes';
+    } else if (currentMode === 'section') {
+        // Sélection de la section
+        ressource = 'sections';
+    } else if (currentMode === 'lieuDit') {
+        // Sélection du lieu dit
+        ressource = 'lieudits';
+    } else if (currentMode === 'parcelle') {
+        // Sélection de la parcelle
+        ressource = 'parcelles';
+    } else if (currentMode === 'bati') {
+        ressource = 'parcelles';
+    } else {
+        return 'mode non valide';
+    }
+
+    var limit = this.limit;
+    if (sGeomType === 'Point') {
+        limit = 1;
+    }
+
+    $('body').css({"cursor": "wait"});
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/' + ressource,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'filter': filter,
+            'limit': limit,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            $('body').css({"cursor": ""});
+
+            // Vide les text features
+            oVmap.getMap().getTextOverlayFeatures().clear();
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                oVmap.getMap().addTextOverlayFeature('Pas de données à afficher', lastPointCoordinates);
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            if (data.length >= cadastreController.limit) {
+                var sAlert = 'Attention, vous avez atteint la limite d\'objects affichables sur la carte';
+                $.notify(sAlert, "warn");
+            }
+
+            // Vide la localisation
+            if (cadastreController['locationMultiple'] === false) {
+                oVmap.getMap().getLocationOverlayFeatures().clear();
+            }
+
+            // Ajoute la nouvelle localisation
+            cadastreController.addLocationGeometries(data, currentMode, false);
+        },
+        'error': function (response) {
+            $('body').css({"cursor": ""});
+        }
+    });
+};
+
+/**
+ * Locate by point
+ * @param {object} evt html event onclick
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByPoint = function (evt) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByPoint');
+
+    // Construction d'une feature en wkt dans la projection de la base
+    var geometry = new ol.geom.Point(evt.coordinate);
+    var EWKTGeometry = oVmap.getEWKTFromGeom(geometry);
+
+    this.locateByWKTGeom(EWKTGeometry, this['searchOnMapCurrentMode'], evt.coordinate);
+};
+
+/**
+ * Add the interaction of drawing for location
+ * @param {ol.geom.GeometryType} type Type of draw
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByDrawing = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.locateByDrawing');
+
+    this.draw_ = oVmap.getMap().setDrawInteraction({type: type}, 'cadastre-selectBy' + type);
+
+    this.draw_.on('drawend',
+            function (evt) {
+
+                // Récupère la dernière feature ajoutée
+                var feature = evt.feature;
+                var EWKTGeometry = oVmap.getEWKTFromGeom(feature.getGeometry());
+
+                // Localise le contenu
+                this.locateByWKTGeom(EWKTGeometry, this['searchOnMapCurrentMode'], evt.feature.getGeometry().getLastCoordinate());
+            }, this);
+};
+
+/**
+ * In the 'Recherche avancée' menu, put Point mode selection by default
+ * @param {string} searchOnMapCurrentMode
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.searchOnMapInit = function (searchOnMapCurrentMode) {
+
+    if (this['searchOnMapCurrentMode'] === searchOnMapCurrentMode) {
+        this['searchOnMapCurrentMode'] = '';
+        if (this['currentAction'] === 'cadastre-selectByPoint' || this['currentAction'] !== 'cadastre-selectByLineString' || this['currentAction'] !== 'cadastre-selectByPolygon')
+            oVmap.getMap().removeActionsAndTooltips();
+        return 0;
+    }
+
+    this['searchOnMapCurrentMode'] = searchOnMapCurrentMode;
+
+    if (this['currentAction'] !== 'cadastre-selectByLineString' && this['currentAction'] !== 'cadastre-selectByPolygon' && this.currentAction !== 'cadastre-selectByPoint')
+        this.locateCadastreOnMap('Point', this.currentAction === 'cadastre-selectByPoint');
+};
+
+/**
+ * Init the tables
+ * @param {rapports} rapports rapports div identifier
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.initRapportsBootstrapTables = function (rapports) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.initRapportsBootstrapTables');
+
+    var this_ = this;
+
+    // initialise les tables de la fenêtre rapport
+    if ($('#Cadastre-rapports-table-parcelle').bootstrapTable('getOptions').dataType === undefined) {
+        $(rapports).find('[data-toggle="table"]').bootstrapTable({});
+
+        // Rempli tablesSelection lorsque on clique sur une des lignes
+        var tmp = Date.now();
+        var setSelectedNumber = function (parcelleTable) {
+            if (tmp > Date.now() - 100) {
+                return null;
+            }
+            tmp = Date.now();
+            setTimeout(function () {
+                var aSelected = $(parcelleTable).bootstrapTable('getSelections');
+                this_['tablesSelection'][parcelleTable] = aSelected;
+            });
+        };
+
+        $('#Cadastre-rapports-table-parcelle').on('all.bs.table', function () {
+            setSelectedNumber('#Cadastre-rapports-table-parcelle');
+        });
+        $('#Cadastre-rapports-table-comptes').on('all.bs.table', function () {
+            setSelectedNumber('#Cadastre-rapports-table-comptes');
+        });
+    }
+
+    // Vide les tables
+    $(rapports).find('[data-toggle="table"]').bootstrapTable('load', []);
+
+    if (this['selection'].length === 0) {
+
+        goog.events.listenOnce(document.body, goog.events.EventType.CLICK, function (evt) {
+            var text = 'Ajoutez d\'abord des données au panier';
+            oVmap.displayTooltipError({target: '#cadastre-btn-container-actions-map-replace-card', type: 'top-left'}, text);
+        });
+
+        return 0;
+    }
+
+    this['show_veremes_cadastre_parcelle'] = false;
+    this['show_veremes_cadastre_compte'] = false;
+
+    for (var i = 0; i < this['selection'].length; i++) {
+        if (this['selection'][i]['tabCode'] === 'veremes_cadastre_parcelle') {
+
+            oVmap.log(this['selection'][i]['tableParams']['data']);
+
+            this['show_veremes_cadastre_parcelle'] = true;
+
+            $(rapports).find('#Cadastre-rapports-table-parcelle').bootstrapTable('load', this['selection'][i]['tableParams']['data']);
+        }
+        if (this['selection'][i]['tabCode'] === 'veremes_cadastre_compte') {
+            this['show_veremes_cadastre_compte'] = true;
+            $(rapports).find('#Cadastre-rapports-table-comptes').bootstrapTable('load', this['selection'][i]['tableParams']['data']);
+        }
+    }
+
+    if (this['show_veremes_cadastre_parcelle'] || this['show_veremes_cadastre_compte']) {
+        $('#rapports-modal').modal('show');
+    } else {
+        $.notify('Aucun rapport disponible pour cette sélection');
+    }
+
+};
+
+/**
+ * Display the fiche descriptive by a talbe
+ * @param {string} parcelleTable parcelle table identifier
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheetByTable = function (parcelleTable) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheetByTable');
+
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
+
+    if (selectedParcelles.length !== 1) {
+        $.notify('Veuillez sélectionner une unique parcelle', 'info');
+        return 0;
+    }
+
+    this.displayParcelleDescriptiveSheet(selectedParcelles[0]['id_par']);
+};
+
+/**
+ * Display the fiche descriptive by id_par
+ * @param {string} id_par id_par
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheet = function (id_par) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheet');
+
+    // Ajoute la description de la parcelle
+    var cadastreController = this;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/fichedescriptiveparcelle/' + id_par,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            cadastreController['oParcelleInfos'] = data;
+
+            cadastreController.displayParcelleDescriptiveSheet2();
+        }
+    });
+
+};
+
+/**
+ * Function called after the displayParcelleDescriptiveSheet ajax http requests
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheet2 = function () {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheet2');
+
+    var data = this['oParcelleInfos'];
+
+    /* Mise en page des données de la parcelle (le reste de la mise en page se fait dans cadastre.html)*/
+    // Surface Géographique
+    if (data['sup_fiscale'])
+        data['sup_fiscale'] = parseFloat(data['sup_fiscale']) + ' m²';
+    // Contenance
+    if (data['DCNTPA'])
+        data['DCNTPA'] = parseFloat(data['DCNTPA']) + ' m²';
+    // Batie
+    if (data['GPARBAT'] === '' || data['GPARBAT'] === ' ' || data['GPARBAT'] === 0 || data['GPARBAT'] === null)
+        data['GPARBAT'] = 'N';
+    else
+        data['GPARBAT'] = 'O';
+    // Urbaine
+    if (data['GURBPA'] !== 'U')
+        data['GURBPA'] = 'N';
+    else
+        data['GURBPA'] = 'O';
+
+    // Propriétaires
+    if (data['aProprietaires']) {
+        for (var i = 0; i < data['aProprietaires'].length; i++) {
+            data['aProprietaires'][i]['accordSexe'] = "(e)";
+
+            data['aProprietaires'][i]['DQUALP'] = goog.isDefAndNotNull(data['aProprietaires'][i]['DQUALP']) ? data['aProprietaires'][i]['DQUALP'] : "";
+
+            if (data['aProprietaires'][i]['DQUALP']) {
+                data['aProprietaires'][i]['DQUALP'] = data['aProprietaires'][i]['DQUALP'].trim();
+                if (data['aProprietaires'][i]['DQUALP'] === 'M')
+                    data['aProprietaires'][i]['accordSexe'] = "";
+                if (data['aProprietaires'][i]['DQUALP'] === 'MLE' || data['aProprietaires'][i]['DQUALP'] === 'MME')
+                    data['aProprietaires'][i]['accordSexe'] = "e";
+            }
+        }
+    }
+
+    // Subdivision Fiscales
+    if (data['aSubdivisionFiscale'])
+        data['aSubdivisionFiscale']['totalDcntsf'] = 0;
+    data['aSubdivisionFiscale']['totalDrcsuba'] = 0;
+    data['aSubdivisionFiscale']['totalDrcsub'] = 0;
+
+    for (var i = 0; i < data['aSubdivisionFiscale'].length; i++) {
+
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DCNTSF']))
+            data['aSubdivisionFiscale'][i]['DCNTSF'] = parseFloat(data['aSubdivisionFiscale'][i]['DCNTSF']) + ' m²';
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DRCSUBA']))
+            data['aSubdivisionFiscale'][i]['DRCSUBA'] = (Math.pow(10, -2) * parseFloat(data['aSubdivisionFiscale'][i]['DRCSUBA'])).toFixed(2) + ' €';
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DRCSUB']))
+            data['aSubdivisionFiscale'][i]['DRCSUB'] = (Math.pow(10, -2) * parseFloat(data['aSubdivisionFiscale'][i]['DRCSUB'])).toFixed(2) + ' €';
+
+
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DCNTSF']))
+            data['aSubdivisionFiscale']['totalDcntsf'] += parseFloat(data['aSubdivisionFiscale'][i]['DCNTSF']);
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DRCSUBA']))
+            data['aSubdivisionFiscale']['totalDrcsuba'] += parseFloat(data['aSubdivisionFiscale'][i]['DRCSUBA']);
+        if (goog.isDefAndNotNull(data['aSubdivisionFiscale'][i]['DRCSUB']))
+            data['aSubdivisionFiscale']['totalDrcsub'] += parseFloat(data['aSubdivisionFiscale'][i]['DRCSUB']);
+
+    }
+
+    if (goog.isDefAndNotNull(data['aSubdivisionFiscale']['totalDcntsf']))
+        data['aSubdivisionFiscale']['totalDcntsf'] = parseFloat(data['aSubdivisionFiscale']['totalDcntsf']) + ' m²';
+    if (goog.isDefAndNotNull(data['aSubdivisionFiscale']['totalDrcsuba']))
+        data['aSubdivisionFiscale']['totalDrcsuba'] = parseFloat(data['aSubdivisionFiscale']['totalDrcsuba']).toFixed(2) + ' €';
+    if (goog.isDefAndNotNull(data['aSubdivisionFiscale']['totalDrcsub']))
+        data['aSubdivisionFiscale']['totalDrcsub'] = parseFloat(data['aSubdivisionFiscale']['totalDrcsub']).toFixed(2) + ' €';
+
+    // Liens dans les intersections
+
+    this['oParcelleInfos'] = data;
+
+    // Affiche la modale
+    $('#descriptive-parcelle-sheet-modal').modal('show');
+};
+
+/**
+ * Display the fiche descriptive by a talbe
+ * @param {string} parcelleTable parcelle table identifier
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheetByTable = function (parcelleTable) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheetByTable');
+
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
+
+    if (selectedParcelles.length !== 1) {
+        $.notify('Veuillez sélectionner une unique parcelle', 'info');
+        return 0;
+    }
+
+    this.displayUrbanismeSheet(selectedParcelles[0]['id_par']);
+};
+
+/**
+ * Print the Urbanisme sheet by id_par
+ * @param {string} id_par
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheet = function (id_par) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheet');
+
+    if (!goog.isDef(id_par))
+        return 0;
+
+    var this_ = this;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/ficheurbanisme/' + id_par,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'timeout': 120000,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+            this_.displayUrbanismeSheet2(data);
+        }
+    });
+};
+
+/**
+ * Print the Urbanisme sheet by data
+ * @param {object} data
+ * @private
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheet2 = function (data) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheet2');
+
+    var proprietaires = [];
+
+    var i = 0;
+    while (goog.isDef(data[i])) {
+
+        // Valeurs par défaut
+        data[i]['CCOSEC'] = goog.isDefAndNotNull(data[i]['CCOSEC']) ? data[i]['CCOSEC'] : "";
+        data[i]['DCNTPA'] = goog.isDefAndNotNull(data[i]['DCNTPA']) ? data[i]['DCNTPA'] : "";
+        data[i]['DDENOM'] = goog.isDefAndNotNull(data[i]['DDENOM']) ? data[i]['DDENOM'] : "";
+        data[i]['DLIGN3'] = goog.isDefAndNotNull(data[i]['DLIGN3']) ? data[i]['DLIGN3'] : "";
+        data[i]['DLIGN4'] = goog.isDefAndNotNull(data[i]['DLIGN4']) ? data[i]['DLIGN4'] : "";
+        data[i]['DLIGN6'] = goog.isDefAndNotNull(data[i]['DLIGN6']) ? data[i]['DLIGN6'] : "";
+        data[i]['DNUPLA'] = goog.isDefAndNotNull(data[i]['DNUPLA']) ? data[i]['DNUPLA'] : "";
+        data[i]['ID_PAR'] = goog.isDefAndNotNull(data[i]['ID_PAR']) ? data[i]['ID_PAR'] : "";
+        data[i]['LIBCOM'] = goog.isDefAndNotNull(data[i]['LIBCOM']) ? data[i]['LIBCOM'] : "";
+        data[i]['LIBDEP'] = goog.isDefAndNotNull(data[i]['LIBDEP']) ? data[i]['LIBDEP'] : "";
+        data[i]['ADRESSE'] = goog.isDefAndNotNull(data[i]['ADRESSE']) ? data[i]['ADRESSE'] : "";
+        data[i]['NATURE'] = goog.isDefAndNotNull(data[i]['DSGRPF']) ? data[i]['DSGRPF'] : "";
+
+        // en cas de multiple propriétaires
+        proprietaires.push({
+            'nom': data[i]['DDENOM'].trim(),
+            'adresse': data[i]['DLIGN3'].trim() + data[i]['DLIGN4'].trim(),
+            'ville': data[i]['DLIGN6'].trim()
+        });
+
+        i++;
+    }
+    delete i;
+
+    if (proprietaires.length === 0) {
+        $.notify('Pas d\'information sur les propriétaires', 'error');
+        console.error('Pas d\'information sur les propriétaires');
+    }
+
+    // Récupère la date d'aujoud'hui
+    var today = new Date();
+    var dd = today.getDate();
+    var mm = today.getMonth() + 1; //January is 0
+
+    // Ajoute des 0 si besoin
+    mm = (mm > 9 ? '' : '0') + mm;
+    dd = (dd > 9 ? '' : '0') + dd;
+
+    var yyyy = today.getFullYear();
+
+    if (!goog.isDef(oVmap['properties']['cadastre']["fiche_urb"]))
+        oVmap['properties']['cadastre']["fiche_urb"] = {};
+
+    // Valeurs par défaut de l'entête
+    var logo = goog.isDef(oVmap['properties']['cadastre']["fiche_urb"]["logo"]) ? oVmap['properties']['cadastre']["fiche_urb"]["logo"] : '';
+    var company = goog.isDef(oVmap['properties']['cadastre']["fiche_urb"]["company"]) ? oVmap['properties']['cadastre']["fiche_urb"]["company"] : '';
+
+    var scope = {
+        'logo': logo,
+        'company': company,
+        'departement': goog.isDef(data[0]) ? data[0]['LIBDEP'].trim() : '',
+        'commune': goog.isDef(data[0]) ? data[0]['LIBCOM'].trim() : '',
+        'parcelle': goog.isDef(data[0]) ? parseFloat(data[0]['DNUPLA']) : '',
+        'section': goog.isDef(data[0]) ? data[0]['CCOSEC'].trim() : '',
+        'contenance': goog.isDef(data[0]) ? parseFloat(data[0]['DCNTPA']) : '',
+        'adresse': goog.isDef(data[0]) ? data[0]['ADRESSE'].trim() : '',
+        'date': dd + '/' + mm + '/' + yyyy,
+        'nature': goog.isDef(data[0]) ? data[0]['NATURE'].trim() : '',
+        'proprietaires': proprietaires,
+        'aIntersections': data['aIntersections'],
+        'aIntersectionsArray': data['aIntersectionsArray']
+    };
+
+    // Ajout de la feature
+    var olView = this['map'].getView();
+    var sProjection = olView.getProjection().getCode();
+
+    var geom = oVmap.getGeomFromEWKT(data['geometry']['geom'], sProjection);
+
+    var feature = new ol.Feature({
+        geometry: geom
+    });
+
+    if (!goog.isDefAndNotNull(oVmap['properties']['cadastre']["fiche_urb"]['printtemplate_id'])) {
+        $.notify('properties.cadastre.fiche_urb.printtemplate_id undefined', 'error');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['cadastre']["fiche_urb"]['map_id'])) {
+        $.notify('properties.cadastre.fiche_urb.map_id undefined', 'error');
+        return 0;
+    }
+
+    // Impression
+    oVmap.getToolsManager().getBasicTools().getPrint().print({
+        scope: scope,
+        templateId: oVmap['properties']['cadastre']["fiche_urb"]['printtemplate_id'],
+        mapId: oVmap['properties']['cadastre']["fiche_urb"]['map_id'],
+        features: [feature],
+        featuresZoom: oVmap['properties']['cadastre']["fiche_urb"]['features_zoom']
+    });
+};
+
+/**
+ * Display de descriptive sheet
+ * @param {string} id_bat
+ * @returns {String}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayInvariantDescriptiveSheet = function (id_bat) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayInvariantDescriptiveSheet');
+
+    if (!goog.isDef(id_bat))
+        return 'id_bat undefined';
+
+    // Ajoute la description de la parcelle
+    var cadastreController = this;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/fichedescriptiveinvariant/' + id_bat,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            cadastreController['oInvariant'] = data;
+
+            cadastreController.displayInvariantDescriptiveSheet2();
+        }
+    });
+};
+
+/**
+ * function called after the ajax requests
+ * @returns {Number}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayInvariantDescriptiveSheet2 = function () {
+
+    if (!goog.isDef(this['oInvariant'])) {
+        console.error('oInvariant non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['PEV'])) {
+        console.error('oInvariant.PEV non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['habitations'])) {
+        console.error('oInvariant.habitations non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['locauxPros'])) {
+        console.error('oInvariant.locauxPros non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['dependances'])) {
+        console.error('oInvariant.dependances non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['proprietaires'])) {
+        console.error('oInvariant.proprietaires non défini');
+        // return 0;
+    }
+    if (!goog.isDef(this['oInvariant']['lots'])) {
+        console.error('oInvariant.lots non défini');
+        // return 0;
+    }
+
+    // Récupère la bonne adresse
+    for (var i = 0; i < this['oInvariant']['proprietaires'].length; i++) {
+
+        this['oInvariant']['proprietaires'][i]['DLIGN4'] = goog.isDefAndNotNull(this['oInvariant']['proprietaires'][i]['DLIGN4']) ? this['oInvariant']['proprietaires'][i]['DLIGN4'] : "";
+
+        var adresse = this['oInvariant']['proprietaires'][i]['DLIGN4'].trim();
+        for (var ii = 0; ii < adresse.length; ii++) {
+            if (adresse.charAt(ii) !== "0") {
+                adresse = adresse.substring(ii);
+                ii = adresse.length;
+            }
+        }
+        this['oInvariant']['proprietaires'][i]['DLIGN4'] = adresse;
+    }
+
+    // Affiche la modale
+    $('#descriptive-invariant-sheet-modal').modal('show');
+};
+
+/**
+ * Display a Relevé de propeiété sheet
+ * @param {string} type type (parcelle, standard, tiers)
+ * @param {string} idnupro idnupro (id_com + dnupro)
+ * @param {string} id_par id_par
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheet = function (type, idnupro, id_par) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheet');
+
+    var params = {
+        'type': type,
+        'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+    };
+
+    var cadastreController = this;
+
+    if (goog.isDef(id_par))
+        params['ID_PAR'] = id_par;
+
+    if (goog.isDef(idnupro))
+        params['IDDNUPRO'] = idnupro;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/relevedepropriete',
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': params,
+        'scope': this.$scope_,
+        'timeout': 120000,
+        'success': function (response) {
+
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                if (goog.isDef(cadastreController.releveWindow))
+                    cadastreController.releveWindow.close();
+                cadastreController.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+                cadastreController.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Pas de données à afficher</div>');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            ajaxRequest({
+                'method': 'GET',
+                'url': data['releveDePropriete'] + '&',
+                'headers': {
+                    'Accept': 'application/x-vm-json'
+                },
+                'scope': this.$scope_,
+                'responseType': 'blob',
+                'success': function (response) {
+
+                    // IE
+                    if (window.navigator['msSaveOrOpenBlob']) {
+                        window.navigator['msSaveOrOpenBlob'](response['data'], 'releve_de_propriete_' + id_par + '.pdf');
+                        cadastreController.releveWindow.close();
+                    }
+                    // Others
+                    else {
+                        oVmap.downloadBlob(response['data'], 'releve_de_propriete_' + id_par + '.pdf');
+                        cadastreController.releveWindow.close();
+                    }
+                }
+            });
+        },
+        'error': function (response) {
+
+            if (goog.isDef(response['data']['error'])) {
+                if (goog.isDef(response['data']['error']['errorMessage'])) {
+                    console.error(response['data']['error']['errorMessage']);
+                    $.notify(response['data']['error']['errorMessage'], 'error');
+                    if (goog.isDef(cadastreController.releveWindow))
+                        cadastreController.releveWindow.close();
+                    cadastreController.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+                    cadastreController.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">' + response['data']['error']['errorMessage'] + '</div>');
+                    return 0;
+                }
+            }
+            if (response['status'] === 500) {
+                $.notify('Une erreur est survenue au sein du serveur', 'error');
+                if (goog.isDef(cadastreController.releveWindow))
+                    cadastreController.releveWindow.close();
+                return 0;
+            }
+            if (goog.isDef(cadastreController.releveWindow)) {
+                cadastreController.releveWindow.close();
+            }
+        }
+    });
+};
+
+/**
+ * Display a relevé de propriété parcelle sheet
+ * @param {string} parcelleTable identifier of the parcelle table
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetParcelle = function (parcelleTable) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers');
+
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
+
+    if (selectedParcelles.length !== 1) {
+        $.notify('Veuillez sélectionner une unique parcelle', 'info');
+        return 0;
+    }
+
+    // Ouvre une première fenêtre vide car on ne peut ouvrir une fenêtre avec window.open uniquement sur action directe
+    if (goog.isDef(this.releveWindow))
+        this.releveWindow.close();
+    this.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+    this.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    var id_par = selectedParcelles[0]['id_par'];
+    this.displayReleveDeProprieteSheet('parcelle', '', id_par);
+};
+
+/**
+ * Display a relevé de propriété standard sheet
+ * @param {string} compteTable identifier of the compte table
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetStandard = function (compteTable) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetStandard');
+
+    var selectedComptes = $(compteTable).bootstrapTable('getSelections');
+
+    if (selectedComptes.length !== 1) {
+        $.notify('Veuillez sélectionner un unique compte', 'info');
+        return 0;
+    }
+
+    // Ouvre une première fenêtre vide car on ne peut ouvrir une fenêtre avec window.open uniquement sur action directe
+    if (goog.isDef(this.releveWindow))
+        this.releveWindow.close();
+    this.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+    this.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    var iddnupro = selectedComptes[0]['ID_COM'] + selectedComptes[0]['DNUPRO'];
+
+    this.displayReleveDeProprieteSheet('standard', iddnupro);
+};
+
+/**
+ * Display a relevé de propriété tiers sheet
+ * @param {string} parcelleTable identifier of the parcelle table
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers = function (compteTable) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers');
+
+    var selectedComptes = $(compteTable).bootstrapTable('getSelections');
+
+    if (selectedComptes.length !== 1) {
+        $.notify('Veuillez sélectionner un unique compte', 'info');
+        return 0;
+    }
+
+
+    // Ouvre une première fenêtre vide car on ne peut ouvrir une fenêtre avec window.open uniquement sur action directe
+    if (goog.isDef(this.releveWindow))
+        this.releveWindow.close();
+    this.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+    this.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    var iddnupro = selectedComptes[0]['ID_COM'] + selectedComptes[0]['DNUPRO'];
+    this.displayReleveDeProprieteSheet('tiers', iddnupro);
+};
+
+/**
+ * Display a Relevé de propeiété sheet
+ * @param {string} type type (parcelle, standard, tiers)
+ * @param {string} idnupro idnupro (id_com + dnupro)
+ * @param {string} id_par id_par
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetOnMap = function (type, idnupro, id_par) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetOnMap');
+
+    // Ouvre une première fenêtre vide car on ne peut ouvrir une fenêtre avec window.open uniquement sur action directe
+    if (goog.isDef(this.releveWindow))
+        this.releveWindow.close();
+    this.releveWindow = window.open("", 'Relevé de propriété ', 'height=400,width=600');
+    this.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    this.displayReleveDeProprieteSheet(type, idnupro, id_par);
+};
+
+/**
+ * Display the parcelle rapports (ToutesInfos, BatieNonBatie, Proprietaire, SubdivisionFiscale, EmprisePosPlu, Locaux, ProprietaireLocaux)
+ * @param {string} parcelleTable identifier of the parcelle table
+ * @param {string} rapportType ToutesInfos, BatieNonBatie, Proprietaire, SubdivisionFiscale, EmprisePosPlu, Locaux, ProprietaireLocaux
+ * @param {boolean|undefined} bOpenWindow true if you want the result on a new window, false to download it. Default is true
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayRapportParcelle = function (parcelleTable, rapportType, bOpenWindow) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayRapportParcelle');
+
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
+
+    bOpenWindow = goog.isDef(bOpenWindow) ? bOpenWindow : true;
+
+    if (selectedParcelles.length === 0) {
+        $.notify('Veuillez sélectionner une unique parcelle', 'info');
+        return 0;
+    }
+
+    var parcelles = '';
+    for (var i = 0; i < selectedParcelles.length; i++) {
+        if (i > 0)
+            parcelles += '|';
+        parcelles += selectedParcelles[i]['id_par'];
+    }
+
+    var this_ = this;
+
+    // Ouvre une première fenêtre vide car on ne peut ouvrir une fenêtre avec window.open uniquement sur action directe
+    if (goog.isDef(this.releveWindow))
+        this.releveWindow.close();
+    if (bOpenWindow) {
+        this.releveWindow = window.open("", 'Rapport parcellaire', 'height=400,width=600');
+        this.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+    } else {
+        // Message d'attente
+        var message = '<h4>Rapport en cours de création...</h4>';
+        message += '<br>';
+        message += '<div class="progress">';
+        message += '<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%">';
+        message += '<span class="sr-only">45% Complete</span>';
+        message += '<span class="sr-only">45% Complete</span>';
+        message += '</div>';
+        message += '</div>';
+        bootbox.alert(message);
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/rapportscadastreparcelle',
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'rapport_type': rapportType,
+            'parcelles': parcelles,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'timeout': 120000,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                $.notify('Pas de données à afficher', 'warn');
+                if (bOpenWindow)
+                    this_.releveWindow.close();
+                else
+                    $('.bootbox-alert').modal('hide');
+                return 0;
+            }
+
+            var data = response['data']['data'];
+            var rapportLink = data['rapport'] + '&';
+
+            ajaxRequest({
+                'method': 'GET',
+                'url': rapportLink,
+                'headers': {
+                    'Accept': 'application/x-vm-json'
+                },
+                'scope': this.$scope_,
+                'responseType': 'blob',
+                'success': function (response) {
+
+                    // Ouvre la nouvelle fenêtre ou lance le téléchargement du fichier
+                    if (bOpenWindow) {
+
+                        // IE
+                        if (window.navigator['msSaveOrOpenBlob']) {
+                            window.navigator['msSaveOrOpenBlob'](response['data'], 'vmap_cadastre_' + rapportType + '.pdf');
+                            this_.releveWindow.close();
+                        }
+                        // Others
+                        else {
+                            oVmap.downloadBlob(response['data'], 'vmap_cadastre_' + rapportType + '.pdf');
+                            this_.releveWindow.close();
+                        }
+                    } else {
+                        // IE
+                        if (window.navigator['msSaveOrOpenBlob']) {
+                            window.navigator['msSaveOrOpenBlob'](response['data'], rapportType + "." + data['format']);
+                            $('.bootbox-alert').modal('hide');
+                        }
+                        // Others
+                        else {
+                            oVmap.downloadBlob(response['data'], rapportType + "." + data['format']);
+                            $('.bootbox-alert').modal('hide');
+                        }
+                    }
+                }
+            });
+        },
+        'error': function (response) {
+
+            // Vérifie si il y a une erreur
+            if (goog.isDef(response['data']['error'])) {
+                if (goog.isDef(response['data']['error']['errorMessage'])) {
+                    console.error(response['data']['error']['errorMessage']);
+                    $.notify(response['data']['error']['errorMessage'], 'error');
+                    if (bOpenWindow)
+                        this_.releveWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">' + response['data']['error']['errorMessage'] + '</div>');
+                    else
+                        $('.bootbox-alert').modal('hide');
+                    return 0;
+                }
+            }
+            if (response['status'] === 500) {
+                $.notify('Une erreur est survenue au sein du serveur', 'error');
+                if (bOpenWindow)
+                    this_.releveWindow.close();
+                else
+                    $('.bootbox-alert').modal('hide');
+                return 0;
+            }
+            if (goog.isDef(this_.releveWindow)) {
+                this_.releveWindow.close();
+            }
+        }
+    });
+};
+
+/**
+ * Add the gemetries to the location feature overlay on the map
+ * @param {array<object>} aData
+ * @param {object} aData.i.geom: geometry
+ * @param {string} aData.i.proj: projection integers of the geometry (ex: 2154)
+ * @param {string|undefined} type the type of element (commune/parcelle/lieuDit..)
+ * @param {boolean|undefined} zoom true for zoom on the feature after
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addLocationGeometries = function (aData, type, zoom) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addLocationGeometries');
+
+    zoom = goog.isDef(zoom) ? zoom : true;
+    type = goog.isDef(type) ? type : '';
+
+    var aFeatures = [];
+    for (var i = aData.length - 1; i >= 0; i--) {
+        var feature = new ol.Feature({
+            geometry: oVmap.getGeomFromEWKT(aData[i]['geom'])
+        });
+        // Renseigne le type d'entitée
+        feature.set('type', type);
+        aFeatures.push(feature);
+        // Renseigne les infos
+        var featureInfos = {};
+        for (var item in aData[i]) {
+            if (item !== 'geom')
+                featureInfos[item] = aData[i][item];
+        }
+        feature.set('infos', featureInfos)
+
+    }
+
+    var removeOldLocation = true;
+    if (this['locationMultiple']) {
+        removeOldLocation = false;
+    }
+
+    oVmap.getMap().locateFeatures(aFeatures, removeOldLocation, zoom);
+};
+
+/**
+ * Add the gemetries to the location selection overlay on the map
+ * @param {array<object>} aInfos
+ * geom: geometry,
+ * proj: projection integers of the geometry (ex: 2154)
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.setSelectionGeometries = function (aInfos) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.setSelectionGeometries');
+
+    // Ajoute les features
+    for (var i = aInfos.length - 1; i >= 0; i--) {
+        if (aInfos[i]['geom'] !== undefined) {
+
+            var geom = oVmap.getGeomFromEWKT(aInfos[i]['geom']);
+            var feature = new ol.Feature({
+                geometry: geom
+            });
+
+            // Ajoute la géométrie aux infos de l'objet (se qui permet de le supprimer depuis le infoContainer)
+            aInfos[i]['feature'] = feature;
+
+            delete geom;
+            delete feature;
+        }
+    }
+
+    return aInfos;
+};
+
+/**
+ * add the infos on the infoContainer
+ * @param {array<object>} data
+ * example: {id_com: "340006", sections: "A", state: true}
+ * @param {string} tabCode Code of the tab
+ * @return {string} error if something goes wrong
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addInfos = function (data, tabCode) {
+
+    if (!goog.isDef(data))
+        return 'data is not defined';
+    if (!goog.isDef(tabCode))
+        return 'tabCode is not defined';
+
+    if (oVmap.getToolsManager().getInfoContainer().getTabByCode(tabCode) === undefined) {
+        // Affiche en remplaçant les infos
+        var scope = angular.element($("#cadastre-tools")).scope();
+        scope.$evalAsync(function (scope) {
+            scope['ctrl'].setInfos(data, tabCode);
+        });
+    } else {
+        var tabOptions = {tabCode: tabCode};
+        var rowOptions = {
+            data: data,
+            invisibleColumns: ['geom']
+        };
+        oVmap.getToolsManager().getInfoContainer().addMultipleRows(tabOptions, rowOptions);
+    }
+};
+
+/**
+ * Display the infos on the infoContainer
+ * @param {array<object>} data bootstrap-table data, example: {id_com: "340006", sections: "A", state: true}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.setInfos = function (data, tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.setInfos');
+
+    if (!goog.isDef(data))
+        return 'data is not defined';
+    tabCode = goog.isDef(tabCode) ? tabCode : 'Cadastre';
+
+    var tabOptions = {
+        tabCode: tabCode,
+        data: data,
+        deleteBtn: true,
+        invisibleColumns: ['geom'],
+        actions: goog.isDef(data[0]['geom']) ? ['zoom', 'delete'] : ['delete'],
+        layer: oVmap.getMap().getSelectionOverlay()
+    };
+
+    oVmap.getToolsManager().getInfoContainer().addTab(tabOptions);
+};
+
+/**
+ * Add selection from filter
+ * @param {string} path API path
+ * @param {string} filter API filter
+ * @param {string} tabCode Code of the tab to create
+ * @param {function} callBack function to load after
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromFilter = function (path, filter, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromFilter');
+    oVmap.log('filter: ' + filter);
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + path;
+
+    tabCode = goog.isDef(tabCode) ? tabCode : 'Cadastre';
+    callBack = goog.isDef(callBack) ? callBack : function () {
+        return 0;
+    };
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'filter': filter,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            // Vide la locatlisation
+            oVmap.getMap().getLocationOverlayFeatures().clear();
+            // Ajoute la géométrie
+            data = cadastreController.setSelectionGeometries(data);
+            // Ajoute les infos
+            cadastreController.addInfos(data, tabCode);
+            // Zoom sur les géométries du dernier onglet à ajouter
+            cadastreController.zoomOnLastTabFeatures(tabCode);
+            // Appelle le callback
+            callBack(tabCode);
+        }
+    });
+};
+
+/**
+ * Add the select selection to the selection
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} value value
+ * @param {string} tabCode name of the tab
+ * @param {function} callBack function to call after the ajax request
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromValue = function (path, param, value, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromValue');
+
+    // Vérifications value
+    if (!goog.isDefAndNotNull(value)) {
+        console.error('value undefined');
+        return null;
+    }
+    if (!goog.isString(value) && !goog.isNumber(value)) {
+        console.error('value not string or number');
+        return null;
+    }
+    if (!String(value).length > 0) {
+        console.error('value empty');
+        return null;
+    }
+
+    var paramField;
+    if (this['cadastreAPI_'] === "cadastre") {
+        paramField = param;
+    } else {
+        paramField = param.toLowerCase();
+    }
+    var filter = {
+        "column": paramField,
+        "compare_operator": "=",
+        "value": value
+    };
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ *
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param1
+ * @param {string} value1
+ * @param {string} param2
+ * @param {string} value2
+ * @param {string} tabCode name of the tab
+ * @param {function} callBack function to call after the ajax request
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFrom2Values = function (path, param1, value1, param2, value2, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFrom2Values');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var paramField1 = param1;
+        var paramField2 = param2;
+    } else {
+        var paramField1 = param1.toLowerCase();
+        var paramField2 = param2.toLowerCase();
+    }
+    var filter = {
+        "relation": "AND",
+        "operators": [{
+                "column": paramField1,
+                "compare_operator": "=",
+                "value": value1
+            }, {
+                "column": paramField2,
+                "compare_operator": "=",
+                "value": value2
+            }]
+    };
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ * Add the table selection on the selection
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} array array
+ * @param {string} arrayParam param name
+ * @param {string} tabCode name of the tab to create
+ * @param {function} callBack function to load after the request
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromArray = function (path, param, array, arrayParam, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromTable');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var paramField = param;
+    } else {
+        var paramField = param.toLowerCase();
+    }
+
+    var filter = {
+        "relation": "OR",
+        "operators": []
+    };
+    for (var i = 0; i < array.length; i++) {
+        filter['operators'].push({
+            "column": paramField,
+            "compare_operator": "=",
+            "value": array[i][arrayParam]
+        });
+    }
+
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ * Add the select selection to the selection
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} selectorId identifier of the select
+ * @param {string} tabCode name of the tab
+ * @param {function} callBack function to call after the ajax request
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromSelect = function (path, param, selectorId, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromSelect');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var paramField = param;
+    } else {
+        var paramField = param.toLowerCase();
+    }
+    var filter = {
+        "column": paramField,
+        "compare_operator": "=",
+        "value": $(selectorId).val()
+    };
+
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ * Add the select selection to the selection
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {type} param1 type of param to filter by (ex: id_com)
+ * @param {type} selectorId1 identifier of the select
+ * @param {type} param2 type of param to filter by (ex: id_com)
+ * @param {type} selectorId2 identifier of the select
+ * @param {string} tabCode name of the tab
+ * @param {function} callBack function to call after the ajax request
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFrom2Select = function (path, param1, selectorId1, param2, selectorId2, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromSelect');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var paramField1 = param1;
+        var paramField2 = param2;
+    } else {
+        var paramField1 = param1.toLowerCase();
+        var paramField2 = param2.toLowerCase();
+    }
+    var value1 = $(selectorId1).val();
+    var value2 = $(selectorId2).val();
+    var filter = {
+        "relation": "AND",
+        "operators": [{
+                "column": paramField1,
+                "compare_operator": "=",
+                "value": value1
+            }, {
+                "column": paramField2,
+                "compare_operator": "=",
+                "value": value2
+            }]
+    };
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ * Add the table selection on the selection
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} tableId id of the bootstrap-table element
+ * @param {string} tabCode name of the tab to create
+ * @param {function} callBack function to load after the request
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromTable = function (path, param, tableId, tabCode, callBack) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromTable');
+    var tableSelections = $(tableId).bootstrapTable('getSelections');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var paramField = param;
+    } else {
+        var paramField = param.toLowerCase();
+    }
+
+    var filter = {
+        "relation": "OR",
+        "operators": []
+    };
+    for (var i = 0; i < tableSelections.length; i++) {
+        filter['operators'].push({
+            "column": paramField,
+            "compare_operator": "=",
+            "value": tableSelections[i][param]
+        });
+    }
+
+    this.addSelectionFromFilter(path, filter, tabCode, callBack);
+};
+
+/**
+ * Empty the selection
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.emptySelection = function () {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.emptySelection');
+    oVmap.getToolsManager().getInfoContainer().removeAll();
+};
+
+/**
+ * Localise the element on the select
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} selectorId html id of the select
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromSelect = function (path, param, selectorId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromSelect');
+
+    var value = $(selectorId).val();
+    var url = oVmap['properties']['api_url'] + '/' + path;
+    var cadastreController = this;
+
+    if (value !== "") {
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json',
+                'X-HTTP-Method-Override': 'GET'
+            },
+            'data': {
+                'attributs': 'geom|proj',
+                'filter': {
+                    "column": param,
+                    "compare_operator": "=",
+                    "value": value
+                },
+                'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+
+                // Vérifie si il y a un résultat
+                if (!goog.isDef(response['data']['data'])) {
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+
+                var data = response['data']['data'];
+
+                cadastreController.addLocationGeometries(data);
+            }
+        });
+    } else {
+        $.notify('Veuillez sélectionner au moins un objet spatial', 'info');
+    }
+};
+
+/**
+ * Localise the element sected on the table
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} array
+ * @param {string} arrayParam
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromArray = function (path, param, array, arrayParam) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromTable');
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + path;
+
+    var filter = {
+        "relation": "OR",
+        "operators": []
+    };
+    for (var i = 0; i < array.length; i++) {
+        filter['operators'].push({
+            "column": param,
+            "compare_operator": "=",
+            "value": array[i][arrayParam]
+        });
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'attributs': 'geom|proj',
+            'filter': filter,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            cadastreController.addLocationGeometries(data);
+        }
+    });
+};
+
+/**
+ * Localise the element sected on the table
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} tableId html id of the table
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromTable = function (path, param, tableId, tableParam) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseFromTable');
+
+    tableParam = goog.isDef(tableParam) ? tableParam : param;
+
+    var cadastreController = this;
+    var tableSelections = $(tableId).bootstrapTable('getSelections');
+    var url = oVmap['properties']['api_url'] + '/' + path;
+
+    var loadHttp = function () {
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < tableSelections.length; i++) {
+            filter['operators'].push({
+                "column": param,
+                "compare_operator": "=",
+                "value": tableSelections[i][tableParam]
+            });
+        }
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json',
+                'X-HTTP-Method-Override': 'GET'
+            },
+            'data': {
+                'attributs': 'geom|proj',
+                'filter': filter,
+                'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+
+                // Vérifie si il y a un résultat
+                if (!goog.isDef(response['data']['data'])) {
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+
+                var data = response['data']['data'];
+
+                cadastreController.addLocationGeometries(data);
+            }
+        });
+    };
+
+    if (tableSelections.length > this.limit) {
+        var sAlert = '<h4>Attention, vous allez afficher ' + tableSelections.length + ' objets, cela peut ralentir l\'application';
+        sAlert += '<br>voulez-vous continuer ?</h4>';
+
+        bootbox.confirm(sAlert, function (result) {
+            if (result === true) {
+                loadHttp();
+            }
+        });
+    } else if (tableSelections.length !== 0) {
+        loadHttp();
+    } else {
+        $.notify('Veuillez sélectionner au moins un objet de la liste', 'info');
+    }
+};
+
+/**
+ * Update the variableName value
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} variableName name of the controller variable to update
+ * @param {string} filter filter
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElem = function (path, variableName, filter, order_by) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElem');
+
+    filter = goog.isDef(filter) ? filter : '';
+    order_by = goog.isDef(order_by) ? order_by : '';
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + path;
+    var params = {
+        'attributs': '-geom|proj',
+        'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+    };
+
+    if (filter !== '')
+        params['filter'] = filter;
+
+    if (order_by !== '')
+        params['order_by'] = order_by;
+
+    this[variableName].length = 0;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': params,
+        'scope': this.$scope_,
+        'success': function (response) {
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            cadastreController[variableName] = data;
+        }
+    });
+};
+
+/**
+ * Update the variableName value by the selector value
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {type} param param (ex: id_com)
+ * @param {type} selector selector identifier
+ * @param {string} variableName name of the controller variable to update
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElemBySelect = function (path, param, selector, variableName, order_by) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElemBySelect');
+
+    order_by = goog.isDef(order_by) ? order_by : '';
+    this[variableName].length = 0;
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + path;
+    var value = $(selector).val();
+
+    // Vérifications value
+    if (!goog.isDefAndNotNull(value)) {
+        console.error('$(' + selector + ') undefined');
+        return null;
+    }
+    if (!goog.isString(value) && !goog.isNumber(value)) {
+        console.error('$(' + selector + ') not string or number');
+        return null;
+    }
+    if (!String(value).length > 0) {
+        console.error('$(' + selector + ') empty');
+        cadastreController[variableName] = [];
+        return null;
+    }
+
+    var params = {
+        'attributs': '-geom|proj',
+        'filter': {
+            "column": param,
+            "compare_operator": "=",
+            "value": value
+        },
+        'jsonformat': 'anonymous',
+        'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+    };
+
+    if (order_by !== '')
+        params['order_by'] = order_by;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': params,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            cadastreController[variableName] = data;
+        }
+    });
+};
+
+/**
+ * Get database elements and put the result on a table
+ * @param {string} path
+ * @param {string} filter
+ * @param {string} table
+ * @param {string} order_by
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemOnTable = function (path, filter, table, order_by) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemOnTable');
+
+    $(table).bootstrapTable('showLoading');
+    $(table).bootstrapTable('removeAll');
+
+    order_by = goog.isDef(order_by) ? order_by : '';
+
+    var params = {
+        'filter': filter,
+        'jsonformat': 'anonymous',
+        'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+    };
+
+    if (order_by !== '') {
+        params['order_by'] = order_by;
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/' + path,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': params,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            $(table).bootstrapTable('hideLoading');
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            // Met à jour les données du tableau
+            $(table).bootstrapTable('load', data);
+
+            // Affiche les outils du tableau
+            $(table + "-toolbar").show();
+
+            // Si une seule ligne est proposée, alors on la sélectionne
+            if (data.length === 1) {
+                $(table).bootstrapTable('check', 0);
+            }
+        },
+        'error': function (response) {
+            $(table).bootstrapTable('hideLoading');
+        }
+    });
+};
+
+/**
+ * Get database elements from the select and put the result on a table
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} selectorId identifier of the select
+ * @param {string} table identifier of the table
+ * @param {string} order_by
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemBySelectOnTable = function (path, param, selectorId, table, order_by) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemBySelectOnTable');
+
+    order_by = goog.isDef(order_by) ? order_by : '';
+
+    var value = $(selectorId).val();
+
+    // Vérifications value
+    if (!goog.isDefAndNotNull(value)) {
+        console.error('$(' + selectorId + ') undefined');
+        return null;
+    }
+    if (!goog.isString(value) && !goog.isNumber(value)) {
+        console.error('$(' + selectorId + ') not string or number');
+        return null;
+    }
+    if (!String(value).length > 0) {
+        console.error('$(' + selectorId + ') empty');
+        $(table).bootstrapTable('removeAll');
+        return null;
+    }
+
+    var filter = {
+        "column": param,
+        "compare_operator": "=",
+        "value": value
+    };
+
+    this.putBaseElemOnTable(path, filter, table, order_by);
+};
+
+/**
+ * Get database elements from the selects and put the result on a table
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param1 type of param to filter by (ex: id_com)
+ * @param {string} selector1 identifier of the select
+ * @param {string} param2 type of param to filter by (ex: id_com)
+ * @param {string} selector2 identifier of the select
+ * @param {string} table identifier of the table
+ * @param {string} order_by
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemBy2SelectOnTable = function (path, param1, selector1, param2, selector2, table, order_by) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.putBaseElemBy2SelectOnTable');
+
+    order_by = goog.isDef(order_by) ? order_by : '';
+
+    var value1 = $(selector1).val();
+    var value2 = $(selector2).val();
+    var filter = {
+        "relation": "AND",
+        "operators": [{
+                "column": param1,
+                "compare_operator": "=",
+                "value": value1
+            }, {
+                "column": param2,
+                "compare_operator": "=",
+                "value": value2
+            }]
+    };
+
+    this.putBaseElemOnTable(path, filter, table, order_by);
+};
+
+/**
+ * Get database elements from the select and put the result on a table
+ * @param {string} path API path (ex: cadastre/communes)
+ * @param {string} param type of param to filter by (ex: id_com)
+ * @param {string} selectorId identifier of the select
+ * @param {string} tableId identifier of the table
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseVoiesOnTable = function (path, param, selectorId, tableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseVoiesOnTable');
+
+    var value = $(selectorId).val();
+    var url = oVmap['properties']['api_url'] + '/' + path;
+    var cadastreController = this;
+
+    // Vérifications value
+    if (!goog.isDefAndNotNull(value)) {
+        console.error('$(' + selectorId + ') undefined');
+        return null;
+    }
+    if (!goog.isString(value) && !goog.isNumber(value)) {
+        console.error('$(' + selectorId + ') not string or number');
+        return null;
+    }
+    if (!String(value).length > 0) {
+        console.error('$(' + selectorId + ') empty');
+        $(tableId).bootstrapTable('load', []);
+        return null;
+    }
+
+    $(tableId).bootstrapTable({
+        data: {}
+    });
+    if (cadastreController['cadastreAPI_'] === "cadastre") {
+        var order = "DVOILIB";
+    } else {
+        var order = "dvoilib";
+    }
+    $(tableId).bootstrapTable('showLoading');
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'order_by': order,
+            'filter': {
+                "column": param,
+                "compare_operator": "=",
+                "value": value
+            },
+            'jsonformat': 'anonymous',
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+
+            var data = response['data']['data'];
+
+            // Ajoute le type de voie
+            for (var i = 0; i < data.length; i++) {
+                if (goog.isDefAndNotNull(data[i]['L_NATURE_VOIE'])) {
+                    data[i]['NOM_VOIE'] = data[i]['L_NATURE_VOIE'] + ' ' + data[i]['DVOILIB'];
+                } else {
+                    data[i]['NOM_VOIE'] = data[i]['DVOILIB'];
+                }
+            }
+
+            // Met à jour les données du tableau
+            $(tableId).bootstrapTable('load', data);
+
+            $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+            $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                $("#Parcelle-par-adresse-DGFiP-select-adresse").prop('disabled', true);
+                var afterLoad = function () {
+                    $("#Parcelle-par-adresse-DGFiP-select-adresse").prop('disabled', false);
+                };
+                if (cadastreController['cadastreAPI_'] === "cadastre") {
+                    var paramField = 'ID_RIVOLI';
+                } else {
+                    var paramField = 'id_voie';
+                }
+                cadastreController.getBaseElemByValue({
+                    'path': oVmap["properties"]["cadastre"]["api"] + '/adresses',
+                    'variableName': 'aAdresses',
+                    'param': paramField,
+                    'value': row['ID_RIVOLI'],
+                    'order_by': 'DNVOIRI',
+                    'callback': afterLoad
+                });
+            });
+            // Si une seule ligne est proposée, alors on la sélectionne
+            if (data.length === 1)
+                $(tableId).bootstrapTable('check', 0);
+        },
+        'error': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+        }
+    });
+};
+
+/**
+ * Update a varialbe value
+ * @param {object} opt_options
+ * @param {string} opt_options.path API path (ex: cadastre/communes)
+ * @param {string} opt_options.variableName name of the variable
+ * @param {string} opt_options.param API param
+ * @param {string} opt_options.value API param value
+ * @param {string} opt_options.callback Function to load after the http request
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElemByValue = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseElemByValue');
+
+    var path = opt_options['path'];
+    var variableName = opt_options['variableName'];
+    var param = opt_options['param'];
+    var value = opt_options['value'];
+    var callback = opt_options['callback'];
+    var orderBy = opt_options['order_by'];
+
+    callback = goog.isDef(callback) ? callback : function () {
+        return 0;
+    };
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + path;
+
+    this[variableName].length = 0;
+
+    // Vérifications value
+    if (!goog.isDefAndNotNull(value)) {
+        console.error('value undefined');
+        return null;
+    }
+    if (!goog.isString(value) && !goog.isNumber(value)) {
+        console.error('value not string or number');
+        return null;
+    }
+    if (!String(value).length > 0) {
+        console.error('value empty');
+        return null;
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'attributs': '-geom|proj',
+            'filter': {
+                "column": param,
+                "compare_operator": "=",
+                "value": value
+            },
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5),
+            'order_by': goog.isDefAndNotNull(orderBy) ? orderBy : ''
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            // Donne la valeur à la variable
+            cadastreController[variableName] = data;
+
+            // lance le callback
+            callback();
+        }
+    });
+};
+
+/**
+ * Update the  list and the table
+ * @param {string} communeSelectorId id of the communes selector
+ * @param {string} proprietaireSearchId id of the proprietaire search field
+ * @param {string} tableId id of the table to load
+ * @param {string} comptesTableId id of the comptes table to load the infos when clicking on the proprietaire table
+ * @param {string} parcelleTableId id of the comptes table to load the infos when clicking on the compte table
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getParcelleBaseProprietairesOnTable = function (communeSelectorId, proprietaireSearchId, tableId, comptesTableId, parcelleTableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getParcelleBaseProprietairesOnTable');
+
+    var cadastreController = this;
+    var commune = $(communeSelectorId).val();
+    var proprietaire = $(proprietaireSearchId).val().toUpperCase();
+    var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/proprietaires';
+    var limit = 500;
+    if (commune != "") {
+        if (proprietaire.length >= 3) {
+            $(tableId).bootstrapTable({data: {}});
+            $(tableId).bootstrapTable('showLoading');
+            $(comptesTableId).bootstrapTable('removeAll');
+            $(parcelleTableId).bootstrapTable('removeAll');
+            if (this['cadastreAPI_'] === "cadastre") {
+                var id_com = 'ID_COM';
+                var ddenom = 'DDENOM';
+            } else {
+                var id_com = 'id_com';
+                var ddenom = 'ddenom';
+            }
+
+            ajaxRequest({
+                'method': 'POST',
+                'url': url,
+                'headers': {
+                    'Accept': 'application/x-vm-json',
+                    'X-HTTP-Method-Override': 'GET'
+                },
+                'data': {
+                    //            'filter': '"' + id_com + '"=\'' + commune + '\' AND "' + ddenom + '" LIKE \'%' + proprietaire + '%\'',
+                    'filter': {
+                        "relation": "AND",
+                        "operators": [{
+                                "column": id_com,
+                                "compare_operator": "=",
+                                "value": commune
+                            }, {
+                                "column": ddenom,
+                                "compare_operator": "LIKE",
+                                "compare_operator_options": {
+                                    "case_insensitive": true
+                                },
+                                "value": "%" + proprietaire + "%"
+                            }]
+                    },
+                    'limit': limit,
+                    'attributs': ddenom + '|' + id_com,
+                    'distinct': true,
+                    'order_by': ddenom,
+                    'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+                },
+                'scope': this.$scope_,
+                'success': function (response) {
+                    $(tableId).bootstrapTable('hideLoading');
+
+                    // Vérifie si il y a un résultat
+                    if (!goog.isDef(response['data']['data'])) {
+                        $(tableId).bootstrapTable('removeAll');
+                        console.error('Pas de données à afficher');
+                        return 0;
+                    }
+                    var data = response['data']['data'];
+
+                    if (data.length >= limit)
+                        $.notify('Attention: limite d\'occurrences atteinte, veuillez affiner votre recherche', 'info');
+
+                    // Met à jour les données du tableau
+                    $(tableId).bootstrapTable('load', data);
+
+                    // Affiche les outils du tableau
+                    $(tableId + "-toolbar").show();
+
+                    if (comptesTableId !== '') {
+                        $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+                        $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                            $(comptesTableId).bootstrapTable('removeAll');
+                            $(parcelleTableId).bootstrapTable('removeAll');
+                            cadastreController.getParcelleBaseComptesOnTable(row, comptesTableId, parcelleTableId);
+                        });
+                    }
+                    // Si une seule ligne est proposée, alors on la sélectionne
+                    if (data.length === 1) {
+                        $(tableId).bootstrapTable('check', 0);
+                    }
+                },
+                'error': function (response) {
+                    $(tableId).bootstrapTable('hideLoading');
+                }
+            });
+        } else {
+            $(tableId).bootstrapTable('removeAll');
+            $.notify('Veuillez entrer au moins 3 caractères...', 'error');
+        }
+    } else {
+        $(tableId).bootstrapTable('removeAll');
+        $.notify('Veuillez sélectionner une commune', 'error');
+    }
+};
+
+/**
+ * Update the  list and the table
+ * @param {string} row row (contains DDENOM DNUPRO ID_COM state)
+ * @param {string} tableId id of the table to write
+ * @param {string} parcelleTableId id of the parcelle table
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getParcelleBaseComptesOnTable = function (row, tableId, parcelleTableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getParcelleBaseComptesOnTable');
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/proprietaires';
+    $(tableId).bootstrapTable('showLoading');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var id_com = 'ID_COM';
+        var ddenom = 'DDENOM';
+        var dnupro = 'DNUPRO';
+    } else {
+        var id_com = 'id_com';
+        var ddenom = 'ddenom';
+        var dnupro = 'dnupro';
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'filter': {
+                "relation": "AND",
+                "operators": [{
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": row['ID_COM']
+                    }, {
+                        "column": ddenom,
+                        "compare_operator": "=",
+                        "value": row['DDENOM']
+                    }]
+            },
+            'attributs': id_com + '|' + dnupro,
+            'order_by': dnupro,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            // Met à jour les données du tableau
+            $(tableId).bootstrapTable('load', data);
+
+            // Affiche les outils du tableau
+            $(tableId + "-toolbar").show();
+
+            $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+            $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                $(parcelleTableId).bootstrapTable('removeAll');
+                cadastreController.getBaseParcellesByProprietaireOnTable(row['ID_COM'], $(tableId).bootstrapTable('getSelections'), parcelleTableId);
+            });
+            // Si une seule ligne est proposée, alors on la sélectionne
+            if (data.length === 1) {
+                $(tableId).bootstrapTable('check', 0);
+            }
+        },
+        'error': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+        }
+    });
+};
+
+/**
+ * Update the  list and the table
+ * @param {string} id_com commune id_com
+ * @param {array<object>} tableSelections comptes selectionnés
+ * @param {string} tableId id of the table to write
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseParcellesByProprietaireOnTable = function (id_com, tableSelections, tableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBaseParcellesByProprietaireOnTable');
+
+    if (tableSelections.length !== 0) {
+        var cadastreController = this;
+        var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/descriptionparcelles';
+        $(tableId).bootstrapTable('showLoading');
+        if (this['cadastreAPI_'] === "cadastre") {
+            var id_com = 'ID_COM';
+            var dnupro = 'DNUPRO';
+            var id_par = 'ID_PAR';
+        } else {
+            var id_com = 'id_com';
+            var dnupro = 'dnupro';
+            var id_par = 'id_par';
+        }
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < tableSelections.length; i++) {
+            filter['operators'].push({
+                "relation": "AND",
+                "operators": [{
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": tableSelections[i]['ID_COM']
+                    }, {
+                        "column": dnupro,
+                        "compare_operator": "=",
+                        "value": tableSelections[i]['DNUPRO']
+                    }]
+            });
+        }
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json',
+                'X-HTTP-Method-Override': 'GET'
+            },
+            'data': {
+                'attributs': id_par,
+                'filter': filter,
+                'order_by': id_par,
+                'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+
+                // Vérifie si il y a une erreur
+                if (goog.isDef(response['data']['errorMessage'])) {
+                    console.error(response['data']['errorMessage']);
+                    return 0;
+                }
+                if (response['status'] === 500) {
+                    $.notify('Une erreur est survenue au sein du serveur', 'error');
+                    return 0;
+                }
+
+                // Vérifie si il y a un résultat
+                if (!goog.isDef(response['data']['data'])) {
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+                var data = response['data']['data'];
+
+                // Met à jour les données du tableau
+                $(tableId).bootstrapTable('load', data);
+
+                // Affiche les outils du tableau
+                $(tableId + "-toolbar").show();
+
+                // Si une seule ligne est proposée, alors on la sélectionne
+                if (data.length === 1) {
+                    $(tableId).bootstrapTable('check', 0);
+                }
+            },
+            'error': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+            }
+        });
+    }
+};
+
+/**
+ * Update the  list and the table
+ * @param {string} communeSelectorId id of the communes selector
+ * @param {string} proprietaireSearchId id of the proprietaire search field
+ * @param {string} tableId id of the table to load
+ * @param {string} comptesTableId id of the compte table to load the infos when clicking on the proprietaire table
+ * @param {string} invariantsTableId id of the compte table to load the infos when clicking on the comptes table
+ * @param {string} parcellesTableId id of the compte table to load the infos when clicking on the invariants table
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseProprietairesOnTable = function (communeSelectorId, proprietaireSearchId, tableId, comptesTableId, invariantsTableId, parcellesTableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseProprietairesOnTable');
+
+    var cadastreController = this;
+    var commune = $(communeSelectorId).val();
+    var proprietaire = $(proprietaireSearchId).val().toUpperCase();
+    var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/proprietaires';
+
+    if (commune != "") {
+        if (proprietaire.length >= 3) {
+            $(tableId).bootstrapTable({data: {}});
+            $(tableId).bootstrapTable('showLoading');
+            $(comptesTableId).bootstrapTable('removeAll');
+            $(invariantsTableId).bootstrapTable('removeAll');
+            $(parcellesTableId).bootstrapTable('removeAll');
+            if (this['cadastreAPI_'] === "cadastre") {
+                var id_com = 'ID_COM';
+                var ddenom = 'DDENOM';
+            } else {
+                var id_com = 'id_com';
+                var ddenom = 'ddenom';
+            }
+
+            ajaxRequest({
+                'method': 'POST',
+                'url': url,
+                'headers': {
+                    'Accept': 'application/x-vm-json',
+                    'X-HTTP-Method-Override': 'GET'
+                },
+                'data': {
+                    //            'filter': '"' + id_com + '"=\'' + commune + '\' AND "' + ddenom + '" LIKE \'%' + proprietaire + '%\'',
+                    'filter': {
+                        "relation": "AND",
+                        "operators": [{
+                                "column": id_com,
+                                "compare_operator": "=",
+                                "value": commune
+                            }, {
+                                "column": ddenom,
+                                "compare_operator": "LIKE",
+                                "compare_operator_options": {
+                                    "case_insensitive": true
+                                },
+                                "value": "%" + proprietaire + "%"
+                            }]
+                    },
+                    'limit': '50',
+                    'attributs': ddenom + '|' + id_com,
+                    'distinct': true,
+                    'order_by': ddenom,
+                    'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+                },
+                'scope': this.$scope_,
+                'success': function (response) {
+                    $(tableId).bootstrapTable('hideLoading');
+
+                    // Vérifie si il y a un résultat
+                    if (!goog.isDef(response['data']['data'])) {
+                        console.error('Pas de données à afficher');
+                        return 0;
+                    }
+                    var data = response['data']['data'];
+
+                    // Met à jour les données du tableau
+                    $(tableId).bootstrapTable('load', data);
+
+                    // Affiche les outils du tableau
+                    $(tableId + "-toolbar").show();
+
+                    if (comptesTableId !== '') {
+                        $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+                        $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                            $(comptesTableId).bootstrapTable('removeAll');
+                            $(invariantsTableId).bootstrapTable('removeAll');
+                            $(parcellesTableId).bootstrapTable('removeAll');
+                            cadastreController.getBatiBaseComptesOnTable(row, comptesTableId, invariantsTableId, parcellesTableId);
+                        });
+                    }
+                    // Si une seule ligne est proposée, alors on la sélectionne
+                    if (data.length === 1) {
+                        $(tableId).bootstrapTable('check', 0);
+                    }
+                },
+                'error': function (response) {
+                    $(tableId).bootstrapTable('hideLoading');
+                }
+            });
+        } else {
+            $(tableId).bootstrapTable('removeAll');
+            $.notify('Veuillez entrer au moins 3 caractères...', 'error');
+        }
+    } else {
+        $(tableId).bootstrapTable('removeAll');
+        $.notify('Veuillez sélectionner une commune', 'error');
+    }
+};
+
+/**
+ * Update the comptes list and the table
+ * @param {string} row row (ID_COM, DDENOM)
+ * @param {string} tableId id of the table to write
+ * @param {string} invariantsTableId id of the compte table to load the infos when clicking on the comptes table
+ * @param {string} parcellesTableId id of the compte table to load the infos when clicking on the invariants table
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseComptesOnTable = function (row, tableId, invariantsTableId, parcellesTableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseComptesOnTable');
+
+    var cadastreController = this;
+    var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/proprietaires';
+
+    $(tableId).bootstrapTable('showLoading');
+    if (this['cadastreAPI_'] === "cadastre") {
+        var id_com = 'ID_COM';
+        var ddenom = 'DDENOM';
+        var dnupro = 'DNUPRO';
+    } else {
+        var id_com = 'id_com';
+        var ddenom = 'ddenom';
+        var dnupro = 'dnupro';
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json',
+            'X-HTTP-Method-Override': 'GET'
+        },
+        'data': {
+            'filter': {
+                "relation": "AND",
+                "operators": [{
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": row['ID_COM']
+                    }, {
+                        "column": ddenom,
+                        "compare_operator": "=",
+                        "value": row['DDENOM']
+                    }]
+            },
+            'attributs': dnupro + '|' + id_com,
+            'order_by': dnupro,
+            'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+
+            // Vérifie si il y a un résultat
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+                return 0;
+            }
+            var data = response['data']['data'];
+
+            // Met à jour les données du tableau
+            $(tableId).bootstrapTable('load', data);
+
+            // Affiche les outils du tableau
+            $(tableId + "-toolbar").show();
+
+            $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+            $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                $(invariantsTableId).bootstrapTable('removeAll');
+                $(parcellesTableId).bootstrapTable('removeAll');
+
+                cadastreController.getBatiBaseInvariantsOnTable($(tableId).bootstrapTable('getSelections'), invariantsTableId, parcellesTableId);
+            });
+
+            // Si une seule ligne est proposée, alors on la sélectionne
+            if (data.length === 1) {
+                $(tableId).bootstrapTable('check', 0);
+            }
+        },
+        'error': function (response) {
+            $(tableId).bootstrapTable('hideLoading');
+        }
+    });
+};
+
+/**
+ * Update the invariants list and the table
+ * @param {string} commune commune
+ * @param {string} tableSelections
+ * @param {string} tableId id of the table to write
+ * @param {string} parcellesTableId id of the compte table to load the infos when clicking on the invariants table
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseInvariantsOnTable = function (tableSelections, tableId, parcellesTableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseInvariantsOnTable');
+
+    if (tableSelections.length !== 0) {
+        var cadastreController = this;
+        var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/invariants';
+        if (this['cadastreAPI_'] === "cadastre") {
+            var id_com = 'ID_COM';
+            var dnupro = 'DNUPRO';
+            var attributs = 'INVAR|ID_PAR|oid';
+        } else {
+            var id_com = 'id_com';
+            var dnupro = 'dnupro';
+            var attributs = 'INVAR|ID_PAR|id_local'
+        }
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < tableSelections.length; i++) {
+            filter['operators'].push({
+                "relation": "AND",
+                "operators": [{
+                        "column": dnupro,
+                        "compare_operator": "=",
+                        "value": tableSelections[i]['DNUPRO']
+                    }, {
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": tableSelections[i]['ID_COM']
+                    }]
+            });
+        }
+
+        $(tableId).bootstrapTable('showLoading');
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json',
+                'X-HTTP-Method-Override': 'GET'
+            },
+            'data': {
+                'filter': filter,
+                'attributs': attributs,
+                'jsonformat': 'anonymous',
+                'order_by': 'INVAR',
+                'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+
+                // Vérifie si il y a des données à afficher
+                if (!goog.isDef(response['data']['data'])) {
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+                var data = response['data']['data'];
+
+                // Met à jour les données du tableau
+                $(tableId).bootstrapTable('load', data);
+
+                // Affiche les outils du tableau
+                $(tableId + "-toolbar").show();
+
+                $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
+                $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
+                    $(parcellesTableId).bootstrapTable('removeAll');
+                    cadastreController.getBatiBaseParcellesOnTable($(tableId).bootstrapTable('getSelections'), parcellesTableId);
+                });
+
+                // Si une seule ligne est proposée, alors on la sélectionne
+                if (data.length === 1) {
+                    $(tableId).bootstrapTable('check', 0);
+                }
+            },
+            'error': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+            }
+        });
+    }
+};
+
+/**
+ * Update the parcelles list and the table
+ * @param {string} tableSelections
+ * @param {string} tableId id of the table to write
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseParcellesOnTable = function (tableSelections, tableId) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.getBatiBaseParcellesOnTable');
+
+    if (tableSelections.length !== 0) {
+        $(tableId).bootstrapTable('showLoading');
+
+        var url = oVmap['properties']['api_url'] + '/' + oVmap['properties']['cadastre']['api'] + '/parcelles';
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < tableSelections.length; i++) {
+            filter['operators'].push({
+                "relation": "AND",
+                "operators": [{
+                        "column": "id_par",
+                        "compare_operator": "=",
+                        "value": tableSelections[i]['ID_PAR']
+                    }]
+            });
+        }
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json',
+                'X-HTTP-Method-Override': 'GET'
+            },
+            'data': {
+                'filter': filter,
+                'attributs': 'id_par',
+                'order_by': 'parcelle',
+                'result_srid': oVmap.getMap().getOLMap().getView().getProjection().getCode().substring(5)
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+
+                // Vérifie si il y a des données à afficher
+                if (!goog.isDef(response['data']['data'])) {
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+                var data = response['data']['data'];
+
+                // Met à jour les données du tableau
+                $(tableId).bootstrapTable('load', data);
+
+                // Affiche les outils du tableau
+                $(tableId + "-toolbar").show();
+
+                // Si une seule ligne est proposée, alors on la sélectionne
+                if (data.length === 1) {
+                    $(tableId).bootstrapTable('check', 0);
+                }
+            },
+            'error': function (response) {
+                $(tableId).bootstrapTable('hideLoading');
+            }
+        });
+    }
+};
+
+/**
+ * Zoom on the features of the last tab to add
+ * @param {string} tabCode Code of the tabzoomOnLastTabFeatures
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.zoomOnLastTabFeatures = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.zoomOnLastTabFeatures');
+
+    angular.element($("#cadastre-tools")).scope()['ctrl'].aFormElementsDisplayed_++;
+
+    var aFormElementsDisplayed_ = angular.element($("#cadastre-tools")).scope()['ctrl'].aFormElementsDisplayed_;
+    var aFormList_ = angular.element($("#cadastre-tools")).scope()['ctrl'].aFormList_;
+    var lastElement = aFormList_[aFormList_.length - 1];
+
+    if (aFormList_.length === aFormElementsDisplayed_) {
+        oVmap.getToolsManager().getInfoContainer().zoomOnTabFeatures(lastElement);
+        oVmap.getToolsManager().getInfoContainer().showBar();
+    }
+};
+
+/**
+ * Display the last tab to add
+ * @param {string} tabCode Code of the tab
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayLastTab = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayLastTab');
+
+    angular.element($("#cadastre-tools")).scope()['ctrl'].aFormElementsDisplayed_++;
+
+    var aFormElementsDisplayed_ = angular.element($("#cadastre-tools")).scope()['ctrl'].aFormElementsDisplayed_;
+    var aFormList_ = angular.element($("#cadastre-tools")).scope()['ctrl'].aFormList_;
+    var lastElement = aFormList_[aFormList_.length - 1];
+
+    if (aFormList_.length === aFormElementsDisplayed_) {
+        oVmap.getToolsManager().getInfoContainer().displayTabFeatures(lastElement);
+        oVmap.getToolsManager().getInfoContainer().showBar();
+    }
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectCommuneForm = function (selectCommune) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectCommuneForm');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    //Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} tableSection section selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectSectionForm = function (selectCommune, tableSection) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectSectionForm');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(tableSection))
+        return 'tableSection non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos de la section
+    if ($(tableSection).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_section');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_section') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_section', tabName: 'Section', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/sections', 'id_sec', tableSection, 'veremes_cadastre_section');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} tableLieuDit Lieu-dit selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectLieuDitForm = function (selectCommune, tableLieuDit) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectSectionForm');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(tableLieuDit))
+        return 'tableLieuDit non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos du lieu dit
+    if ($(tableLieuDit).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_lieu_dit');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_lieu_dit') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_lieu_dit', tabName: 'Lieu-dit', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/lieudits', 'oid', tableLieuDit, 'veremes_cadastre_lieu_dit');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} selectSection section selector
+ * @param {string} tableParcelle parcelle selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectParcelleBySectionForm = function (selectCommune, selectSection, tableParcelle) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectSectionForm');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(selectSection))
+        return 'selectSection non renseigné';
+    if (!goog.isDef(tableParcelle))
+        return 'tableParcelle non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos de la section
+    if ($(selectSection).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_section');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_section') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_section', tabName: 'Section', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/sections', 'id_sec', selectSection, 'veremes_cadastre_section');
+    }
+
+    // Ajoute les infos de la Parcelle
+    if ($(tableParcelle).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_parcelle');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', tableParcelle, 'veremes_cadastre_parcelle');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} tableVoie voie selector
+ * @param {string} selectAdresse adresse selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectParcelleByAdresse = function (selectCommune, tableVoie, selectAdresse) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectParcelleByAdresse');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(tableVoie))
+        return 'selectSection non renseigné';
+    if (!goog.isDef(selectAdresse))
+        return 'tableParcelle non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos de la Voie
+    if ($(tableVoie).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_voie');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_voie') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_voie', tabName: 'Voie', actions: ['delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/voies', 'ID_RIVOLI', tableVoie, 'veremes_cadastre_voie');
+    }
+
+    // Ajoute les infos de l'adresse
+    if ($(selectAdresse).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_adresse');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_adresse') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_adresse', tabName: 'Adresse', actions: ['delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/adresses', 'ID_PAR', selectAdresse, 'veremes_cadastre_adresse');
+    }
+
+    // Ajoute les infos des parcelles
+    if ($(selectAdresse).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_parcelle');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', selectAdresse, 'veremes_cadastre_parcelle');
+
+        // Si on choisit de voir toutes les géométries
+    } else if ($(tableVoie).bootstrapTable('getSelections').length > 0 && this['aAdresses'].length > 0) {
+        this.aFormList_.push('veremes_cadastre_parcelle');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', this['aAdresses'], 'ID_PAR', 'veremes_cadastre_parcelle');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Localise parcelles by adresse
+ * @param {type} tableVoie
+ * @param {type} selectAdresse
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseParcelleByAdresse = function (tableVoie, selectAdresse) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.localiseParcelleByAdresse');
+
+    if ($(selectAdresse).val() !== "")
+        this.localiseFromSelect(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', selectAdresse);
+    else if ($(tableVoie).bootstrapTable('getSelections').length > 0) {
+        this.localiseFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', this['aAdresses'], 'ID_PAR');
+    }
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} tableProprietaires Prorpietaires selector
+ * @param {string} tableComptes Comptes selector
+ * @param {string} tableParcelles Parcelles selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectParcelleByProprietaire = function (selectCommune, tableProprietaires, tableComptes, tableParcelles) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectParcelleByProprietaire');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(tableProprietaires))
+        return 'tableProprietaires non renseigné';
+    if (!goog.isDef(tableComptes))
+        return 'tableComptes non renseigné';
+    if (!goog.isDef(tableParcelles))
+        return 'tableParcelles non renseigné';
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos du propriétaire
+    if ($(tableProprietaires).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_proprietaire');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_proprietaire') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_proprietaire', tabName: 'Propriétaire', actions: ['delete']});
+
+        // Ajoute les infos
+        var proprietaire = $(tableProprietaires).bootstrapTable('getSelections')[0];
+        this.addSelectionFrom2Values(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', 'DDENOM', proprietaire['DDENOM'], 'ID_COM', proprietaire['ID_COM'], 'veremes_cadastre_proprietaire');
+
+    }
+
+    // Ajoute les infos du compte
+    if ($(tableComptes).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_compte');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_compte') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_compte', tabName: 'Compte', actions: ['delete']});
+
+        // Ajoute les infos
+        var aComptes = $(tableComptes).bootstrapTable('getSelections');
+        if (this['cadastreAPI_'] === "cadastre") {
+            var id_com = 'ID_COM';
+            var dnupro = 'DNUPRO';
+        } else {
+            var id_com = 'id_com';
+            var dnupro = 'dnupro';
+        }
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < aComptes.length; i++) {
+            filter['operators'].push({
+                "relation": "AND",
+                "operators": [{
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": aComptes[i]['ID_COM']
+                    }, {
+                        "column": dnupro,
+                        "compare_operator": "=",
+                        "value": aComptes[i]['DNUPRO']
+                    }]
+            });
+        }
+
+        this.addSelectionFromFilter(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', filter, 'veremes_cadastre_compte');
+    }
+
+    // Ajoute les infos de la parcelle
+    if ($(tableParcelles).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_parcelle');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        var aParcelles = $(tableParcelles).bootstrapTable('getSelections');
+        this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', aParcelles, 'ID_PAR', 'veremes_cadastre_parcelle');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Add all the elements from the form to the selection
+ * @param {string} selectCommune commune selector
+ * @param {string} tableProprietaires Prorpietaires selector
+ * @param {string} tableComptes Comptes selector
+ * @param {string} tableInvariants Invariants selector
+ * @param {string} tableParcelles Parcelles selector
+ * @returns {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectBatiByProprietaire = function (selectCommune, tableProprietaires, tableComptes, tableInvariants, tableParcelles) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.selectBatiByProprietaire');
+
+    if (!goog.isDef(selectCommune))
+        return 'selectCommune non renseigné';
+    if (!goog.isDef(tableProprietaires))
+        return 'tableProprietaires non renseigné';
+    if (!goog.isDef(tableComptes))
+        return 'tableComptes non renseigné';
+    if (!goog.isDef(tableInvariants))
+        return 'tableInvariants non renseigné';
+    if (!goog.isDef(tableParcelles))
+        return 'tableParcelles non renseigné';
+
+    if (this['cadastreAPI_'] === "cadastre") {
+        var ddenomF = 'DDENOM';
+        var id_comF = 'ID_COM';
+    } else {
+        var ddenomF = 'ddenom';
+        var id_comF = 'id_com';
+    }
+
+    // Réinitialise aFormList_
+    this.aFormList_.length = 0;
+
+    // Réinitialise aFormElementsDisplayed_
+    this.aFormElementsDisplayed_ = 0;
+
+    // Ajoute les infos de la commune
+    if ($(selectCommune).val() !== "") {
+        this.aFormList_.push('veremes_cadastre_commune');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_commune') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_commune', tabName: 'Commune', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/communes', 'id_com', selectCommune, 'veremes_cadastre_commune');
+    }
+
+    // Ajoute les infos du propriétaire
+    if ($(tableProprietaires).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_proprietaire');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_proprietaire') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_proprietaire', tabName: 'Propriétaire', actions: ['delete']});
+
+        // Ajoute les infos
+        var proprietaire = $(tableProprietaires).bootstrapTable('getSelections')[0];
+        this.addSelectionFrom2Values(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', ddenomF, proprietaire['DDENOM'], id_comF, proprietaire['ID_COM'], 'veremes_cadastre_proprietaire');
+    }
+
+    // Ajoute les infos du compte
+    if ($(tableComptes).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_compte');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_compte') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_compte', tabName: 'Compte', actions: ['delete']});
+
+        var aComptes = $(tableComptes).bootstrapTable('getSelections');
+        if (this['cadastreAPI_'] === "cadastre") {
+            var id_com = 'ID_COM';
+            var dnupro = 'DNUPRO';
+            var id_local = 'oid';
+        } else {
+            var id_com = 'id_com';
+            var dnupro = 'dnupro';
+            var id_local = 'id_local';
+        }
+
+        var filter = {
+            "relation": "OR",
+            "operators": []
+        };
+        for (var i = 0; i < aComptes.length; i++) {
+            filter['operators'].push({
+                "relation": "AND",
+                "operators": [{
+                        "column": id_com,
+                        "compare_operator": "=",
+                        "value": aComptes[i]['ID_COM']
+                    }, {
+                        "column": dnupro,
+                        "compare_operator": "=",
+                        "value": aComptes[i]['DNUPRO']
+                    }]
+            });
+        }
+
+        this.addSelectionFromFilter(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', filter, 'veremes_cadastre_compte');
+    }
+
+    // Ajoute les infos de l'invariant
+    if ($(tableInvariants).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_invariant');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_invariant') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_invariant', tabName: 'Invariant', actions: ['delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/invariants', id_local, tableInvariants, 'veremes_cadastre_invariant');
+    }
+
+    // Ajoute les infos de la parcelle
+    if ($(tableParcelles).bootstrapTable('getSelections').length > 0) {
+        this.aFormList_.push('veremes_cadastre_parcelle');
+
+        // Crée l'onglet correspondant
+        if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_parcelle') === undefined)
+            oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
+
+        // Ajoute les infos
+        this.addSelectionFromTable(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', tableParcelles, 'veremes_cadastre_parcelle');
+    }
+
+    // Ouvre le dernier des onglets
+    var lastElement = this.aFormList_[this.aFormList_.length - 1];
+    oVmap.getToolsManager().getInfoContainer().displayTabByCode(lastElement);
+};
+
+/**
+ * Remove the cadastre map interactions
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.removeMapInteractions = function () {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.removeMapInteractions');
+
+    // Désactive les évènements sur la carte
+    oVmap.getMap().removeActionsOnMap();
+    // Cache le tooltip
+    oVmap.getMap().getMapTooltip().hide();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appCadastre', nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreDirective);
+oVmap.module.controller('AppcadastreController', nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController);
diff --git a/module/javascript/app/modules/Dessin/draw.js b/module/javascript/app/modules/Dessin/draw.js
new file mode 100755
index 0000000000000000000000000000000000000000..1ceaff3ab0c3380fcd65d1667b33427b48a25412
--- /dev/null
+++ b/module/javascript/app/modules/Dessin/draw.js
@@ -0,0 +1,1586 @@
+/* global oVmap, ol, nsVmap, bootbox, goog */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.nsModules.Draw
+ * cette classe permet l'initialisation des outils de dessin
+ */
+goog.provide('nsVmap.nsToolsManager.nsModules.Draw');
+
+goog.require('oVmap');
+
+goog.require('ol.interaction.Draw');
+goog.require('ol.style.Style');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Circle');
+goog.require('ol.Sphere');
+goog.require('ol.source.Vector');
+goog.require('ol.layer.Vector');
+goog.require('ol.Collection');
+goog.require('ol.interaction.Modify');
+goog.require('ol.interaction.Select');
+goog.require('ol.Overlay');
+goog.require('ol.interaction.Draw');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.geom.Circle');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.proj');
+goog.require('ol.format.GeoJSON');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.nsModules.Draw}: Add the draw tools defined in data/tools.json
+ *
+ * @constructor
+ * @export 
+ */
+nsVmap.nsToolsManager.nsModules.Draw = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw');
+    
+    opt_options = goog.isDef(opt_options) ? opt_options : {};
+
+    /**
+     * Fields for the feature form
+     * name: Texte à afficher
+     * id: identifiant du champ (sans espaces ni paranthèses)
+     * type: text/color/number
+     * required: "true" si le champ est requis
+     * value: valeur par défaut
+     * @type {object}
+     * @private
+     */
+    this['fields_'] = [{
+            "name": "Nom",
+            "id": "Nom",
+            "type": "text",
+            "required": "true",
+            "value": ""
+        }, {
+            "name": "Thème / Projet",
+            "id": "theme",
+            "type": "text",
+            "required": "false",
+            "value": ""
+        }, {
+            "name": "Commentaire",
+            "id": "commentaire",
+            "type": "text",
+            "required": "false",
+            "value": ""
+        }, {
+            "name": "Afficher l'étiquette",
+            "id": "ShowName",
+            "type": "boolean",
+            "required": "",
+            "value": ""
+        }, {
+            "name": "Afficher la partie vectorielle",
+            "id": "ShowVector",
+            "type": "boolean",
+            "required": "",
+            "value": ""
+        }, {
+            "name": "Couleur de fond",
+            "id": "Fill",
+            "type": "color",
+            "required": "false",
+            "value": "rgba(54,184,255,0.6)"
+        }, {
+            "name": "Couleur du contour",
+            "id": "Stroke",
+            "type": "color",
+            "required": "false",
+            "value": "rgba(0,0,0,0.4)"
+        }, {
+            "name": "Taille du contour",
+            "id": "StrokeSize",
+            "type": "number",
+            "required": "false",
+            "value": "2"
+        }, {
+            "name": "Couleur du texte",
+            "id": "Text",
+            "type": "color",
+            "required": "false",
+            "value": "rgba(0,0,0,1)"
+        }, {
+            "name": "Fond du texte",
+            "id": "TextBackground",
+            "type": "color",
+            "required": "false",
+            "value": "rgba(48,183,255,1)"
+        }, {
+            "name": "Taille du texte",
+            "id": "TextSize",
+            "type": "number",
+            "required": "false",
+            "value": "12"
+        }];
+
+    /**
+     * features to add
+     * @type {object}
+     * @private
+     */
+    this['features_'] = opt_options['features'];
+};
+goog.exportProperty(nsVmap.nsToolsManager.nsModules, 'Draw', nsVmap.nsToolsManager.nsModules.Draw);
+
+
+/**
+ * App-specific directive wrapping the draw tools. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawDirective");
+    return {
+        restrict: 'C',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppdrawController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/modules/draw.html'
+    };
+};
+
+/**
+ * Draw controller
+ * @ngInject
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController");
+
+    var drawController = this;
+
+    /**
+     * List of the fields description
+     * @type {object}
+     */
+    this['fields_'] = oVmap.getToolsManager().getTool('Draw').getFields();
+
+    /**
+     * features to add
+     * @type {object}
+     * @private
+     */
+    this['features_'] = oVmap.getToolsManager().getTool('Draw').getFeatures();
+
+    /**
+     * List of the export formats
+     * @type {array<string>}
+     * @private
+     */
+    this['exportFormats_'] = [
+        'GeoJSON'
+    ];
+
+    /**
+     * List of the export formats constructors
+     * @type {array<string>}
+     * @private
+     */
+    this['exportFormatsConstructors_'] = [ol.format.GeoJSON];
+
+    /**
+     * @type {ol.Sphere}
+     * @private
+     */
+    this.wgs84Sphere_ = new ol.Sphere(6378137);
+
+    /**
+     * @type {ol.map}
+     * @private
+     */
+    this.map_ = oVmap.getMap().getOLMap();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersOverlay_ = oVmap.getMap().addVectorLayer();
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersOverlayFeatures_ = this.oOpenLayersOverlay_.getSource().getFeaturesCollection();
+
+    /**
+     * The help draw-tooltip element.
+     * @type {Element}
+     * @private
+     */
+    this.helpTooltipElement_;
+
+    /**
+     * Overlay to show the help messages.
+     * @type {ol.Overlay}
+     * @private
+     */
+    this.helpTooltip_;
+
+    /**
+     * The draw draw-tooltip element.
+     * @type {Element}
+     * @private
+     */
+    this.drawTooltipElement_;
+
+    /**
+     * Overlay to show the drawment.
+     * @type {ol.Overlay}
+     * @private
+     */
+    this.drawTooltip_;
+
+    /**
+     * @type {ol.interaction.Draw}
+     * @private
+     */
+    this.draw_;
+
+    /**
+     * @type {ol.interaction.Modify}
+     * @private
+     */
+    this.modify_ = new ol.interaction.Modify({
+        features: this.oOpenLayersOverlayFeatures_
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.editInfosClick_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersOverlay_]
+    });
+
+    this.editInfosClick_.on('select', function () {
+        var aSelectedFeatures = this.editInfosClick_.getFeatures().getArray();
+        this.editFeatureInfos(aSelectedFeatures[0]);
+        // Supprime les features de la editInfosClick_
+        this.editInfosClick_.getFeatures().clear();
+    }, this);
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.showInfosClick_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersOverlay_]
+    });
+
+    this.showInfosClick_.on('select', function () {
+        var aSelectedFeatures = this.showInfosClick_.getFeatures().getArray();
+        this.displayFeatureInfos(aSelectedFeatures[0]);
+        // Supprime les features de la showInfosClick
+        this.showInfosClick_.getFeatures().clear();
+    }, this);
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.selectHover_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersOverlay_],
+        condition: ol.events.condition.pointerMove
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.delete_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersOverlay_]
+    });
+
+    this.delete_.on('select', function () {
+        var aSelectedFeatures = this.delete_.getFeatures().getArray();
+        var aOverlays = [];
+        var aDrawsToDelete = [];
+
+        // Supprime les features du featureOverlay et leurs annotations
+        this.removeFeaturesWithControl(aSelectedFeatures);
+//		this.removeDrawsInteractions();		
+    }, this);
+
+    this.geodesicCheckbox_ = document.getElementById('geodesic');
+
+    // Ajoute les features 
+    if (this['features_'] !== undefined)
+        this.addFeatures(this['features_']);
+};
+
+/**
+ * Creates a new draw draw-tooltip
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.createDrawTooltip = function (oFeature) {
+    if (this.drawTooltipElement_) {
+        this.drawTooltipElement_.parentNode.removeChild(this.drawTooltipElement_);
+    }
+    this.drawTooltipElement_ = document.createElement('div');
+    this.drawTooltipElement_.className = 'draw-tooltip draw-tooltip-draw';
+    this.drawTooltip_ = new ol.Overlay({
+        element: this.drawTooltipElement_,
+        offset: [0, -15],
+        positioning: 'bottom-center'
+    });
+    this.drawTooltip_.set('type', 'draw');
+
+    if (oFeature !== undefined)
+        this.drawTooltip_.set('feature', oFeature);
+
+    this.map_.addOverlay(this.drawTooltip_);
+};
+
+/**
+ * Set to the Feature a tooltip
+ * @param {ol.Feature} olFeature Feature to set stuff
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.setFeatureTooltip = function (olFeature) {
+
+    if (olFeature.get('infoValues') === undefined)
+        return;
+
+    var i = 0;
+
+    // Crée une nouvelle annotation
+    this.createDrawTooltip(olFeature);
+
+    for (key in olFeature.get('infoValues')) {
+        if (i == 0)
+            this.drawTooltipElement_.innerHTML = olFeature.get('infoValues')[key];
+        i++;
+    }
+
+    // positionne la tooltip
+    // this.drawTooltip_.setPosition(olFeature.getGeometry().getLastCoordinate());
+    this.drawTooltip_.setPosition(this.getTooltipPosition(olFeature.getGeometry()));
+
+
+    this.drawTooltipElement_.className = 'draw-tooltip draw-tooltip-static';
+    this.drawTooltip_.setOffset([0, -7]);
+    this.drawTooltipElement_.style.color = olFeature.get('infoValues')['Text'];
+    this.drawTooltipElement_.style.backgroundColor = olFeature.get('infoValues')['TextBackground'];
+    this.drawTooltipElement_.style.fontSize = olFeature.get('infoValues')['TextSize'];
+    if (olFeature.get('infoValues')['ShowName'] === "false")
+        this.drawTooltipElement_.style.opacity = 0;
+    // Si la partie vectorielle ne doit pas être affichée, alors on affiche pas non plus l'étiquette
+    if (olFeature.get('infoValues')['ShowVector'] === "false")
+        this.drawTooltipElement_.style.opacity = 0;
+
+    // unset draw-tooltip so that a new one can be created
+    this.drawTooltipElement_ = null;
+    this.createDrawTooltip(olFeature);
+    this.showHideAnotations();
+    this.removeDrawsInteractions();
+};
+
+/**
+ * Set the tooltip position
+ * @param {ol.geom.Geometry} geom The feature to place the tooltip in
+ * return {ol.Coordinate} The coordinates where place the tooltip
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.getTooltipPosition = function (geom) {
+
+    if (geom.getType() === 'Polygon') {
+
+        var position = geom.getInteriorPoint().getLastCoordinate();
+
+    } else if (geom.getType() === 'MultiPolygon') {
+
+        var position = geom.getInteriorPoints().getLastCoordinate();
+
+    } else if (geom.getType() === 'LineString') {
+
+        var centerPoint = Math.round(geom.getCoordinates().length / 2);
+        var position = geom.getCoordinates()[centerPoint];
+
+    } else if (geom.getType() === 'Circle') {
+
+        var position = geom.getCenter();
+
+    } else if (geom.getType() === 'Point' || geom.getType() === 'MultiPoint') {
+
+        var position = geom.getLastCoordinate();
+
+    } else if (geom.getType() === 'GeometryCollection') {
+
+        return 0;
+
+    } else {
+        return geom.getLastCoordinate();
+    }
+
+    return position;
+};
+
+/**
+ * Creates a new help draw-tooltip
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.createHelpTooltip = function () {
+    if (this.helpTooltipElement_) {
+        this.helpTooltipElement_.parentNode.removeChild(this.helpTooltipElement_);
+    }
+    this.helpTooltipElement_ = document.createElement('div');
+    this.helpTooltipElement_.className = 'draw-tooltip draw-tooltip-help';
+    this.helpTooltip_ = new ol.Overlay({
+        element: this.helpTooltipElement_,
+        offset: [15, 0],
+        positioning: 'center-left'
+    });
+    this.map_.addOverlay(this.helpTooltip_);
+};
+
+/**
+ * Add a openLayers interaction
+ * @param {ol.geom.GeometryType} type Type of interaction
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.addInteraction = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.addInteraction');
+
+    oVmap.getMap().getMapTooltip().displayMessage('Cliquer pour commencer à dessiner');
+
+    this.draw_ = oVmap.getMap().setDrawInteraction({type: type, features: this.oOpenLayersOverlayFeatures_}, 'draw-draw' + type);
+
+    this.draw_.on('drawstart',
+            function (evt) {
+                if (type === 'Point' || type === 'Circle') {
+                    oVmap.getMap().getMapTooltip().displayMessage('Cliquez pour terminer le dessin');
+                } else if (type === 'LineString' || type === 'Polygon') {
+                    oVmap.getMap().getMapTooltip().displayMessage('Double-cliquez pour terminer le dessin');
+                }
+            }, this);
+
+    this.draw_.on('drawend',
+            function (evt) {
+
+                $("#draw-edit-modal-header").addClass('hidden');
+
+                this.setInfosToFeature(evt.feature);
+                this.editFeatureInfos(evt.feature);
+                oVmap.getMap().getMapTooltip().hide();
+
+                // Fonctions appelées après modification de la feature
+                evt.feature.on('change', function () {
+                    // Bouge la tooltip lors qu'on bouge la feature
+                    aOverlays = oVmap.getMap().getOLMap().getOverlays();
+                    for (var i = aOverlays.getArray().length - 1; i >= 0; i--) {
+                        if (aOverlays.getArray()[i].get('feature') === evt.feature) {
+                            aOverlays.getArray()[i].setPosition(this.getTooltipPosition(evt.feature.getGeometry()));
+                        }
+                    }
+                    // Recalcule la superficie et le périmètre
+                    this.setInfosToFeature(evt.feature);
+                }, this);
+            }, this);
+};
+
+/**
+ * Add the features in the oOpenLayersOverlay_
+ * @param {object} oFeatures Features to add
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.addFeatures = function (oFeatures) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.addFeatures');
+
+    // Récupère l'objet features depuis la chaine de caractères
+    var formatConstructors = [
+        ol.format.GPX,
+        ol.format.GeoJSON,
+        ol.format.IGC,
+        ol.format.KML,
+        ol.format.TopoJSON
+    ];
+
+    var aFeaturesReaded = [];
+
+    // Essaye de lire la source celon les formats suivants
+    for (var i = 0; i < formatConstructors.length; i++) {
+        var format = new formatConstructors[i]();
+        try {
+            var features = format.readFeatures(oFeatures);
+            // Si la lecture a réussi, alors oFeaturesReaded prend la valeur de la géométrie
+            if (features.length > 0) {
+                aFeaturesReaded = features;
+                i = formatConstructors.length;
+            }
+        } catch (err) {
+        }
+    }
+
+    for (var i = 0; i < aFeaturesReaded.length; i++) {
+
+        // Le GeoJSON ne peut pas lire les cercles, alors 
+        // si une des figures en est un, il faut le recréer
+        if (aFeaturesReaded[i].get('Type') === 'Cercle') {
+
+            var center = aFeaturesReaded[i].get('Coordinates')[0];
+            var radius = aFeaturesReaded[i].get('Coordinates')[1];
+
+            var olCircle = new ol.geom.Circle([NaN, NaN]);
+
+            olCircle.setCenterAndRadius(center, radius, 'XY');
+            aFeaturesReaded[i].setGeometry(olCircle);
+        }
+
+        this.oOpenLayersOverlay_.getSource().addFeature(aFeaturesReaded[i]);
+        this.setFeatureTooltip(aFeaturesReaded[i]);
+        this.setFeatureStyle(aFeaturesReaded[i]);
+
+        // Fonctions après modification de la feature
+        var drawController = this;
+        aFeaturesReaded[i].on('change', function () {
+            // Bouge la tooltip lors qu'on bouge la feature
+            aOverlays = oVmap.getMap().getOLMap().getOverlays();
+            for (var ii = aOverlays.getArray().length - 1; ii >= 0; ii--) {
+                if (aOverlays.getArray()[ii].get('feature') === this) {
+                    aOverlays.getArray()[ii].setPosition(drawController.getTooltipPosition(this.getGeometry()));
+                }
+            }
+            ;
+            // Recalcule la superficie et le périmètre
+            drawController.setInfosToFeature(this);
+        }, aFeaturesReaded[i]);
+    }
+    ;
+};
+
+/**
+ * Remove the features in the array
+ * @param {array<ol.Feature>} aFeatures Features to delete
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeFeatures = function (aFeatures) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeFeatures');
+
+    // Supprime les features du featureOverlay et leurs annotations
+    for (var i = aFeatures.length - 1; i >= 0; i--) {
+        // Supprime les annotations
+        aOverlays = oVmap.getMap().getOLMap().getOverlays().getArray();
+        aDrawsToDelete = [];
+        for (var ii = aOverlays.length - 1; ii >= 0; ii--) {
+            if (aOverlays[ii].get('feature') === aFeatures[i] || aOverlays[ii].get('feature') === 'info') {
+                aDrawsToDelete.push(aOverlays[ii]);
+            }
+        }
+        for (var ii = aDrawsToDelete.length - 1; ii >= 0; ii--) {
+            oVmap.getMap().getOLMap().getOverlays().remove(aDrawsToDelete[ii]);
+        }
+        // Supprime la feature
+        this.oOpenLayersOverlay_.getSource().removeFeature(aFeatures[i]);
+        this.removeDrawsInteractions();
+    }
+
+    // Change la propriété 'id' des dessins restants
+    aFeatures = this.oOpenLayersOverlayFeatures_.getArray();
+    for (var i = 0; i < aFeatures.length; i++) {
+        aFeatures[i].set('Id', i);
+    }
+};
+
+/**
+ * Remove the features in the array with a control modal
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeFeaturesWithControl = function (aFeatures) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeFeaturesWithControl');
+
+    var ii = 0;
+    var featureName = [];
+    var featureId = [];
+    var drawController = this;
+    var noms = "";
+    var currentPosition = this.map_.getView().getCenter();
+    var currentZoom = this.map_.getView().getZoom();
+
+    // Zoom sur la feature
+    if (aFeatures.length === 1)
+        this.zoomToFeature(aFeatures[0]);
+
+
+    // Récupère le premier champ de chaque dessin
+    for (var i = 0; i < aFeatures.length; i++) {
+        ii = 0;
+        featureId.push(aFeatures[i].get('Id'));
+        for (key in aFeatures[i].get('infoValues')) {
+            if (ii === 0)
+                featureName.push(aFeatures[i].get('infoValues')[key]);
+            ii++;
+        }
+    }
+    ;
+
+    var message = '';
+
+    if (featureName.length === 1)
+        message = "<h4>Etes-vous certain de vouloir supprimer le dessin: <br><br> Id: " + featureId[0] + ", Nom: " + featureName[0] + " ?</h4>";
+    else if (featureName.length > 1) {
+
+        for (var i = 0; i < featureName.length; i++) {
+
+            noms += "<br> Id: " + featureId[i] + ", Nom: " + featureName[i] + "";
+
+        }
+        ;
+        message = "<h4>Etes-vous certain de vouloir supprimer les dessins ci-dessous ? <br>" + noms + " </h4>";
+    } else
+        return;
+
+    bootbox.confirm(message, function (result) {
+        if (result === true)
+            drawController.removeFeatures(aFeatures);
+
+        drawController.map_.getView().setCenter(currentPosition);
+        drawController.map_.getView().setZoom(currentZoom);
+    });
+};
+
+/**
+ * Remove the selected by the checkbox draw feature
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeSelectedFeatures = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.removeSelectedFeatures");
+
+    // Récupère les Id des features à supprimer
+    var ids = $.map($('#draw-features-list-table').bootstrapTable('getSelections'), function (row) {
+        return row['column1'];
+    });
+
+    var aFeaturesToDelete = [];
+    var aFeatures = this.oOpenLayersOverlayFeatures_.getArray();
+
+    for (var i = 0; i < ids.length; i++) {
+        aFeaturesToDelete.push(aFeatures[ids[i]]);
+    }
+
+    this.removeFeaturesWithControl(aFeaturesToDelete);
+
+};
+
+/**
+ * Cancel the editFeature : if the feature already exists, the function just close the modal
+ * but if the feature is being created, the function remove the created points
+ * @param {ol.Feature} olFeature feature to cancel
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.calcelEditFeature = function (olFeature) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.calcelEditFeature');
+    if (olFeature.get('infoValues') === undefined) {
+        this.removeFeatures([olFeature]);
+    }
+    this.removeDrawsInteractions();
+};
+
+/**
+ * Set to the Feature a style
+ * @param {ol.Feature} olFeature Feature to set stuff
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.setFeatureStyle = function (olFeature) {
+
+    if (olFeature.get('infoValues') === undefined)
+        return;
+
+    var color = {
+        Fill: olFeature.get('infoValues')['Fill'],
+        Stroke: olFeature.get('infoValues')['Stroke'],
+        StrokeSize: olFeature.get('infoValues')['StrokeSize'],
+        ShowVector: olFeature.get('infoValues')['ShowVector']
+    };
+
+    if (color.ShowVector === "false") {
+        color.Fill = 'rgba(255, 255, 255, 0)';
+        color.Fill2 = 'rgba(255, 255, 255, 0)';
+        color.Stroke = 'rgba(255, 255, 255, 0)';
+    }
+    if (color.Fill === "" || color.Fill === undefined) {
+        color.Fill = 'rgba(54,184,255,0.6)';
+        color.Fill2 = 'rgba(255,255,255,1)';
+    } else {
+        color.Fill2 = color.Fill;
+    }
+    if (color.Stroke === "" || color.Stroke === undefined)
+        color.Stroke = 'rgba(255,255,255,1)';
+
+    if (color.StrokeSize === "" || color.StrokeSize === undefined)
+        color.StrokeSize = 2;
+
+    olFeature.setStyle(new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: color.Fill
+        }),
+        stroke: new ol.style.Stroke({
+            color: color.Stroke,
+            width: color.StrokeSize
+        }),
+        image: new ol.style.Circle({
+            radius: 7,
+            fill: new ol.style.Fill({
+                color: color.Fill2
+            }),
+            stroke: new ol.style.Stroke({
+                color: color.Stroke,
+                width: color.StrokeSize
+            })
+        })
+    }));
+};
+
+/**
+ * Put the infos in to the feature
+ * @param {ol.Feature} olFeature Feature to put the infos in
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.setInfosToFeature = function (olFeature) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.setInfosToFeature');
+
+    // Id
+    if (olFeature.get('Id') === undefined) {
+        var id = this.oOpenLayersOverlayFeatures_.getLength();
+        olFeature.set('Id', id);
+    }
+
+    // Remplit le premier element du formulaire à vide
+    var firstElem = this['fields_'][0]['name'];
+    olFeature.set(firstElem, '');
+
+    if (olFeature.getGeometry() instanceof ol.geom.Point) {
+        olFeature.set('Type', 'Point');
+        olFeature.set('Périmètre/longueur', '-');
+        olFeature.set('Superficie', '-');
+        olFeature.set('Coordinates', olFeature.getGeometry().getCoordinates());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.LineString) {
+        olFeature.set('Type', 'Ligne');
+        olFeature.set('Périmètre/longueur', this.formatLength(olFeature.getGeometry()));
+        olFeature.set('Superficie', '-');
+        olFeature.set('Coordinates', olFeature.getGeometry().getCoordinates());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.Polygon) {
+        olFeature.set('Type', 'Polygone');
+        olFeature.set('Périmètre/longueur', this.formatPerimeter(olFeature.getGeometry()));
+        olFeature.set('Superficie', this.formatArea(olFeature.getGeometry()));
+        olFeature.set('Coordinates', olFeature.getGeometry().getCoordinates());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.Circle) {
+
+        var radius = parseFloat(this.formatRadius(olFeature.getGeometry()));
+        var unit = this.formatRadius(olFeature.getGeometry()).replace(radius, '');
+        var perimeter = Math.PI * radius * 2;
+        var area = Math.PI * Math.pow(radius, 2);
+
+        olFeature.set('Type', 'Cercle');
+        olFeature.set('Périmètre/longueur', perimeter.toFixed(4) + unit);
+        olFeature.set('Superficie', area.toFixed(4) + unit + "²");
+        olFeature.set('Coordinates', [olFeature.getGeometry().getCenter(), olFeature.getGeometry().getRadius()]);
+
+    } else {
+        olFeature.set('Type', 'undefined');
+        olFeature.set('Périmètre/longueur', '-');
+        olFeature.set('Superficie', '-');
+    }
+};
+
+/**
+ * Update the feature infos after creating or editing
+ * @param {ol.Feature} olFeature feature to update
+ * @param {object} aInfos to update
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.updateFeatureInfos = function (olFeature, aInfos) {
+    oVmap.log('nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.updateFeatureInfos');
+
+    $('.modal').modal('hide');
+
+    var tmpValue = "";
+    var oInfoValues = {};
+    var aOverlays = oVmap.getMap().getOLMap().getOverlays();
+
+    // Ajoute un style a la figure
+    var color = {};
+    for (var i = 0; i < this['fields_'].length; i++) {
+        if (this['fields_'][i]['id'] === 'Fill')
+            color.Fill = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'Stroke')
+            color.Stroke = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'Text')
+            color.Text = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'TextBackground')
+            color.TextBackground = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'TextSize')
+            color.TextSize = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'StrokeSize')
+            color.StrokeSize = $("#print-" + aInfos[i]['id'] + "-input").val();
+        else if (this['fields_'][i]['id'] === 'ShowName') {
+            color.ShowName = $("#print-" + aInfos[i]['id'] + "-input")[0].checked;
+            $("#print-" + aInfos[i]['id'] + "-input").val(color.ShowName);
+        } else if (this['fields_'][i]['id'] === 'ShowVector') {
+            color.ShowVector = $("#print-" + aInfos[i]['id'] + "-input")[0].checked;
+            $("#print-" + aInfos[i]['id'] + "-input").val(color.ShowVector);
+        }
+    }
+
+    if (color.ShowVector === false) {
+        color.Fill = 'rgba(255, 255, 255, 0)';
+        color.Fill2 = 'rgba(255, 255, 255, 0)';
+        color.Stroke = 'rgba(255, 255, 255, 0)';
+        color.ShowName = false;
+    }
+    if (color.Fill === "") {
+        color.Fill = 'rgba(54,184,255,0.6)';
+        color.Fill2 = 'rgba(255,255,255,1)';
+    } else {
+        color.Fill2 = color.Fill;
+    }
+    if (color.Stroke === "")
+        color.Stroke = 'rgba(255,255,255,1)';
+    if (color.StrokeSize === "")
+        color.StrokeSize = 2;
+
+    olFeature.setStyle(new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: color.Fill
+        }),
+        stroke: new ol.style.Stroke({
+            color: color.Stroke,
+            width: parseFloat(color.StrokeSize)
+        }),
+        image: new ol.style.Circle({
+            radius: 7,
+            fill: new ol.style.Fill({
+                color: color.Fill2
+            }),
+            stroke: new ol.style.Stroke({
+                color: color.Stroke,
+                width: parseFloat(color.StrokeSize)
+            })
+        })
+    }));
+
+    // Supprime les annotations précédentes
+    for (var i = aOverlays.getArray().length - 1; i >= 0; i--) {
+        if (aOverlays.getArray()[i].get('feature') === olFeature) {
+            aOverlays.remove(aOverlays.getArray()[i]);
+        }
+    }
+    ;
+
+    // Crée une nouvelle annotation
+    this.createDrawTooltip(olFeature);
+    for (var i = 0; i < aInfos.length; i++) {
+        // ecrit sur le tooltip ainsi que dans la feature le resultat du premier element du formulaire
+        if (i === 0) {
+            this.drawTooltipElement_.innerHTML = $("#print-" + aInfos[i]['id'] + "-input").val();
+            olFeature.set(aInfos[i]['name'], $("#print-" + aInfos[i]['id'] + "-input").val());
+        }
+        oInfoValues[aInfos[i]['id']] = $("#print-" + aInfos[i]['id'] + "-input").val();
+    }
+
+    olFeature.set('infoValues', oInfoValues);
+
+    this.drawTooltip_.setPosition(this.getTooltipPosition(olFeature.getGeometry()));
+    this.drawTooltipElement_.className = 'draw-tooltip draw-tooltip-static';
+    this.drawTooltip_.setOffset([0, -7]);
+    this.drawTooltipElement_.style.color = color.Text;
+    this.drawTooltipElement_.style.backgroundColor = color.TextBackground;
+    this.drawTooltipElement_.style.fontSize = color.TextSize;
+    if (color.ShowName === false)
+        this.drawTooltipElement_.style.opacity = 0;
+
+    // unset draw-tooltip so that a new one can be created
+    this.drawTooltipElement_ = null;
+    this.createDrawTooltip(olFeature);
+    this.showHideAnotations();
+    this.removeDrawsInteractions();
+
+    oVmap.log('updateFeatureInfos done');
+};
+
+/**
+ * format length output
+ * @param {ol.geom.LineString} line
+ * @return {string}
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.formatLength = function (line) {
+    var length;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() == 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() == 'EPSG:4326') {
+        var coordinates = line.getCoordinates();
+        length = this.calcDistance(coordinates);
+    } else {
+        length = line.getLength();
+    }
+    var output;
+    if (length > 1000) {
+        output = (Math.round(length / 1000 * 100) / 100) +
+                ' ' + 'km';
+    } else {
+        output = (Math.round(length * 100) / 100) +
+                ' ' + 'm';
+    }
+    return output;
+};
+
+/**
+ * Calculate the distance between points with the haversine method
+ * @param {array<ol.Coordinate>} coordinates Coordinates
+ * @return {number} Distance between the two points
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.calcDistance = function (coordinates) {
+    length = 0;
+    var sourceProj = this.map_.getView().getProjection();
+    for (var i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+        var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
+        var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
+        length += this.wgs84Sphere_.haversineDistance(c1, c2);
+    }
+
+    return length;
+};
+
+/**
+ * Calculate the coordinates
+ * @param {ol.geom.Point} point
+ * @return {string}
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.formatCoordinate = function (point) {
+    output = [point.getCoordinates()[0].toFixed(4), point.getCoordinates()[1].toFixed(4)];
+    return output;
+};
+
+/**
+ * Calculate the radius
+ * @param {ol.geom.Circle} circle
+ * @return {string}
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.formatRadius = function (circle) {
+    var radius;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() == 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() == 'EPSG:4326') {
+        var coordinates = [circle.getFirstCoordinate(), circle.getLastCoordinate()];
+        radius = this.calcDistance(coordinates);
+    } else {
+        radius = Math.round(circle.getRadius() * 100) / 100;
+    }
+    var output;
+    if (radius > 1000) {
+        output = (Math.round(radius / 1000 * 100) / 100) +
+                ' ' + 'km';
+    } else {
+        output = (Math.round(radius * 100) / 100) +
+                ' ' + 'm';
+    }
+    return output;
+};
+
+/**
+ * Calculate the perimeter
+ * @param {ol.geom.Polygon} polygon
+ * @return {string}
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.formatPerimeter = function (polygon) {
+
+    var lineString = new ol.geom.LineString(
+            polygon.getCoordinates()[0],
+            polygon.getLayout()
+            );
+
+    output = this.formatLength(lineString);
+
+    return output;
+};
+
+/**
+ * Calculate the area
+ * @param {ol.geom.Polygon} polygon
+ * @return {string}
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.formatArea = function (polygon) {
+    var area;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() == 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() == 'EPSG:4326') {
+        var sourceProj = this.map_.getView().getProjection();
+        var geom = /** @type {ol.geom.Polygon} */(polygon.clone().transform(
+                sourceProj, 'EPSG:4326'));
+        var coordinates = geom.getLinearRing(0).getCoordinates();
+        area = Math.abs(this.wgs84Sphere_.geodesicArea(coordinates));
+    } else {
+        area = polygon.getArea();
+    }
+    var output;
+    if (area > 1000000) {
+        output = (Math.round(area / 1000000 * 100) / 100) +
+                ' ' + 'km²';
+    } else {
+        output = (Math.round(area * 100) / 100) +
+                ' ' + 'm²';
+    }
+    return output;
+};
+
+/**
+ * zoom to the selected feature
+ * @param{ol.Feature} feature feature to zoom in
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.zoomToFeature = function (feature) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.zoomToFeature");
+
+    if (feature.get('Type') === 'Point') {
+        this.map_.getView().setCenter(feature.getGeometry().getCoordinates());
+    } else if (feature.get('Type') === 'Cercle') {
+        this.map_.getView().fit(
+                feature.getGeometry(),
+                {padding: [0, 0, 0, 0]}
+        );
+        this.map_.getView().setCenter(feature.getGeometry().getCenter());
+    } else {
+        this.map_.getView().fit(
+                feature.getGeometry(),
+                {padding: [0, 0, 0, 0]}
+        );
+    }
+};
+
+/**
+ * Put the href on the export buttons
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.initExportFeatureButtons = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.initExportFeatureButtons");
+
+    var aFeatures = this.oOpenLayersOverlayFeatures_.getArray();
+    var sFormats = this['exportFormats_'];
+    var formatConstructors = this['exportFormatsConstructors_'];
+    var sProjection = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+    var sFeatures = '';
+
+    // Export GeoJSON et autres
+    for (var i = 0; i < sFormats.length; i++) {
+        // Essaye d'ecrire la geométrie celon les formats suivants
+        for (var i = 0; i < formatConstructors.length; i++) {
+            var format = new formatConstructors[i]();
+            try {
+                // Ecrit la feature dans une chaine
+                sFeatures = format.writeFeatures(aFeatures, {
+                    dataProjection: sProjection,
+                    featureProjection: sProjection
+                });
+
+                // Ajoute les sauts à la ligne
+                sFeatures = sFeatures.replace(/{/g, "{\n");
+                sFeatures = sFeatures.replace(/}/g, "\n}");
+
+                // Si le bouton n'existe pas, alors on l'joute aux boutons d'export de bootstraptable
+                if ($("#draw-export-" + sFormats[i] + "-button").length == 0) {
+                    var node = document.createElement("li");
+                    var link = document.createElement("a");
+                    link.setAttribute("id", "draw-export-" + sFormats[i] + "-button");
+                    link.setAttribute("download", "Features.json");
+                    node.appendChild(link);
+                    var textnode = document.createTextNode(sFormats[i]);
+                    link.appendChild(textnode);
+
+                    $("#draw-features-list-table").parents('.bootstrap-table').find('.export').find('ul')[0].appendChild(node);
+                }
+
+                // Donne comme href le fichier de geométrie
+                $("#draw-export-" + sFormats[i] + "-button").attr('href',
+                        "data:text/csv;charset=utf-8," + encodeURIComponent(sFeatures));
+
+            } catch (err) {
+            }
+        }
+    }
+    ;
+};
+
+/**
+ * Display the feature infos in a modal with the bootrap-table plugin
+ * avaliable on (http://bootstrap-table.wenzhixin.net.cn/examples)
+ * @param{ol.Feature} olFeature Feature to show infos
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.displayFeatureInfos = function (olFeature) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.displayFeatureInfos");
+
+    this['selectedFeature'] = olFeature;
+
+    var columns = [{
+            'field': 'field',
+            'title': '',
+            'sortable': true,
+            'cellStyle': function (a, b) {
+                return {'classes': 'active bold'}
+            }
+        }, {
+            'field': 'result',
+            'title': '',
+            'sortable': true
+        }];
+
+    var data = [];
+
+    for (var i = 0; i < this['fields_'].length; i++) {
+        data.push({
+            'field': this['fields_'][i]['name'],
+            'result': olFeature.get('infoValues')[this['fields_'][i]['id']]
+        });
+    }
+    ;
+
+    $('#draw-feature-description-table').bootstrapTable({
+        'columns': columns,
+        'data': data,
+        'search': true,
+        'showHeader': false,
+        'showExport': 'true',
+        // pagination: true,
+        'height': $("#feature-description-modal").height() * 0.6,
+        'rowStyle': function (a, b) {
+            return {'classes': ['active', 'success']}
+        }
+    });
+
+    $('#draw-feature-description-table').bootstrapTable('load', data);
+    $('.modal').modal('hide');
+    $('#feature-description-modal').modal('show');
+};
+
+/**
+ * Edit the features infos in a modal
+ * @param{ol.Feature} olFeature Feature to show infos
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.editFeatureInfos = function (olFeature) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.editFeatureInfos");
+
+    var drawController = this;
+    var initColor = function (i) {
+        // Initialise colorpicker
+        $("#print-" + drawController['fields_'][i]['id'] + "-input").colorpicker({
+            format: 'rgba',
+            color: $("#print-" + drawController['fields_'][i]['id'] + "-input").val()
+        }).on('changeColor', function () {
+            $(this).parent().find('.color-span2').css('background-color', $(this).val());
+        });
+
+        // Colorie la balise span
+        $("#print-" + drawController['fields_'][i]['id'] + "-input").parent().find('.color-span2').css('background-color',
+                $("#print-" + drawController['fields_'][i]['id'] + "-input").val());
+    }
+
+
+    for (var i = 0; i < this['fields_'].length; i++) {
+
+        // Donne la valeur aux champs
+
+        // Lors de l'edition d'une feature existante
+        if (olFeature.get('infoValues') != undefined) {
+            $("#print-" + this['fields_'][i]['id'] + "-input").val(olFeature.get('infoValues')[this['fields_'][i]['id']]);
+
+            if (this['fields_'][i]['type'] == 'color') {
+                initColor(i);
+            } else if (this['fields_'][i]['type'] == 'boolean') {
+                if (olFeature.get('infoValues')[this['fields_'][i]['id']] == 'false')
+                    $("#print-" + this['fields_'][i]['id'] + "-input").bootstrapToggle('off');
+                else
+                    $("#print-" + this['fields_'][i]['id'] + "-input").bootstrapToggle('on');
+            }
+            // Lors d'une nouvelle feature
+        } else if (this['fields_'][i]['value'] != undefined) {
+            $("#print-" + this['fields_'][i]['id'] + "-input").val(this['fields_'][i]['value']);
+            if (this['fields_'][i]['type'] == 'color') {
+                initColor(i);
+            } else if (this['fields_'][i]['type'] == 'boolean') {
+                if ([this['fields_'][i]['value']] == 'false')
+                    $("#print-" + this['fields_'][i]['id'] + "-input").bootstrapToggle('off');
+                else
+                    $("#print-" + this['fields_'][i]['id'] + "-input").bootstrapToggle('on');
+            }
+            // Lors d'une nouvelle feature sans valeurs associées
+        } else {
+            $("#print-" + this['fields_'][i]['id'] + "-input").val("");
+            if (this['fields_'][i]['type'] == 'boolean') {
+                $("#print-" + this['fields_'][i]['id'] + "-input").bootstrapToggle('on');
+            }
+            $('.colorpicker').colorpicker({format: 'rgba'}).on('changeColor', function () {
+                $(this).parent().find('.color-span2').css('background-color', $(this).val());
+            });
+        }
+    }
+    ;
+    this['selectedFeature'] = olFeature;
+    $('.modal').modal('hide');
+    $('#feature-edit-modal').modal('show');
+    $('.bootstrap-toggle').bootstrapToggle();
+};
+
+/** 
+ * Display the sketches in a list with the bootrap-table plugin
+ * avaliable on (http://bootstrap-table.wenzhixin.net.cn/examples)
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.displayFeaturesList = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.displayFeaturesList");
+
+    var drawController = this;
+    var aFeatures = this.oOpenLayersOverlayFeatures_.getArray();
+    var featuresListData = [];
+
+    this['sketchesLenght'] = aFeatures.length;
+
+    if (aFeatures.length === 0) {
+        $('.modal').modal('hide');
+        $('#draw-features-list-modal').modal('show');
+        $('#draw-features-list-table').bootstrapTable('load', []);
+        return;
+    }
+
+    var actionFormatter = function (value, row, index) {
+        return [
+            '<a class="show-feature margin-sides-5" href="javascript:void(0)" title="Voir">',
+            '<i class="glyphicon glyphicon-search"></i>',
+            '</a>',
+            '<a class="edit-feature margin-sides-5" href="javascript:void(0)" title="Editer">',
+            '<i class="glyphicon glyphicon-edit"></i>',
+            '</a>',
+            '<a class="zoom-to-feature margin-sides-5" href="javascript:void(0)" title="Voir sur la carte">',
+            '<i class="glyphicon glyphicon-globe"></i>',
+            '</a>',
+            '<a class="remove-feature margin-sides-5" href="javascript:void(0)" title="Supprimer">',
+            '<i class="glyphicon glyphicon-trash"></i>',
+            '</a>'
+        ].join('');
+    };
+
+    var actionEvents = {
+        'click .show-feature': function (e, value, row, index) {
+            drawController.displayFeatureInfos(aFeatures[row['column1']]);
+        },
+        'click .edit-feature': function (e, value, row, index) {
+            drawController.editFeatureInfos(aFeatures[row['column1']]);
+        },
+        'click .zoom-to-feature': function (e, value, row, index) {
+            $(".modal").modal('hide');
+            drawController.zoomToFeature(aFeatures[row['column1']]);
+        },
+        'click .remove-feature': function (e, value, row, index) {
+            $(".modal").modal('hide');
+            drawController.removeFeaturesWithControl([aFeatures[row['column1']]]);
+        }
+    };
+
+    var aKeys = aFeatures[0].getKeys();
+    var columns = [{
+            'field': 'state',
+            'checkbox': true
+        }, {
+            'field': 'action',
+            'formatter': actionFormatter,
+            'events': actionEvents,
+            'class': 'draw-features-list-button-column'
+        }];
+
+    featuresListData = [];
+
+    for (var i = 0; i < aFeatures.length; i++) {
+        var lineData = {};
+        for (var ii = 0; ii < aKeys.length; ii++) {
+            if (aKeys[ii] !== 'geometry' && aKeys[ii] !== 'infoValues' && aKeys[ii] !== 'tooltip' && aKeys[ii] !== 'infoKeys') {
+
+                // Enregistrement des infos sur les colones
+                if (i === 0) {
+                    if (aKeys[ii] !== 'Coordinates') {
+                        columns.push({
+                            'field': "column" + ii,
+                            'title': aKeys[ii],
+                            'sortable': true
+                        });
+                        // colones non visibles par défaut
+                    } else {
+                        columns.push({
+                            'field': "column" + ii,
+                            'title': aKeys[ii],
+                            'sortable': true,
+                            'visible': false
+                        });
+                    }
+                }
+
+                // Enregistrement des infos sur les lignes
+                lineData["column" + ii] = aFeatures[i].get(aKeys[ii]);
+            }
+        }
+
+        // Ajoute dans featuresListData lineData et libère la mémoire
+        featuresListData.push(lineData);
+        delete lineData;
+    }
+
+    $('#draw-features-list-table').bootstrapTable({
+        'columns': columns,
+        'data': featuresListData,
+        'search': true,
+        'showColumns': true,
+        'showExport': 'true',
+        // pagination: true,
+        'height': $("#feature-description-modal").height() * 0.6,
+        'rowStyle': function (a, b) {
+            return {'classes': ['active', 'success']};
+        }
+    });
+
+    $('#draw-features-list-table').bootstrapTable('load', featuresListData);
+
+    $('.modal').modal('hide');
+    $('#draw-features-list-modal').modal('show');
+
+    this.initExportFeatureButtons();
+};
+
+/**
+ * show/hide anotations
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.showHideAnotations = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.showHideAnotations");
+
+    if (document.getElementById('draw-anotations').checked)
+        $('.draw-tooltip-static').show();
+    else
+        $('.draw-tooltip-static').hide();
+};
+
+/**
+ * Start draw point interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.drawPoint = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.drawPoint");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        this.addInteraction('Point');
+    }
+};
+
+/**
+ * Start draw line interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.drawLine = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.drawLine");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        this.addInteraction('LineString');
+    }
+};
+
+/**
+ * Start draw polygon interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.drawPolygon = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.drawPolygon");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        this.addInteraction('Polygon');
+    }
+};
+
+/**
+ * Start draw circle interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.drawCircle = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.drawCircle");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        this.addInteraction('Circle');
+    }
+};
+
+/**
+ * Start modify feature interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.modifyFeature = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.modifyFeature");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour le modifier');
+        oVmap.getMap().setInteraction(this.modify_, 'draw-modifyFeature');
+    }
+};
+
+/**
+ * Start update feature infos interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.editInfosClick = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.modifyFeature");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour éditer les infos');
+        oVmap.getMap().setInteraction(this.editInfosClick_, 'draw-editInfosFeature');
+//        oVmap.getMap().addInteraction(this.selectHover_, 'draw-editInfosFeature');
+    }
+};
+
+/**
+ * Start show feature infos interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.showInfosClick = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.showInfosClick");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour voir les infos');
+        oVmap.getMap().setInteraction(this.showInfosClick_, 'showInfosFeature');
+//        oVmap.getMap().addInteraction(this.selectHover_, 'showInfosFeature');
+    }
+};
+
+/**
+ * Start delete feature interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.deleteFeature = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.deleteFeature");
+
+    this.removeDrawsInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour le supprimer');
+        oVmap.getMap().setInteraction(this.delete_, 'draw-deleteFeature');
+//        oVmap.getMap().addInteraction(this.selectHover_, 'draw-deleteFeature');
+    }
+};
+
+/**
+ * remove all the draw features
+ * @export
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.deleteAllFeatures = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.deleteAllFeatures");
+    // remove the draw/draw tool
+    this.removeDrawsInteractions();
+    // remove the features
+    this.oOpenLayersOverlayFeatures_.clear();
+    // remove the overlays draws
+    var aOverlays = oVmap.getMap().getOLMap().getOverlays().getArray();
+    var aDrawOverlays = [];
+    for (var i = aOverlays.length - 1; i >= 0; i--) {
+        if (aOverlays[i].get('type') === 'draw')
+            aDrawOverlays.push(aOverlays[i]);
+    }
+    for (var i = aDrawOverlays.length - 1; i >= 0; i--) {
+        oVmap.getMap().getOLMap().getOverlays().remove(aDrawOverlays[i]);
+    }
+
+    // Change la propriété 'id' des dessins restants
+    aFeatures = this.oOpenLayersOverlayFeatures_.getArray();
+    for (var i = 0; i < aFeatures.length; i++) {
+        aFeatures[i].set('Id', i);
+    }
+};
+
+/**
+ * remove all the draw interactions
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.prototype.removeDrawsInteractions = function () {
+    oVmap.log("nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController.removeDrawsInteractions");
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+    // Désactive les interactions
+    oVmap.getMap().removeActionsOnMap();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appDraw', nsVmap.nsToolsManager.nsModules.Draw.prototype.drawDirective);
+oVmap.module.controller('AppdrawController', nsVmap.nsToolsManager.nsModules.Draw.prototype.drawController);
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+
+/**
+ * nsVmap.fields_ getter
+ * @return {object} Feature fields to use
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.getFields = function () {
+    return this['fields_'];
+};
+/**
+ * nsVmap.fields_ setter
+ * @param {object} fields Feature fields to use
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.setFields = function (fields) {
+    this['fields_'] = fields;
+};
+/**
+ * nsVmap.features_ getter
+ * @return {object} Features to use
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.getFeatures = function () {
+    return this['features_'];
+};
+/**
+ * nsVmap.features_ setter
+ * @param {object} features Features to use
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.nsModules.Draw.prototype.setFeatures = function (features) {
+    this['features_'] = features;
+};
\ No newline at end of file
diff --git a/module/javascript/app/modules/modules.list.js b/module/javascript/app/modules/modules.list.js
new file mode 100755
index 0000000000000000000000000000000000000000..d5274a9245d10378ab26ac73b6000437cf1b7c64
--- /dev/null
+++ b/module/javascript/app/modules/modules.list.js
@@ -0,0 +1,11 @@
+/* global goog */
+
+/**
+* @author: Armand Bahi
+* @Description: Fichier contenant la liste des modules à include
+*/
+
+goog.provide('nsVmap.nsToolsManager.requireModules');
+
+goog.require('nsVmap.nsToolsManager.nsModules.Draw');
+goog.require('nsVmap.nsToolsManager.nsModules.Cadastre');
\ No newline at end of file
diff --git a/module/javascript/app/vmap/map/map.js b/module/javascript/app/vmap/map/map.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbd9fabb1a9b9305ce02faa83d8b38f4bfa9b227
--- /dev/null
+++ b/module/javascript/app/vmap/map/map.js
@@ -0,0 +1,2403 @@
+/* global nsVmap, ol, oVmap, goog, angular, vitisApp, bootbox */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.Map
+ * cette classe permet l'initialisation de la carte
+ */
+
+goog.provide('nsVmap.Map');
+
+goog.require('oVmap');
+
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Style');
+goog.require('ol.source.Vector');
+goog.require('ol.layer.Vector');
+goog.require('ol.Collection');
+goog.require('ol.proj.Projection');
+goog.require('goog.async.AnimationDelay');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.Map}: initializes the map
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.Map = function () {
+    oVmap.log("nsVmap.Map");
+
+    var this_ = this;
+
+    /**
+     * Map layers
+     * @type {Array.<ol.layer>}
+     * @private
+     */
+    this.olLayers_ = [];
+
+    /**
+     * Map view
+     * @type {ol.View}
+     * @private
+     */
+    this.olView_ = new ol.View({
+        center: [0, 0],
+        zoom: 2
+    });
+
+    /**
+     * Map
+     * @type {ol.map}
+     * @private
+     */
+    this.oOpenLayersMap_ = new ol.Map({
+        layers: this.olLayers_,
+        view: this.olView_,
+        moveTolerance: 5
+    });
+
+    /**
+     * Selections style
+     * @type {ol.style.Style}
+     */
+    this.oOpenLayersSelectionStyle_ = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(255, 255, 255, 0.3)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: '#d9534f',
+            width: 3
+        }),
+        image: new ol.style.Circle({
+            radius: 7,
+            fill: new ol.style.Fill({
+                color: '#d9534f'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersSelectionOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersSelectionOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersSelectionStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersSelectionOverlayFeatures_,
+            useSpatialIndex: false
+        }),
+        updateWhileAnimating: true,
+        updateWhileInteracting: true
+    });
+
+    /**
+     * Location style
+     * @type {ol.style.Style}
+     */
+    this.oOpenLayersLocationStyle_ = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(255, 255, 255, 0.3)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: '#337ab7',
+            width: 2
+        }),
+        image: new ol.style.Circle({
+            radius: 10,
+            stroke: new ol.style.Stroke({
+                color: '#337ab7',
+                width: 2
+            }),
+            fill: new ol.style.Fill({
+                color: 'rgba(255, 255, 255, 0.2)'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersLocationOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersLocationOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersLocationStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersLocationOverlayFeatures_,
+            useSpatialIndex: false
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersPopupOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersPopupOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersLocationStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersPopupOverlayFeatures_,
+            useSpatialIndex: false
+        })
+    });
+
+    /**
+     * Location style
+     * @type {ol.style.Style}
+     */
+    this.oOpenLayersGPSStyle_ = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(30, 132, 202, 1)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: 'rgba(255, 255, 255, 1)',
+            width: 2
+        }),
+        image: new ol.style.Circle({
+            radius: 6,
+            stroke: new ol.style.Stroke({
+                color: 'rgba(255, 255, 255, 1)',
+                width: 3
+            }),
+            fill: new ol.style.Fill({
+                color: 'rgba(30, 132, 202, 1)'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersGPSOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersGPSOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersGPSStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersGPSOverlayFeatures_,
+            useSpatialIndex: false
+        })
+    });
+
+    /**
+     * Mobile draw style
+     * @type {ol.style.Style}
+     */
+    this.oOpenLayersMobileDrawStyle_ = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(255, 255, 255, 0.2)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: '#ffcc33',
+            width: 2
+        }),
+        image: new ol.style.Circle({
+            radius: 6,
+            fill: new ol.style.Fill({
+                color: '#ffcc33',
+                width: 1
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#FFFFFF'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersMobileDrawOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersMobileDrawOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersMobileDrawStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersMobileDrawOverlayFeatures_,
+            useSpatialIndex: false
+        })
+    });
+
+    /**
+     * Mobile edit geom style
+     * @type {ol.style.Style}
+     */
+    this.oOpenLayersMobileGeomEditStyle_ = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(255,255,255,0.4)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: '#3399CC',
+            width: 1.25
+        }),
+        image: new ol.style.Circle({
+            radius: 7,
+            stroke: new ol.style.Stroke({
+                color: 'rgba(255, 255, 255, 1)',
+                width: 2
+            }),
+            fill: new ol.style.Fill({
+                color: 'rgba(30, 132, 202, 1)'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersMobileGeomEditOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersMobileGeomEditOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        style: this.oOpenLayersMobileGeomEditStyle_,
+        source: new ol.source.Vector({
+            features: this.oOpenLayersMobileGeomEditOverlayFeatures_,
+            useSpatialIndex: false
+        })
+    });
+
+    /**
+     * Contient les évènements ajoutés sur la carte par la méthode addEventOnMap ou setEventOnMap
+     * @type {array}
+     * @private
+     */
+    this.vmapEvents_ = [];
+
+    /**
+     * Contient les évènements ajoutés sur la carte par la méthode addDrawInteraction ou setDrawInteraction
+     * @type {array}
+     * @private
+     */
+    this.vmapInteractions_ = [];
+
+    /**
+     * Contient les tooltips ajoutés par addTooltip
+     * @type {array}
+     * @private
+     */
+    this.vmapOverlays_ = [];
+
+    /**
+     * Initialisé dans le controlleur
+     * @type {nsVmap.Map.MapTooltip}
+     * @private
+     */
+    this.vmapTooltip_ = {};
+
+    /**
+     * @private
+     */
+    this.vmapTextOverlayFeatures_ = new ol.Collection();
+
+    /**
+     * @private
+     */
+    this.vmapTextOverlay_ = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        source: new ol.source.Vector({
+            features: this.vmapTextOverlayFeatures_
+        })
+    });
+
+    // Ajoute les projections
+    this.addCustomProjections();
+
+    // Désactive le DoubleClickAndZoom
+    var aInteractions = this.oOpenLayersMap_.getInteractions().getArray();
+    for (var i = 0; i < aInteractions.length; i++) {
+        if (aInteractions[i] instanceof ol.interaction.DoubleClickZoom)
+            this.oOpenLayersMap_.removeInteraction(aInteractions[i]);
+    }
+
+    this.oOpenLayersMap_.getViewport().setAttribute('id', 'map1');
+
+    // Variables pour l'insertion
+    this.mobileDrawCallback_ = null;
+    this.mobileDrawType_ = null;
+    this.mobileDrawMulti_ = false;
+    this.mobileDrawUndoHistory_ = [];
+    this.mobileDrawRedoHistory_ = [];
+    this.mobileDrawTmpPoints_ = [];
+    this.mobileDrawTmpFeature_ = null;
+    this.mobileDrawOutputFeatures_ = [];
+
+    // Variables pour l'édition de géométrie
+    this.mobileGeomEditCallback_ = null;
+    this.mobileGeomEditTmpFeature_ = null;
+    this.mobileGeomEditClosestPointFeature_ = null;
+    this.mobileGeomEditModify_ = this.getGeomEditionModifyInteraction_();
+
+    this.mobileInteractiveEvent_ = 'moveend';
+    this.mobileInteractiveDrawTmpEvent_ = null;
+    this.mobileInteractiveTmpDrawFunction_ = null;
+
+    // Lors du click sur 'echap', désactive les actions et le tooltip
+    $(document).keydown(function (e) {
+        if (e.keyCode === 27) {
+            // Supprime les actions sur la carte et cache les tooltip
+            oVmap.getMap().removeActionsAndTooltips();
+        }
+    });
+
+    // Ajoute les couches à reprojeter en cas de changement de carte dans layersToTransform_
+    this.layersToTransform_ = [];
+    this.layersToTransform_.push(this.oOpenLayersMobileGeomEditOverlay_);
+    this.layersToTransform_.push(this.oOpenLayersMobileDrawOverlay_);
+    this.layersToTransform_.push(this.oOpenLayersSelectionOverlay_);
+    this.layersToTransform_.push(this.oOpenLayersLocationOverlay_);
+    this.layersToTransform_.push(this.oOpenLayersPopupOverlay_);
+    this.layersToTransform_.push(this.oOpenLayersGPSOverlay_);
+    this.layersToTransform_.push(this.vmapTextOverlay_);
+
+    if (oVmap['properties']['is_mobile']) {
+        this_.trackGPSPosition();
+    }
+
+    // Termine les dessins par le clic droit
+    this.oOpenLayersMap_.getViewport().addEventListener('contextmenu', function (evt) {
+        evt.preventDefault();
+        this_.termineDrawInteractions();
+    })
+};
+
+/**
+ * Get the current scale
+ * @param {object} opt_options
+ * @param {boolean|undefined} opt_options.pretty true for pretty format (ex: 1:25,000)
+ * @returns {Number|String}
+ * @export
+ */
+nsVmap.Map.prototype.getScale = function (opt_options) {
+    oVmap.log('nsVmap.Map.prototype.getScale');
+
+    opt_options = goog.isDef(opt_options) ? opt_options : {};
+    opt_options['pretty'] = goog.isDef(opt_options['pretty']) ? opt_options['pretty'] : false;
+
+    var wgs84Sphere_ = new ol.Sphere(6378137);
+    var projection = this.oOpenLayersMap_.getView().getProjection();
+
+    var map = oVmap.getMap().getOLMap();
+
+    // récupère les coordonnées d'une ligue de 1cm (avec le zoom en cours)
+    var line = map.getView().calculateExtent([37.795275591, 0]);
+    var c1 = ol.proj.transform([line[0], line[1]], projection, 'EPSG:4326');
+    var c2 = ol.proj.transform([line[2], line[3]], projection, 'EPSG:4326');
+
+    // Récuère la longueur sur la carte de la ligne de 1cm
+    var length = wgs84Sphere_.haversineDistance(c1, c2);
+
+    // donc 1m sur la carte correspond à (length mètres dans la réalité x 100)
+    var scale = length * 100;
+
+    // Rend l'échelle sous format (1:25,000)
+    if (opt_options['pretty'] === true) {
+        scale = this.getPrettyScale(scale);
+    }
+
+    return scale;
+};
+
+/**
+ * Get the scale like (1:25,000)
+ * @param {number} scale
+ * @returns {String} scale (pretty)
+ */
+nsVmap.Map.prototype.getPrettyScale = function (scale) {
+
+    // Rend l'échelle sous format (1:25,000)
+    scale = String(Math.round(scale));
+    var j = 1;
+    for (var i = scale.length - 1; i > 0; i--) {
+        if (j % 3 === 0)
+            scale = scale.slice(0, i) + ',' + scale.slice(i + Math.abs(0));
+        j++;
+    }
+    scale = '1:' + scale;
+
+    return scale;
+};
+
+/**
+ * Set the map scale
+ * @param {number} scale
+ * @returns {number} new scale
+ * @export
+ */
+nsVmap.Map.prototype.setScale = function (scale) {
+    oVmap.log('nsVmap.Map.prototype.setScale');
+
+    // calcule et va à l'échelle celon une règle de 3
+    var currentScale = this.getScale();
+    var currentResolution = this.oOpenLayersMap_.getView().getResolution();
+
+    var scaleResolution = scale * currentResolution / currentScale;
+    this.oOpenLayersMap_.getView().setResolution(scaleResolution);
+
+    // Ajuste l'échelle en augementant la résolution
+    currentScale = this.getScale();
+
+    oVmap.log(currentScale);
+};
+
+/**
+ * Add projections
+ */
+nsVmap.Map.prototype.addCustomProjections = function () {
+
+    var lambert93 = new ol.proj.Projection({
+        code: 'EPSG:2154',
+        // Cette extent est celle du niveau de zoom 0, on peut les trouver sur http://epsg.io/
+        extent: [-378305.81, 6093283.21, 1212610.74, 7186901.68],
+        units: 'm'
+    });
+    ol.proj.addProjection(lambert93);
+    var WGSToLambert = this.WGSToLambert;
+    var lambertToWGS = this.lambertToWGS;
+    // Ajoute les fonctions de transformation de EPSG:4326 vers EPSG:2154
+    ol.proj.addCoordinateTransforms('EPSG:4326', 'EPSG:2154', this.WGSToLambert, this.lambertToWGS);
+    ol.proj.addCoordinateTransforms('EPSG:3857', 'EPSG:2154',
+            function (coordinate3857) {
+                var coordinate4326 = ol.proj.transform(coordinate3857, 'EPSG:3857', 'EPSG:4326');
+                var coordinate2154 = ol.proj.transform(coordinate4326, 'EPSG:4326', 'EPSG:2154');
+                return coordinate2154;
+            },
+            function (coordinate2154) {
+                var coordinate4326 = ol.proj.transform(coordinate2154, 'EPSG:2154', 'EPSG:4326');
+                var coordinate3857 = ol.proj.transform(coordinate4326, 'EPSG:4326', 'EPSG:3857');
+                return coordinate3857;
+            });
+};
+
+/**
+ * Tansform WGS83 coordinates to Lambert93
+ * @param {ol.coordinates} coordinates WGS coordinates to transform
+ * @returns {ol.coordinates} Lambert93 coordinates
+ */
+nsVmap.Map.prototype.WGSToLambert = function (coordinates) {
+
+    var longitude = coordinates[0];
+    var latitude = coordinates[1];
+    var deg2rad = function deg2rad(angle) {
+        return (angle / 180) * Math.PI;
+    };
+    //variables:
+    var a = 6378137; //demi grand axe de l'ellipsoide (m)
+    var e = 0.08181919106; //première excentricité de l'ellipsoide
+    var l0 = lc = deg2rad(3);
+    var phi0 = deg2rad(46.5); //latitude d'origine en radian
+    var phi1 = deg2rad(44); //1er parallele automécoïque
+    var phi2 = deg2rad(49); //2eme parallele automécoïque
+
+    var x0 = 700000; //coordonnées à l'origine
+    var y0 = 6600000; //coordonnées à l'origine
+
+    var phi = deg2rad(latitude);
+    var l = deg2rad(longitude);
+    //calcul des grandes normales
+    var gN1 = a / Math.sqrt(1 - e * e * Math.sin(phi1) * Math.sin(phi1));
+    var gN2 = a / Math.sqrt(1 - e * e * Math.sin(phi2) * Math.sin(phi2));
+    //calculs des latitudes isométriques
+    var gl1 = Math.log(Math.tan(Math.PI / 4 + phi1 / 2) * Math.pow((1 - e * Math.sin(phi1)) / (1 + e * Math.sin(phi1)), e / 2));
+    var gl2 = Math.log(Math.tan(Math.PI / 4 + phi2 / 2) * Math.pow((1 - e * Math.sin(phi2)) / (1 + e * Math.sin(phi2)), e / 2));
+    var gl0 = Math.log(Math.tan(Math.PI / 4 + phi0 / 2) * Math.pow((1 - e * Math.sin(phi0)) / (1 + e * Math.sin(phi0)), e / 2));
+    var gl = Math.log(Math.tan(Math.PI / 4 + phi / 2) * Math.pow((1 - e * Math.sin(phi)) / (1 + e * Math.sin(phi)), e / 2));
+    //calcul de l'exposant de la projection
+    var n = (Math.log((gN2 * Math.cos(phi2)) / (gN1 * Math.cos(phi1)))) / (gl1 - gl2);
+    //calcul de la constante de projection
+    var c = ((gN1 * Math.cos(phi1)) / n) * Math.exp(n * gl1);
+    //calcul des coordonnées
+    var ys = y0 + c * Math.exp(-1 * n * gl0);
+    var x93 = x0 + c * Math.exp(-1 * n * gl) * Math.sin(n * (l - lc));
+    var y93 = ys - c * Math.exp(-1 * n * gl) * Math.cos(n * (l - lc));
+    return [x93, y93];
+};
+
+/**
+ * Tansform Lambert93 coordinates to WGS83
+ * @param {ol.coordinates} coordinates Lambert93 coordinates to transform
+ * @returns {ol.coordinates} WGS84 coordinates
+ */
+nsVmap.Map.prototype.lambertToWGS = function (coordinates) {
+
+    Math.atanh = Math.atanh || function (x) {
+        return Math.log((1 + x) / (1 - x)) / 2;
+    };
+
+    Math.tanh = Math.tanh || function (x) {
+        if (x === Infinity) {
+            return 1;
+        } else if (x === -Infinity) {
+            return -1;
+        } else {
+            return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x));
+        }
+    };
+
+    var x = parseFloat(coordinates[0]).toFixed(10);
+    var y = parseFloat(coordinates[1]).toFixed(10);
+    var b6 = 6378137.0000;
+    var b7 = 298.257222101;
+    var b8 = 1 / b7;
+    var b9 = 2 * b8 - b8 * b8;
+    var b10 = Math.sqrt(b9);
+    var b13 = 3.000000000;
+    var b14 = 700000.0000;
+    var b15 = 12655612.0499;
+    var b16 = 0.7256077650532670;
+    var b17 = 11754255.426096;
+    var delx = x - b14;
+    var dely = y - b15;
+    var gamma = Math.atan(-(delx) / dely);
+    var r = Math.sqrt((delx * delx) + (dely * dely));
+    var latiso = Math.log(b17 / r) / b16;
+    var sinphiit0 = Math.tanh(latiso + b10 * Math.atanh(b10 * Math.sin(1)));
+    var sinphiit1 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit0));
+    var sinphiit2 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit1));
+    var sinphiit3 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit2));
+    var sinphiit4 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit3));
+    var sinphiit5 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit4));
+    var sinphiit6 = Math.tanh(latiso + b10 * Math.atanh(b10 * sinphiit5));
+    var longrad = gamma / b16 + b13 / 180 * Math.PI;
+    var latrad = Math.asin(sinphiit6);
+    var lon = (longrad / Math.PI * 180);
+    var lat = (latrad / Math.PI * 180);
+    return ([lon, lat]);
+};
+
+/**
+ * Set a event on the map and remove the others.
+ * @param {string|Array.<string>} type The event type or array of event types.
+ * @param {function(?): ?} listener The listener function.
+ * @param {Object=} opt_this The object to use as `this` in `listener`.
+ * @param {string|undefined} currentAction name of the current action
+ * @return {goog.events.Key} Unique key for the listener.
+ * @export
+ */
+nsVmap.Map.prototype.setEventOnMap = function (type, listener, opt_this, currentAction) {
+    oVmap.log('nsVmap.Map.prototype.setEventOnMap');
+    if (!goog.isDef(type)) {
+        console.error('setEventOnMap: type not defined');
+        return 0;
+    }
+
+    if (!goog.isDef(listener)) {
+        console.error('setEventOnMap: listener not defined');
+        return 0;
+    }
+
+    opt_this = goog.isDef(opt_this) ? opt_this : '';
+    // Supprime les anciens évènements et interractions
+    this.removeActionsOnMap();
+    // Ajoute le nouvel évènement
+    var event = this.addEventOnMap(type, listener, opt_this);
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+    return event;
+};
+
+/**
+ * Add a certain type of event on the map.
+ * @param {string|Array.<string>} type The event type or array of event types.
+ * @param {function(?): ?} listener The listener function.
+ * @param {Object=} opt_this The object to use as `this` in `listener`.
+ * @param {string|undefined} currentAction name of the current action
+ * @return {goog.events.Key} Unique key for the listener.
+ * @export
+ */
+nsVmap.Map.prototype.addEventOnMap = function (type, listener, opt_this, currentAction) {
+
+    if (!goog.isDef(type)) {
+        console.error('setEventOnMap: type not defined');
+        return 0;
+    }
+
+    if (!goog.isDef(listener)) {
+        console.error('setEventOnMap: listener not defined');
+        return 0;
+    }
+
+    opt_this = goog.isDef(opt_this) ? opt_this : '';
+    // Active l'évènement
+    var event = this.oOpenLayersMap_.on(type, listener, opt_this);
+    // Stocke l'évènement
+    this.vmapEvents_.push(event);
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+    return event;
+};
+
+/**
+ * Add a draw event on the map and remove the others.
+ * @param {object} opt_options
+ * @param {number | undefined} opt_options.clickTolerance The maximum distance in pixels between "down" and "up" for a "up" event to be considered a "click" event and actually add a point/vertex to the geometry being drawn. Default is 6 pixels. That value was chosen for the draw interaction to behave correctly on mouse as well as on touch devices.
+ * @param {ol.Collection.<ol.Feature> | undefined} opt_options.features Destination collection for the drawn features.
+ * @param {ol.source.Vector | undefined} opt_options.source Destination source for the drawn features.
+ * @param {number | undefined} opt_options.snapTolerance Pixel distance for snapping to the drawing finish. Default is 12.
+ * @param {ol.geom.GeometryType} opt_options.type Drawing type ('Point', 'LineString', 'Polygon', 'MultiPoint', 'MultiLineString', 'MultiPolygon' or 'Circle'). Required.
+ * @param {number | undefined} opt_options.maxPoints The number of points that can be drawn before a polygon ring or line string is finished. The default is no restriction.
+ * @param {number | undefined} opt_options.minPoints The number of points that must be drawn before a polygon ring or line string can be finished. Default is 3 for polygon rings and 2 for line strings.
+ * @param {ol.style.Style | Array.<ol.style.Style> | ol.style.StyleFunction | undefined} opt_options.style Style for sketch features.
+ * @param {ol.interaction.DrawGeometryFunctionType | undefined} opt_options.geometryFunction Function that is called when a geometry's coordinates are updated.
+ * @param {string | undefined} opt_options.geometryName Geometry name to use for features created by the draw interaction.
+ * @param {ol.events.ConditionType | undefined} opt_options.condition A function that takes an ol.MapBrowserEvent and returns a boolean to indicate whether that event should be handled. By default ol.events.condition.noModifierKeys, i.e. a click, adds a vertex or deactivates freehand drawing.
+ * @param {ol.events.ConditionType | undefined} opt_options.freehandCondition Condition that activates freehand drawing for lines and polygons. This function takes an ol.MapBrowserEvent and returns a boolean to indicate whether that event should be handled. The default is ol.events.condition.shiftKeyOnly, meaning that the Shift key activates freehand drawing.
+ * @param {boolean | undefined} opt_options.wrapX Wrap the world horizontally on the sketch overlay. Default is false.
+ * @param {string|undefined} currentAction name of the current action
+ * @returns {ol.interaction.Draw|Number}
+ * @export
+ */
+nsVmap.Map.prototype.setDrawInteraction = function (opt_options, currentAction) {
+    oVmap.log('nsVmap.Map.prototype.setDrawInteraction');
+    if (!goog.isDef(opt_options.type)) {
+        console.error('addDrawOnMap: opt_options.type not defined');
+        return 0;
+    }
+
+    // Supprime les anciens évènements et interractions
+    this.removeActionsOnMap();
+    // Ajout de l'interaction dessin
+    var draw = this.addDrawInteraction(opt_options);
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+    return draw;
+};
+
+/**
+ * Add a draw event on the map.
+ * @param {object} opt_options
+ * @param {number | undefined} opt_options.clickTolerance The maximum distance in pixels between "down" and "up" for a "up" event to be considered a "click" event and actually add a point/vertex to the geometry being drawn. Default is 6 pixels. That value was chosen for the draw interaction to behave correctly on mouse as well as on touch devices.
+ * @param {ol.Collection.<ol.Feature> | undefined} opt_options.features Destination collection for the drawn features.
+ * @param {ol.source.Vector | undefined} opt_options.source Destination source for the drawn features.
+ * @param {number | undefined} opt_options.snapTolerance Pixel distance for snapping to the drawing finish. Default is 12.
+ * @param {ol.geom.GeometryType} opt_options.type Drawing type ('Point', 'LineString', 'Polygon', 'MultiPoint', 'MultiLineString', 'MultiPolygon' or 'Circle'). Required.
+ * @param {number | undefined} opt_options.maxPoints The number of points that can be drawn before a polygon ring or line string is finished. The default is no restriction.
+ * @param {number | undefined} opt_options.minPoints The number of points that must be drawn before a polygon ring or line string can be finished. Default is 3 for polygon rings and 2 for line strings.
+ * @param {ol.style.Style | Array.<ol.style.Style> | ol.style.StyleFunction | undefined} opt_options.style Style for sketch features.
+ * @param {ol.interaction.DrawGeometryFunctionType | undefined} opt_options.geometryFunction Function that is called when a geometry's coordinates are updated.
+ * @param {string | undefined} opt_options.geometryName Geometry name to use for features created by the draw interaction.
+ * @param {ol.events.ConditionType | undefined} opt_options.condition A function that takes an ol.MapBrowserEvent and returns a boolean to indicate whether that event should be handled. By default ol.events.condition.noModifierKeys, i.e. a click, adds a vertex or deactivates freehand drawing.
+ * @param {ol.events.ConditionType | undefined} opt_options.freehandCondition Condition that activates freehand drawing for lines and polygons. This function takes an ol.MapBrowserEvent and returns a boolean to indicate whether that event should be handled. The default is ol.events.condition.shiftKeyOnly, meaning that the Shift key activates freehand drawing.
+ * @param {boolean | undefined} opt_options.wrapX Wrap the world horizontally on the sketch overlay. Default is false.
+ * @param {string|undefined} currentAction name of the current action
+ * @returns {ol.interaction.Draw|Number}
+ * @export
+ */
+nsVmap.Map.prototype.addDrawInteraction = function (opt_options, currentAction) {
+
+    if (!goog.isDef(opt_options.type)) {
+        console.error('addDrawOnMap: opt_options.type not defined');
+        return 0;
+    }
+
+    // Valeurs par défaut
+    opt_options.style = goog.isDef(opt_options.style) ? opt_options.style : new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(54,184,255,0.6)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: 'rgba(0, 0, 0, 0.5)',
+            lineDash: [10, 10],
+            width: 2
+        }),
+        image: new ol.style.Circle({
+            radius: 5,
+            stroke: new ol.style.Stroke({
+                color: 'rgba(0, 0, 0, 0.7)'
+            }),
+            fill: new ol.style.Fill({
+                color: 'rgba(54,184,255,0.6)'
+            })
+        })
+    });
+
+    // Ajout de l'interaction dessin
+    var draw = new ol.interaction.Draw(opt_options);
+    this.addInteraction(draw);
+
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+
+    return draw;
+};
+
+/**
+ * Remove events and interactions and then add a interaction
+ * @param {ol.interaction.Interaction} interaction
+ * @param {string|undefined} currentAction name of the current action
+ * @returns {ol.interaction.Interaction}
+ */
+nsVmap.Map.prototype.setInteraction = function (interaction, currentAction) {
+    oVmap.log('nsVmap.Map.prototype.setInteraction');
+    // Supprime les anciens évènements et interractions
+    this.removeActionsOnMap();
+    // Ajoute la nouvelle interaction
+    this.addInteraction(interaction);
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+    return interaction;
+};
+
+/**
+ * Add a interaction
+ * @param {ol.interaction.Interaction} interaction
+ * @param {string|undefined} currentAction name of the current action
+ * @returns {ol.interaction.Interaction}
+ */
+nsVmap.Map.prototype.addInteraction = function (interaction, currentAction) {
+    oVmap.log('nsVmap.Map.prototype.addInteraction');
+    // Ajout de l'interaction
+    this.oOpenLayersMap_.addInteraction(interaction);
+    // Stocke l'interaction
+    this.vmapInteractions_.push(interaction);
+    // Définit l'action en cours
+    if (goog.isDef(currentAction))
+        this.setCurrentAction(currentAction);
+    return interaction;
+};
+
+/**
+ * Remove the events and draw interactions added by addEventOnMap, setEventOnMap, addDrawInteraction or setDrawInteraction
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.removeActionsOnMap = function () {
+    oVmap.log('nsVmap.Map.prototype.removeActionsOnMap');
+    // Supprime les évènements
+    for (var i = 0; i < this.vmapEvents_.length; i++) {
+        ol.Observable.unByKey(this.vmapEvents_[i]);
+    }
+
+    // Supprime les interractions
+    for (var i = 0; i < this.vmapInteractions_.length; i++) {
+
+        // Supprime les features occasionelles
+        if (goog.isDef(this.vmapInteractions_[i].getFeatures))
+            this.vmapInteractions_[i].getFeatures().clear();
+        this.oOpenLayersMap_.removeInteraction(this.vmapInteractions_[i]);
+    }
+
+    // Définit l'action en cours
+    this.setCurrentAction('');
+};
+
+/**
+ * Add an overlay witch will be remove when using removeActionsAndTooltips
+ * @param {ol.Overlay} overlay
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.addOverlay = function (overlay) {
+    this.vmapOverlays_.push(overlay);
+    this.oOpenLayersMap_.addOverlay(overlay);
+};
+
+/**
+ * Remove the mapTooltip and the actions added by addEventOnMap, setEventOnMap, addDrawInteraction or setDrawInteraction
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.removeActionsAndTooltips = function () {
+    this.removeActionsOnMap();
+    this.getMapTooltip().hide();
+    for (var i = 0; i < this.vmapOverlays_.length; i++) {
+        this.vmapOverlays_[i].getElement().style.display = "none";
+    }
+};
+
+/**
+ * Transform the layers contained in layersToTransform to the new projection
+ * @param {ol.proj.ProjectionLike} oldProjection
+ * @param {ol.proj.ProjectionLike} newProjection
+ * @returns {undefined}
+ */
+nsVmap.Map.prototype.reprojectFeatures = function (oldProjection, newProjection) {
+    oVmap.log('nsVmap.Map.prototype.reprojectFeatures');
+
+    for (var i = 0; i < this.layersToTransform_.length; i++) {
+        this.layersToTransform_[i].getSource().transformFeatures(oldProjection, newProjection);
+    }
+};
+
+/**
+ * Remove the text features and a new one
+ * @param {string} text
+ * @param {array} coordinates
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.setTextOverlayFeature = function (text, coordinates) {
+
+    // Vide les features existantes
+    this.vmapTextOverlayFeatures_.clear();
+
+    // Ajoute la nouvelle text feature
+    this.addTextOverlayFeature(text, coordinates);
+};
+
+/**
+ * Add a text feature
+ * @param {string} text
+ * @param {array} coordinates
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.addTextOverlayFeature = function (text, coordinates) {
+
+    var tmpstyle = new ol.style.Style({
+        image: new ol.style.Circle({
+            radius: 3,
+            stroke: new ol.style.Stroke({
+                color: '#fff'
+            }),
+            fill: new ol.style.Fill({
+                color: 'blue'
+            })
+        }),
+        text: new ol.style.Text({
+            text: text,
+            fill: new ol.style.Fill({
+                color: 'blue'
+            }),
+            offsetY: -13
+        })
+    });
+
+    var tmpMarker = new ol.Feature({
+        geometry: new ol.geom.Point(coordinates)
+    });
+
+    tmpMarker.setStyle(tmpstyle);
+
+    this.vmapTextOverlay_.getSource().addFeature(tmpMarker);
+};
+
+/**
+ * Use this function to add a new vector layer
+ * @param {object} opt_options
+ * @param {object} opt_options.style
+ * @param {object} opt_options.extent
+ * @param {object} opt_options.minResolution
+ * @param {object} opt_options.maxResolution
+ * @param {object} opt_options.opacity
+ * @param {object} opt_options.properties
+ * @param {object} opt_options.visible
+ * @param {object} opt_options.zIndex
+ * @returns {undefined}
+ */
+nsVmap.Map.prototype.addVectorLayer = function (opt_options) {
+    oVmap.log('nsVmap.Map.prototype.addVectorLayer');
+
+    var vectorLayer = new ol.layer.Vector({
+        map: this.oOpenLayersMap_,
+        source: new ol.source.Vector({
+            useSpatialIndex: false
+        }),
+        updateWhileAnimating: true,
+        updateWhileInteracting: true
+    });
+
+    if (goog.isDef(opt_options)) {
+        if (goog.isDef(opt_options.style))
+            vectorLayer.setStyle(opt_options.style);
+
+        if (goog.isDef(opt_options.extent))
+            vectorLayer.setExtent(opt_options.extent);
+
+        if (goog.isDef(opt_options.minResolution))
+            vectorLayer.setMinResolution(opt_options.minResolution);
+
+        if (goog.isDef(opt_options.maxResolution))
+            vectorLayer.setMaxResolution(opt_options.maxResolution);
+
+        if (goog.isDef(opt_options.opacity))
+            vectorLayer.setOpacity(opt_options.opacity);
+
+        if (goog.isDef(opt_options.properties))
+            vectorLayer.setProperties(opt_options.properties);
+
+        if (goog.isDef(opt_options.visible))
+            vectorLayer.setVisible(opt_options.visible);
+
+        if (goog.isDef(opt_options.zIndex))
+            vectorLayer.setZIndex(opt_options.zIndex);
+    }
+
+    // Ajoute la couche à layersToTransform_ pour que les features soient reprojetés en cas de changement de projection
+    this.layersToTransform_.push(vectorLayer);
+
+    return vectorLayer;
+};
+
+/**
+ * Initialize the vmapTooltip_
+ * @returns {undefined}
+ */
+nsVmap.Map.prototype.initMapTooltip = function () {
+
+    this.vmapTooltip_ = new nsVmap.Map.MapTooltip({id: 'map-tooltip'});
+};
+
+/**
+ * Refresh the map without caches
+ * @export
+ */
+nsVmap.Map.prototype.refresh = function () {
+    oVmap.log('nsVmap.Map.prototype.refresh');
+    this.oOpenLayersMap_.refreshWithTimestamp();
+};
+
+/**
+ * Locate the passed features
+ * @param {array<ol.Feature>} aFeatures
+ * @param {boolean} removeOldLocation true to remove the features before adding the new one
+ * @param {boolean} zoom
+ * @export
+ */
+nsVmap.Map.prototype.locateFeatures = function (aFeatures, removeOldLocation, zoom) {
+    oVmap.log('nsVmap.Map.prototype.locateFeatures');
+
+    zoom = goog.isDefAndNotNull(zoom) ? zoom : true;
+    removeOldLocation = goog.isDefAndNotNull(removeOldLocation) ? removeOldLocation : true;
+
+    if (aFeatures.length === 0)
+        return 0;
+
+    if (zoom) {
+        this.zoomOnFeatures(aFeatures);
+    }
+
+    // vide les feature si besoin
+    if (removeOldLocation) {
+        oVmap.getMap().getLocationOverlayFeatures().clear();
+    }
+
+    // Ajoute les features et les passe au dessus
+    for (var i = aFeatures.length - 1; i >= 0; i--) {
+        if (goog.array.contains(oVmap.getMap().getLocationOverlay().getSource().getFeatures(), aFeatures[i]))
+            oVmap.getMap().getLocationOverlay().getSource().removeFeature(aFeatures[i]);
+        oVmap.getMap().getLocationOverlay().getSource().addFeature(aFeatures[i]);
+    }
+};
+
+/**
+ * Select the passed features
+ * @param {array<ol.Feature>} aFeatures
+ * @param {boolean} removeOldSelection true to remove the features before adding the new one
+ * @param {boolean} zoom
+ * @export
+ */
+nsVmap.Map.prototype.selectFeatures = function (aFeatures, removeOldSelection, zoom) {
+    oVmap.log('nsVmap.Map.prototype.selectFeatures');
+
+    zoom = goog.isDefAndNotNull(zoom) ? zoom : true;
+    removeOldSelection = goog.isDefAndNotNull(removeOldSelection) ? removeOldSelection : true;
+
+    if (aFeatures.length === 0)
+        return 0;
+
+    if (zoom) {
+        this.zoomOnFeatures(aFeatures);
+    }
+
+    // vide les feature si besoin
+    if (removeOldSelection) {
+        oVmap.getMap().getSelectionOverlayFeatures().clear();
+    }
+
+    // Ajoute les features et les passe au dessus
+    for (var i = aFeatures.length - 1; i >= 0; i--) {
+        if (goog.array.contains(oVmap.getMap().getSelectionOverlay().getSource().getFeatures(), aFeatures[i]))
+            oVmap.getMap().getSelectionOverlay().getSource().removeFeature(aFeatures[i]);
+        oVmap.getMap().getSelectionOverlay().getSource().addFeature(aFeatures[i]);
+    }
+};
+
+/**
+ * Zoom on the passed features
+ * @param {array<ol.Feature>} aFeatures
+ * @export
+ */
+nsVmap.Map.prototype.zoomOnFeatures = function (aFeatures) {
+    oVmap.log('nsVmap.Map.prototype.zoomOnFeatures');
+
+    if (aFeatures.length === 0)
+        return 0;
+
+    var totalExtent = [];
+
+    totalExtent = jQuery.extend(true, [], aFeatures[0].getGeometry().getExtent());
+    for (var i = aFeatures.length - 1; i >= 0; i--) {
+        var featureExtent = aFeatures[i].getGeometry().getExtent();
+        if (featureExtent[0] < totalExtent[0])
+            totalExtent[0] = featureExtent[0];
+        if (featureExtent[1] < totalExtent[1])
+            totalExtent[1] = featureExtent[1];
+        if (featureExtent[2] > totalExtent[2])
+            totalExtent[2] = featureExtent[2];
+        if (featureExtent[3] > totalExtent[3])
+            totalExtent[3] = featureExtent[3];
+        delete featureExtent;
+    }
+
+    // En cas de simple point par exemple
+    if (totalExtent[0] === totalExtent[2]) {
+        totalExtent[0] = totalExtent[0] - totalExtent[0] * 0.0001;
+        totalExtent[2] = totalExtent[2] + totalExtent[2] * 0.0001;
+    }
+    if (totalExtent[1] === totalExtent[3]) {
+        totalExtent[1] = totalExtent[1] - totalExtent[1] * 0.0001;
+        totalExtent[3] = totalExtent[3] + totalExtent[3] * 0.0001;
+    }
+
+    setTimeout(function () {
+        // Zoom sur l'étendue totale
+        var olView = oVmap.getMap().getOLMap().getView();
+        olView.fit(totalExtent, {
+            padding: [50, 50, 50, 50]
+        });
+    });
+};
+
+/**
+ * Get the GPS position
+ * @returns {array}
+ */
+nsVmap.Map.prototype.getGPS = function () {
+    oVmap.log('nsVmap.Map.prototype.getGPS');
+    return goog.isDefAndNotNull(vitisApp['oGeoLocation']) ? vitisApp['oGeoLocation'] : null;
+};
+
+/**
+ * Get the GPS position
+ * @returns {ol.Coordinate}
+ * @export
+ */
+nsVmap.Map.prototype.getGPSPosition = function (sProj) {
+    oVmap.log('nsVmap.Map.prototype.getGPSPosition');
+
+    var aGPSCoordinates;
+    var oGPS = this.getGPS();
+    if (goog.isDefAndNotNull(oGPS)) {
+        var aPosition = oGPS.getPosition();
+        var oProj = goog.isDefAndNotNull(sProj) ? sProj : 'EPSG:4326';
+        if (goog.isDefAndNotNull(aPosition)) {
+            aGPSCoordinates = ol.proj.transform(aPosition, 'EPSG:4326', oProj);
+        } else {
+            $.notify('Impossible de récupérer la position actuelle', 'error');
+        }
+        return aGPSCoordinates;
+    } else {
+        return null;
+    }
+};
+
+/**
+ * Center the map on the GPS position
+ * @export
+ */
+nsVmap.Map.prototype.centerGPSPosition = function () {
+    oVmap.log('nsVmap.Map.prototype.centerGPSPosition');
+
+    var aGPSPosition = this.getGPSPosition(oVmap.getMap().getOLMap().getView().getProjection());
+    if (goog.isDefAndNotNull(aGPSPosition)) {
+        oVmap.getMap().getOLMap().getView().setCenter(aGPSPosition);
+    }
+};
+
+/**
+ * Track the GPS position: update a point feature into this.oOpenLayersGPSOverlay_
+ * @export
+ */
+nsVmap.Map.prototype.trackGPSPosition = function () {
+    oVmap.log('nsVmap.Map.prototype.trackGPSPosition');
+
+    var this_ = this;
+    var oGPS = this.getGPS();
+    var displayPosition = function () {
+        // Affiche la position
+        var aGPSPosition = this_.getGPSPosition(oVmap.getMap().getOLMap().getView().getProjection());
+        this_.oOpenLayersGPSOverlayFeatures_.clear();
+        console.log("aGPSPosition: ", aGPSPosition);
+        if (goog.isArray(aGPSPosition)) {
+            if (goog.isNumber(aGPSPosition[0]) && goog.isNumber(aGPSPosition[1])) {
+                this_.oOpenLayersGPSOverlay_.getSource().addFeature(new ol.Feature({
+                    geometry: new ol.geom.Point(aGPSPosition)
+                }));
+                // Affiche la précision
+                var iAccuracy = this_.getGPS().getAccuracy();
+                var olAccuracyFeature = new ol.Feature({
+                    geometry: new ol.geom.Circle(aGPSPosition, iAccuracy)
+                });
+                olAccuracyFeature.setStyle(new ol.style.Style({
+                    fill: new ol.style.Fill({
+                        color: 'rgba(30, 132, 202, 0.3)'
+                    }),
+                    stroke: new ol.style.Stroke({
+                        color: 'rgba(255, 255, 255, 0)',
+                        width: 2
+                    }),
+                    image: new ol.style.Circle({
+                        radius: 8,
+                        stroke: new ol.style.Stroke({
+                            color: 'rgba(255, 255, 255, 0)',
+                            width: 3
+                        }),
+                        fill: new ol.style.Fill({
+                            color: 'rgba(30, 132, 202, 0.3)'
+                        })
+                    })
+                }));
+                this_.oOpenLayersGPSOverlay_.getSource().addFeature(olAccuracyFeature);
+            }
+        }
+    };
+
+    if (goog.isDefAndNotNull(oGPS)) {
+        // Écoute les changements
+        oGPS.on('change', function () {
+            displayPosition();
+        });
+        setTimeout(function () {
+            displayPosition();
+        });
+
+        // Cas d'erreur
+        var lastError = Date.now();
+        var errorTimeout = 5000;
+        this.getGPS().on('error', function () {
+            if (lastError < Date.now() - errorTimeout) {
+                lastError = Date.now();
+                $.notify('Impossible de récupérer la position actuelle', 'error');
+            }
+        });
+    }
+};
+
+/**
+ * Termine all the draw interactions
+ *  
+ */
+nsVmap.Map.prototype.termineDrawInteractions = function () {
+    oVmap.log('nsVmap.Map.prototype.termineDrawInteractions');
+
+    for (var i = 0; i < this.vmapInteractions_.length; i++) {
+        if (this.vmapInteractions_[i] instanceof ol.interaction.Draw) {
+            try {
+                // Termine le dessin en cours
+                this.vmapInteractions_[i].finishDrawing();
+                // Desactive la fonctionnalié pour ne pas commencer un autre dessin
+                this.vmapInteractions_[i].setActive(false);
+                // Réactive la fonctionnalité
+                setTimeout(angular.bind(this, function(oDrawInteraction){
+                    oDrawInteraction.setActive(true);
+                }, this.vmapInteractions_[i]), 500);
+            } catch (e) {}
+        }
+    }
+};
+
+/********************************************
+ *           INTERFACE MOBILE
+ *******************************************/
+
+nsVmap.Map.prototype.getMobileDrawTargetPixel = function () {
+    oVmap.log('nsVmap.Map.prototype.getMobileDrawTargetPixel');
+
+    var horizontalCenter = $('.ol_draw_menu_vertical_bar')[0].offsetLeft;
+    var verticalCener = $('.ol_draw_menu_horizontal_bar')[0].offsetTop;
+    var targetPixel = [horizontalCenter + 1, verticalCener - 38];
+
+    return targetPixel;
+};
+
+nsVmap.Map.prototype.getGeomEditionModifyTargetPixel = function () {
+    oVmap.log('nsVmap.Map.prototype.getGeomEditionModifyTargetPixel');
+
+    var horizontalCenter = $('.ol_geom_edit_menu_vertical_bar')[0].offsetLeft;
+    var verticalCener = $('.ol_geom_edit_menu_horizontal_bar')[0].offsetTop;
+    var targetPixel = [horizontalCenter + 1, verticalCener - 38];
+
+    return targetPixel;
+};
+
+/**
+ * Start drawing with the mobile interface
+ * @param {string} sGeomType
+ * @param {function} callback
+ * @export
+ */
+nsVmap.Map.prototype.startMobileDraw = function (sGeomType, callback) {
+    oVmap.log('nsVmap.Map.prototype.startMobileDraw');
+
+    this.mobileDrawCallback_ = callback;
+
+    var this_ = this;
+
+    // Géométrie multiple ?
+    this.mobileDrawMulti_ = false;
+    if (sGeomType.substr(0, 5).toUpperCase() === 'MULTI') {
+        this.mobileDrawMulti_ = true;
+        sGeomType = sGeomType.substr(5).toUpperCase();
+    }
+
+    // Type de géométrie
+    if (sGeomType !== 'POINT'
+            && sGeomType !== 'LINESTRING'
+            && sGeomType !== 'POLYGON'
+            && sGeomType !== 'CIRCLE') {
+        console.error('Type non valide: ', sGeomType);
+        return null;
+    }
+
+    // Renseigne le type de géométrie
+    this.mobileDrawType_ = sGeomType;
+
+    // Vide les dessins antérieurs
+    this.oOpenLayersMobileDrawOverlayFeatures_.clear();
+    this.mobileDrawTmpPoints_ = [];
+    this.mobileDrawUndoHistory_ = [];
+    this.mobileDrawRedoHistory_ = [];
+    this.mobileDrawOutputFeatures_ = [];
+
+    // Affiche le menu
+    $('#mobile-draw-menu').removeClass('hidden');
+
+    // Renseigne la liste des dessins
+    var scope = this.getMapMenuScope();
+    scope.$applyAsync(function () {
+        scope['aDrawFeatures'] = this_.mobileDrawTmpPoints_;
+        scope['aDrawType'] = this_.mobileDrawType_;
+    });
+};
+
+/**
+ * Validate the point
+ * @param {array} aCoodrs
+ */
+nsVmap.Map.prototype.addMobileDrawPoint_ = function (aCoodrs) {
+    oVmap.log('nsVmap.Map.prototype.addMobileDrawPoint_');
+
+    if (this.mobileDrawType_ === 'POINT') {
+        this.mobileDrawTmpPoints_.length = 0;
+    }
+    if (this.mobileDrawType_ === 'CIRCLE') {
+        if (this.mobileDrawTmpPoints_.length >= 2) {
+            this.mobileDrawTmpPoints_.length = 0;
+        }
+    }
+
+    // Ajoute les coordonnées à la feature en cours
+    this.mobileDrawTmpPoints_.push(aCoodrs);
+
+    // Ajoute à l'historique
+    this.mobileDrawUndoHistory_.push(angular.copy(this.mobileDrawTmpPoints_));
+    this.mobileDrawRedoHistory_.length = 0;
+
+    this.renderDrawTmpFeature_();
+
+    // Termine automatiquement l'insertion si c'est un point ou un cercle
+    if (this.mobileDrawType_ === 'POINT') {
+        this.finishMobileDraw();
+    }
+    if (this.mobileDrawType_ === 'CIRCLE') {
+        if (this.mobileDrawTmpPoints_.length === 2) {
+            this.finishMobileDraw();
+        }
+    }
+};
+
+/**
+ * Render the feature determined by this.mobileDrawTmpPoints_
+ * @private
+ */
+nsVmap.Map.prototype.renderDrawTmpFeature_ = function () {
+    oVmap.log('nsVmap.Map.prototype.renderDrawTmpFeature_');
+
+    var this_ = this;
+
+    // Affiche la feature temporaire
+    this.displayDrawTmpFeature_();
+
+    // Renseigne la vue
+    var scope = this.getMapMenuScope();
+    scope.$applyAsync(function () {
+        scope['aDrawFeatures'] = this_.mobileDrawTmpPoints_;
+        scope['mobileDrawUndoHistory'] = this_.mobileDrawUndoHistory_;
+        scope['mobileDrawRedoHistory'] = this_.mobileDrawRedoHistory_;
+    });
+};
+
+/**
+ * @param {array} aPoints
+ * @private
+ */
+nsVmap.Map.prototype.createTmpDrawGeom_ = function (aPoints) {
+    oVmap.log('nsVmap.Map.prototype.createTmpDrawGeom_');
+
+    var oGeom = null;
+    if (aPoints.length === 1) {
+        oGeom = new ol.geom.Point(aPoints[0]);
+    } else if (aPoints.length > 1) {
+        oGeom = this.getDrawOutput_(aPoints);
+    }
+    return oGeom;
+};
+
+/**
+ * Get the olGeom drawed
+ * @param {array} aPoints
+ * @returns {ol.geom.Point|ol.geom.Polygon|ol.geom.LineString|ol.geom.Circle}
+ * @private
+ */
+nsVmap.Map.prototype.getDrawOutput_ = function (aPoints) {
+    oVmap.log('nsVmap.Map.prototype.getDrawOutput_');
+
+    switch (this.mobileDrawType_) {
+        case 'POINT':
+            return new ol.geom.Point(aPoints[0]);
+            break;
+        case 'LINESTRING':
+            return new ol.geom.LineString(aPoints);
+            break;
+        case 'POLYGON':
+
+            // Ajoute la même coord à la fin de la géométrie de manière à boucler le polygone
+            var aTmpPoints = angular.copy(aPoints);
+            aTmpPoints.push(aTmpPoints[0]);
+
+            return new ol.geom.Polygon([aTmpPoints]);
+            break;
+        case 'CIRCLE':
+            if (aPoints.length !== 2) {
+                return null;
+            } else {
+                var radius = new ol.geom.LineString(aPoints).getLength();
+                return new ol.geom.Circle(aPoints[0], radius);
+            }
+            break;
+        default:
+            break;
+    }
+};
+
+/**
+ * Display the tmp feature
+ * @private
+ */
+nsVmap.Map.prototype.displayDrawTmpFeature_ = function () {
+    oVmap.log('nsVmap.Map.prototype.displayDrawTmpFeature_');
+
+    // Supprime l'ancienne feature
+    if (goog.isDefAndNotNull(this.mobileDrawTmpFeature_)) {
+        this.oOpenLayersMobileDrawOverlay_.getSource().removeFeature(this.mobileDrawTmpFeature_);
+        this.mobileDrawTmpFeature_ = null;
+    }
+
+    // Affiche la géométrie
+    this.mobileDrawTmpFeature_ = new ol.Feature({
+        geometry: this.createTmpDrawGeom_(this.mobileDrawTmpPoints_)
+    });
+    this.oOpenLayersMobileDrawOverlay_.getSource().addFeature(this.mobileDrawTmpFeature_);
+};
+
+/**
+ * Ends the draw interaction and call the callback
+ * @export
+ */
+nsVmap.Map.prototype.finishMobileDraw = function () {
+    oVmap.log('nsVmap.Map.prototype.finishMobileDraw');
+
+    // Géométrie multiple ?
+    var this_ = this;
+    if (this.mobileDrawMulti_) {
+        bootbox['dialog']({
+            'message': "<h4>Valider la géométrie ?</h4>",
+            'buttons': {
+                'cancel': {
+                    'label': 'Non, annuler la saisie',
+                    'className': 'btn-danger width-100 margin-10',
+                    'callback': function () {
+                        this_.endMobileDraw();
+                    }
+                },
+                'addPart': {
+                    'label': 'Ajouter une autre partie',
+                    'className': 'btn-primary width-100 margin-10',
+                    'callback': function () {
+
+                        // Récupère la feature dessinée
+                        var drawedFeature = new ol.Feature({
+                            geometry: this_.createTmpDrawGeom_(this_.mobileDrawTmpPoints_)
+                        });
+                        this_.mobileDrawOutputFeatures_.push(drawedFeature);
+
+                        this_.mobileDrawTmpPoints_ = [];
+                        this_.mobileDrawUndoHistory_ = [];
+                        this_.mobileDrawRedoHistory_ = [];
+                        this_.mobileDrawTmpFeature_ = null;
+                    }
+                },
+                'confirm': {
+                    'label': 'Oui, terminer',
+                    'className': 'btn-success width-100 margin-10',
+                    'callback': function () {
+
+                        // Récupère la feature dessinée
+                        var drawedFeature = new ol.Feature({
+                            geometry: this_.createTmpDrawGeom_(this_.mobileDrawTmpPoints_)
+                        });
+                        this_.mobileDrawOutputFeatures_.push(drawedFeature);
+
+                        // Ferme l'outil d'insertion
+                        this_.endMobileDraw();
+
+                        // Retourne les géométries dans un tableau
+                        if (goog.isDefAndNotNull(this_.mobileDrawCallback_)) {
+                            this_.mobileDrawCallback_.call(this_, this_.mobileDrawOutputFeatures_);
+                        }
+                    }
+                }
+            }
+        });
+    } else {
+        var drawedFeature = this.endMobileDraw();
+        if (goog.isDefAndNotNull(this.mobileDrawCallback_)) {
+            this.mobileDrawCallback_.call(this, drawedFeature);
+        }
+    }
+
+};
+
+/**
+ * Cancel the draw interface
+ * @export
+ */
+nsVmap.Map.prototype.cancelMobileDraw = function () {
+    oVmap.log('nsVmap.Map.prototype.cancelMobileDraw');
+
+    this.endMobileDraw();
+};
+
+/**
+ * End with the mobile draw and return the feature drawed
+ * @returns {ol.Feature}
+ * @export
+ */
+nsVmap.Map.prototype.endMobileDraw = function () {
+    oVmap.log('nsVmap.Map.prototype.endMobileDraw');
+
+    // Récupère la feature dessinée
+    var drawedFeature = new ol.Feature({
+        geometry: this.createTmpDrawGeom_(this.mobileDrawTmpPoints_)
+    });
+
+    // Cache le menu
+    $('#mobile-draw-menu').addClass('hidden');
+
+    // Supprime l'ancienne feature
+    if (goog.isDefAndNotNull(this.mobileDrawTmpFeature_)) {
+        this.oOpenLayersMobileDrawOverlay_.getSource().clear();
+        this.mobileDrawTmpFeature_ = null;
+    }
+
+    return drawedFeature;
+};
+
+/**
+ * Get if the feature is complete or not
+ * @returns {Boolean}
+ * @export
+ */
+nsVmap.Map.prototype.isDrawFeatureComplete = function () {
+
+    var isComplete = false;
+    if (goog.isArray(this.mobileDrawTmpPoints_)) {
+        if (this.mobileDrawType_ === 'POINT') {
+            if (this.mobileDrawTmpPoints_.length > 0) {
+                isComplete = true;
+            }
+        } else {
+            if (this.mobileDrawTmpPoints_.length > 1) {
+                isComplete = true;
+            }
+        }
+    }
+    return isComplete;
+};
+
+/**
+ * Undo the last change
+ * @export
+ */
+nsVmap.Map.prototype.undoLastChange = function () {
+    oVmap.log('nsVmap.Map.prototype.undoLastChange');
+
+    if (this.mobileDrawUndoHistory_.length >= 2) {
+        this.mobileDrawRedoHistory_.push(angular.copy(this.mobileDrawTmpPoints_));
+        this.mobileDrawTmpPoints_ = angular.copy(this.mobileDrawUndoHistory_[this.mobileDrawUndoHistory_.length - 2]);
+        this.mobileDrawUndoHistory_.pop();
+        this.renderDrawTmpFeature_();
+    }
+};
+
+/**
+ * Redo the last undo change
+ * @export
+ */
+nsVmap.Map.prototype.redoLastChange = function () {
+    oVmap.log('nsVmap.Map.prototype.redoLastChange');
+
+    if (this.mobileDrawRedoHistory_.length >= 1) {
+        this.mobileDrawTmpPoints_ = angular.copy(this.mobileDrawRedoHistory_[this.mobileDrawRedoHistory_.length - 1]);
+        this.mobileDrawRedoHistory_.pop();
+        this.renderDrawTmpFeature_();
+    }
+};
+
+/**
+ *
+ * @private
+ */
+nsVmap.Map.prototype.getMapMenuScope = function () {
+    return angular.element($('#mobile-draw-menu')).scope();
+};
+
+/**
+ * Start the mobile editing feature procedure
+ * @param {ol.Feature} olFeature
+ * @param {function} callback
+ * @export
+ */
+nsVmap.Map.prototype.startMobileGeomEdition = function (olFeature, callback) {
+    oVmap.log('nsVmap.Map.prototype.startMobileGeomEdition');
+
+    var this_ = this;
+
+    if (!goog.isDefAndNotNull(olFeature)) {
+        return null;
+    }
+    if (!olFeature instanceof ol.Feature) {
+        return null;
+    }
+
+    if (goog.isDefAndNotNull(callback)) {
+        this.mobileGeomEditCallback_ = callback;
+    }
+
+    // Affiche le menu
+    $('#mobile-geom-edit-menu').removeClass('hidden');
+
+    this.mobileGeomEditTmpFeature_ = olFeature;
+
+    // Ajoute la feature dans this.oOpenLayersMobileGeomEditOverlay_
+    this.oOpenLayersMobileGeomEditOverlay_.getSource().addFeature(olFeature);
+
+    // Met l'édition en étape 1
+    var scope = this.getMapMenuScope()['$parent'];
+    scope.$applyAsync(function () {
+        scope['edit_state'] = 1;
+    });
+
+
+    this.setInteraction(this.mobileGeomEditModify_, 'map-mobile-geom-edit-modify');
+    this.mobileGeomEditModify_.trackVertex(this_.getGeomEditionModifyTargetPixel(), this_.oOpenLayersMap_);
+};
+
+/**
+ * Get the MobileModify object
+ * @returns {ol.interaction.MobileModify}
+ * @private
+ */
+nsVmap.Map.prototype.getGeomEditionModifyInteraction_ = function () {
+    oVmap.log('nsVmap.Map.prototype.getGeomEditionModifyInteraction_');
+
+    var oMobileModify = new ol.interaction.MobileModify({
+        pixelTolerance: 100,
+        hangingTolerance: 10,
+        features: this.oOpenLayersMobileGeomEditOverlayFeatures_
+    });
+
+    return oMobileModify;
+};
+
+/**
+ * Validate the vertex to work in
+ * @export
+ */
+nsVmap.Map.prototype.validateGeomEditionModifyVertex = function () {
+    oVmap.log('nsVmap.Map.prototype.validateGeomEditionModifyVertex');
+
+    this.mobileGeomEditModify_.validateVertex(this.getGeomEditionModifyTargetPixel(), this.oOpenLayersMap_);
+
+    // Met l'édition en étape 2
+    var scope = this.getMapMenuScope()['$parent'];
+    scope.$applyAsync(function () {
+        scope['edit_state'] = 2;
+    });
+};
+
+/**
+ * Validate the modification
+ * @export
+ */
+nsVmap.Map.prototype.validateGeomEditionModifyGeometry = function () {
+    oVmap.log('nsVmap.Map.prototype.validateGeomEditionModifyGeometry');
+
+    this.mobileGeomEditModify_.validateGeometry(this.getGeomEditionModifyTargetPixel(), this.oOpenLayersMap_);
+
+    // Met l'édition en étape 1
+    var scope = this.getMapMenuScope()['$parent'];
+    scope.$applyAsync(function () {
+        scope['edit_state'] = 1;
+    });
+};
+
+/**
+ * Cancel the edition
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.cancelMobileGeomEdition = function () {
+    oVmap.log('nsVmap.Map.prototype.cancelMobileGeomEdition');
+
+    this.endMobileGeomEdition_();
+};
+
+/**
+ * Finish the edition and call the callback
+ * @export
+ */
+nsVmap.Map.prototype.finishMobileGeomEdition = function () {
+    oVmap.log('nsVmap.Map.prototype.finishMobileGeomEdition');
+
+    this.mobileGeomEditCallback_.call(this, this.mobileGeomEditTmpFeature_);
+
+    this.endMobileGeomEdition_();
+};
+
+/**
+ * Ends the edition
+ * @private
+ */
+nsVmap.Map.prototype.endMobileGeomEdition_ = function () {
+    oVmap.log('nsVmap.Map.prototype.endMobileGeomEdition_');
+
+    // Cache le menu
+    $('#mobile-geom-edit-menu').addClass('hidden');
+
+    // Supprime l'ancienne feature
+    this.oOpenLayersMobileGeomEditOverlay_.getSource().clear();
+
+    // Désactive l'interraction
+    this.removeActionsOnMap();
+};
+
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * App-specific directive wrapping the ngeo map directive. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.Map.prototype.mapDirective = function () {
+    oVmap.log("nsVmap.Map.prototype.mapDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'proj': '=appProj',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppMapController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        template: '<div id="olMap"></div><div app-map-menu app-map="ctrl.map"></div>'
+    };
+};
+
+/**
+ * App-specific directive wrapping the ngeo map directive. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.Map.prototype.mapMenuDirective = function () {
+    oVmap.log("nsVmap.Map.prototype.mapMenuDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap'
+        },
+        controller: 'AppMapMenuController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/map/map.html'
+    };
+};
+
+/**
+ * The application's main controller.
+ * @ngInject
+ * @constructor
+ */
+nsVmap.Map.prototype.mapController = function ($scope, $window, $element) {
+    oVmap.log("nsVmap.Map.prototype.mapController");
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @type {object}
+     */
+    this.element = $element;
+
+    /**
+     * Animation duration
+     * @type Number
+     * @private
+     */
+    this.duration = 1000;
+
+    /**
+     * @type {ol.Map}
+     * @private
+     */
+    this.map = this['map'];
+
+    /**
+     * @type string
+     * @private
+     */
+    this.proj = this['proj'];
+
+    /**
+     * Contains the tileloaderror and imageloaderror events
+     * @private
+     */
+    this.loadErrorEventsContainer_ = [];
+
+    this.map.setTarget('olMap');
+
+    /**
+     * Update the map size with animation
+     * @type goog.async.AnimationDelay
+     */
+    this.animationDelay = new goog.async.AnimationDelay(
+            function () {
+                this_.map.updateSize();
+                this_.map.renderSync();
+                if (goog.now() - start < this_.duration) {
+                    this_.animationDelay.start();
+                }
+            }, $window);
+
+    /**
+     * Watch for resizing
+     */
+    $scope.$watchCollection(function () {
+        return [this_.element.children()[0]['clientWidth'], this_.element.children()[0]['clientHeight']];
+    }, function () {
+        this_.startAnimation();
+    });
+
+    // Initialise vmapTooltip_
+    oVmap.getMap().initMapTooltip();
+
+    // évènement lorsque les couches ont changés (avec timeout en cas de changement rapide de plusieurs couches)
+    var iChangedLayers = 0;
+    this['map'].getLayers().on('change:length', function () {
+        iChangedLayers++;
+        var tmpChangedLayers = angular.copy(iChangedLayers);
+        setTimeout(function () {
+            if (iChangedLayers === tmpChangedLayers) {
+                oVmap['scope'].$broadcast('layersChanged');
+            }
+        }, 200);
+    });
+
+    var bCounter = 0;
+    oVmap['scope'].$on('layersChanged', function () {
+        var changeVisibleFunction = function () {
+            bCounter++;
+            var tempCounter = angular.copy(bCounter);
+            setTimeout(function () {
+                if (bCounter === tempCounter) {
+                    oVmap['scope'].$broadcast('layersChanged');
+                }
+            }, 200);
+        };
+        var aLayers = this_['map'].getLayers().getArray();
+        for (var i = 0; i < aLayers.length; i++) {
+            aLayers[i].on('change:visible', changeVisibleFunction, this_);
+        }
+    });
+
+    oVmap['scope'].$on('layersChanged', function () {
+        oVmap.log('oVmap event: layersChanged');
+        this_.emptyLoadErrorsEvents();
+        this_.listenLoadErrors();
+    });
+
+    // Vide selectionOverlay, locationOverlay quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        oVmap.getMap().getSelectionOverlay().getSource().clear();
+        oVmap.getMap().getLocationOverlay().getSource().clear();
+    });
+};
+
+/**
+ * The application's main controller.
+ * @ngInject
+ * @constructor
+ */
+nsVmap.Map.prototype.mapMenuController = function ($scope, $window, $element) {
+    oVmap.log("nsVmap.Map.prototype.mapMenuController");
+
+
+};
+
+// Définit les directives et controlleurs
+oVmap.module.directive('appMap', nsVmap.Map.prototype.mapDirective);
+oVmap.module.directive('appMapMenu', nsVmap.Map.prototype.mapMenuDirective);
+oVmap.module.controller('AppMapController', nsVmap.Map.prototype.mapController);
+oVmap.module.controller('AppMapMenuController', nsVmap.Map.prototype.mapMenuController);
+
+/**
+ * Empty the events created by listenLoadErrors()
+ */
+nsVmap.Map.prototype.mapController.prototype.emptyLoadErrorsEvents = function () {
+    oVmap.log('nsVmap.Map.prototype.emptyLoadErrorsEvents');
+
+    for (var i = 0; i < this.loadErrorEventsContainer_.length; i++) {
+        ol.Observable.unByKey(this.loadErrorEventsContainer_[i].event);
+    }
+};
+
+/**
+ * Listen the layers load errors
+ */
+nsVmap.Map.prototype.mapController.prototype.listenLoadErrors = function () {
+    oVmap.log('nsVmap.Map.prototype.listenLoadErrors');
+
+    var this_ = this;
+    var oLayers = this['map'].getLayers();
+
+    oLayers.forEach(function (olLayer) {
+
+        if (olLayer.getSource() instanceof ol.source.TileWMS) {
+
+            this_.loadErrorEventsContainer_.push({
+                event: olLayer.getSource().on('tileloaderror', function (event) {
+                    if (goog.isDefAndNotNull(event['tile'])) {
+                        if (goog.isDefAndNotNull(event['tile'].src_)) {
+                            this_.displayLoadErrors(event['tile'].src_);
+                        } else
+                            console.error('tileloaderror: ', event['tile']);
+                    } else
+                        console.error('tileloaderror: ', event);
+                }),
+                layer: olLayer
+            });
+
+        } else if (olLayer.getSource() instanceof ol.source.ImageWMS) {
+
+            this_.loadErrorEventsContainer_.push({
+                event: olLayer.getSource().on('imageloaderror', function (event) {
+                    if (goog.isDefAndNotNull(event['image'])) {
+                        if (goog.isDefAndNotNull(event['image'].src_)) {
+                            this_.displayLoadErrors(event['image'].src_);
+                        } else
+                            console.error('imageloaderror: ', event['image']);
+                    } else
+                        console.error('imageloaderror: ', event);
+                }),
+                layer: olLayer
+            });
+
+        }
+
+    });
+};
+
+/**
+ * Display the link errors on the console
+ * @param {string} sSrc url from the error
+ */
+nsVmap.Map.prototype.mapController.prototype.displayLoadErrors = function (sSrc) {
+    oVmap.log('nsVmap.Map.prototype.mapController.prototype.displayLoadErrors');
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': sSrc,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'ajaxLoader': false,
+        'scope': this.$scope_,
+        'success': function (response) {
+            var error = jQuery.parseXML(response['data']);
+            if (goog.isDefAndNotNull(error)) {
+                console.error('Layer server error: ', error);
+            } else {
+                if (goog.isDefAndNotNull(response['data']) && response['data'] !== "") {
+                    console.error('Layer server error: ', response['data']);
+                } else {
+                    console.error('Layer server error: ', response);
+                }
+            }
+        }
+    });
+};
+
+/**
+ * Update the map size with animation
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.prototype.mapController.prototype.startAnimation = function () {
+    oVmap.log('nsVmap.Map.prototype.mapController.prototype.startAnimation');
+    start = goog.now();
+    this.animationDelay.stop();
+    this.animationDelay.start();
+};
+
+/********************************************
+ *           INTERFACE MOBILE
+ *******************************************/
+
+/**
+ * Add a draw point
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.addMobileDrawPoint = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.addMobileDrawPoint');
+
+    oVmap.getMap().addMobileDrawPoint_(this.getInsertTargetPosition_());
+};
+
+/**
+ * Get the insert target coordinates
+ * @returns {ol.Coordinate|ol.Pixel}
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.getInsertTargetPosition_ = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.getInsertTargetPosition_');
+
+    var targetPixel = oVmap.getMap().getMobileDrawTargetPixel();
+    var aCoords = oVmap.getMap().getOLMap().getCoordinateFromPixel(targetPixel);
+
+    return aCoords;
+};
+
+/**
+ * Get the insert target coordinates
+ * @returns {ol.Coordinate|ol.Pixel}
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.getEditTargetPosition_ = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.getEditTargetPosition_');
+
+    var targetPixel = oVmap.getMap().getGeomEditionModifyTargetPixel();
+    var aCoords = oVmap.getMap().getOLMap().getCoordinateFromPixel(targetPixel);
+
+    return aCoords;
+};
+
+/**
+ * End the draw interaction
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.finishMobileDraw = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.finishMobileDraw');
+    return oVmap.getMap().finishMobileDraw();
+};
+
+/**
+ * Cancel the draw interaction
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.cancelMobileDraw = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.cancelMobileDraw');
+    return oVmap.getMap().cancelMobileDraw();
+};
+
+/**
+ * Get if the feature is complete
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.isDrawFeatureComplete = function () {
+    return oVmap.getMap().isDrawFeatureComplete();
+};
+
+/**
+ * Center the map on the GPS position
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.geolocateMe = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.geolocateMe');
+
+    var this_ = this;
+    var aGPSPosition = oVmap.getMap().getGPSPosition(oVmap.getMap().getOLMap().getView().getProjection());
+    if (goog.isDefAndNotNull(aGPSPosition)) {
+
+        oVmap.getMap().getOLMap().getView().setCenter(aGPSPosition);
+
+        // Le centre de la carte n'est pas le centre de la cible (symbolisée par une croix dans l'interface d'insertion),
+        // Il faut donc adapter le centre de la carte
+        setTimeout(function () {
+            var aInsertTargetPosition = this_.getInsertTargetPosition_();
+            if (goog.isDefAndNotNull(aGPSPosition) && goog.isDefAndNotNull(aInsertTargetPosition)) {
+                var x1 = aGPSPosition[0];
+                var y1 = aGPSPosition[1];
+                var x2 = aInsertTargetPosition[0];
+                var y2 = aInsertTargetPosition[1];
+
+                // Ajoute la différence pour centrer sur la croix
+                oVmap.getMap().getOLMap().getView().setCenter([x1 + (x1 - x2), y1 + (y1 - y2)]);
+            }
+        });
+    }
+};
+
+/**
+ * Undo the last change
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.undoLastChange = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.undoLastChange');
+    return oVmap.getMap().undoLastChange();
+};
+
+/**
+ * Redo the last change
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.redoLastChange = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.redoLastChange');
+    return oVmap.getMap().redoLastChange();
+};
+
+/**
+ * Validate the vertex to modify
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.validateGeomEditionModifyVertex = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.validateGeomEditionModifyVertex');
+    return oVmap.getMap().validateGeomEditionModifyVertex();
+};
+
+/**
+ * Validate the vertex to modify
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.validateGeomEditionModifyGeometry = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.validateGeomEditionModifyGeometry');
+    return oVmap.getMap().validateGeomEditionModifyGeometry();
+};
+
+/**
+ * Cancel the geom edition interface
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.cancelMobileGeomEdition = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.cancelMobileGeomEdition');
+    return oVmap.getMap().cancelMobileGeomEdition();
+};
+
+/**
+ * Finish the geom edition
+ * @export
+ */
+nsVmap.Map.prototype.mapMenuController.prototype.finishMobileGeomEdition = function () {
+    oVmap.log('nsVmap.Map.prototype.mapMenuController.prototype.finishMobileGeomEdition');
+    return oVmap.getMap().finishMobileGeomEdition();
+};
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+/**
+ * nsVmap.Map.olLayers_ getter
+ * @return {Array.<ol.layer>} Layers array
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getOpenLayersLayers = function () {
+    return this.oOpenLayersMap_.getLayers();
+};
+
+/**
+ * nsVmap.Map.olLayers_ setter
+ * @param {Array.<ol.layer.Base>} layers Layers array
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.setOpenLayersLayers = function (layers) {
+    this.olLayers_ = layers;
+    this.oOpenLayersMap_.setLayerGroup(layers);
+};
+
+/**
+ * nsVmap.Map.olView_ getter
+ * @return {ol.View} Used view
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getOpenLayersView = function () {
+    return this.oOpenLayersMap_.getView();
+};
+
+/**
+ * nsVmap.Map.olView_ setter
+ * @param {ol.View} view View to use
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.setOpenLayersView = function (view) {
+    this.olView_ = view;
+    this.oOpenLayersMap_.setView(this.olView_);
+};
+
+/**
+ * nsVmap.Map.oOpenLayersMap_ getter
+ * @return {ol.map} Used map
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getOLMap = function () {
+    return this.oOpenLayersMap_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersMap_ setter
+ * @param {ol.Map} map Map to use
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.setOpenLayersMap = function (map) {
+    this.oOpenLayersMap_ = map;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersSelectionOverlay_ getter
+ * @return {ol.layer.Vector} Selection overlay
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getSelectionOverlay = function () {
+    return this.oOpenLayersSelectionOverlay_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersSelectionOverlayFeatures_ getter
+ * @return {ol.Collection<ol.Feature>} Selection overlay features
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getSelectionOverlayFeatures = function () {
+    return this.oOpenLayersSelectionOverlayFeatures_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersLocationOverlay_ getter
+ * @return {ol.layer.Vector} Location overlay
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getLocationOverlay = function () {
+    return this.oOpenLayersLocationOverlay_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersLocationOverlay_ source getter
+ * @return {ol.source.Vector} Location overlay vector source
+ * @export
+ = */
+nsVmap.Map.prototype.getLocationOverlaySource = function () {
+    return this.oOpenLayersLocationOverlay_.getSource();
+};
+
+/**
+ * nsVmap.Map.oOpenLayersLocationOverlayFeatures_ getter
+ * @return {ol.Collection<ol.Feature>} Location overlay features
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getLocationOverlayFeatures = function () {
+    return this.oOpenLayersLocationOverlayFeatures_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersPopupOverlay_ getter
+ * @return {ol.layer.Vector} Popup overlay
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getPopupOverlay = function () {
+    return this.oOpenLayersPopupOverlay_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersPopupOverlay_ source getter
+ * @return {ol.source.Vector} Popup overlay vector source
+ * @export
+ = */
+nsVmap.Map.prototype.getPopupOverlaySource = function () {
+    return this.oOpenLayersPopupOverlay_.getSource();
+};
+
+/**
+ * nsVmap.Map.oOpenLayersPopupOverlayFeatures_ getter
+ * @return {ol.Collection<ol.Feature>} Popup overlay features
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getPopupOverlayFeatures = function () {
+    return this.oOpenLayersPopupOverlayFeatures_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersSelectionStyle_ getter
+ * @return {ol.style.Style} Selection overlay
+ * @export
+ * @api experimental
+ */
+nsVmap.Map.prototype.getSelectionStyle = function () {
+    return this.oOpenLayersSelectionStyle_;
+};
+
+/**
+ * nsVmap.Map.oOpenLayersSelectionStyle_ setter
+ * @param {ol.style.Style} style FeatureOverlay Selection overlay
+ * @export
+ * @api unstable
+ */
+nsVmap.Map.prototype.setSelectionStyle = function (style) {
+    this.oOpenLayersSelectionStyle_ = style;
+};
+
+/**
+ * vmapTooltip_ getter
+ * @returns {nsVmap.Map.MapTooltip}
+ */
+nsVmap.Map.prototype.getMapTooltip = function () {
+    return this.vmapTooltip_;
+};
+
+/**
+ * currentAction getter
+ * @returns {string} currentAction
+ * @export
+ */
+nsVmap.Map.prototype.getCurrentAction = function () {
+    return angular.element($('#map1')).scope()['ctrl']['currentAction'];
+};
+
+/**
+ * currentAction setter
+ * @param {string} currentAction
+ * @export
+ */
+nsVmap.Map.prototype.setCurrentAction = function (currentAction) {
+    var scope = angular.element($("#map1")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl']['currentAction'] = currentAction;
+    });
+};
+
+/**
+ * vmapTextOverlay_ getter
+ * @returns {ol.layer.Vector}
+ * @export
+ */
+nsVmap.Map.prototype.getTextOverlay = function () {
+    return this.vmapTextOverlay_;
+};
+
+/**
+ * vmapTextOverlayFeatures_ getter
+ * @returns {nsVmap.Map.vmapTextOverlayFeatures__}
+ * @export
+ */
+nsVmap.Map.prototype.getTextOverlayFeatures = function () {
+    return this.vmapTextOverlayFeatures_;
+};
+
+/**
+ * layersToTransform_ getter
+ * @returns {nsVmap.Map.layersToTransform_}
+ * @export
+ */
+nsVmap.Map.prototype.getLayersToTransform = function () {
+    return this.layersToTransform_;
+};
+
+/**
+ * Get the layers by layer_id
+ * @param {string} layerId
+ * @returns {ol.layer.Base}
+ * @export
+ */
+nsVmap.Map.prototype.getLayerById = function (layerId) {
+
+    var aLayers = this.oOpenLayersMap_.getLayers().getArray();
+
+    for (var i = 0; i < aLayers.length; i++) {
+        if (aLayers[i].get('layer_id') === layerId)
+            return aLayers[i];
+    }
+
+    // Si aucun layer ne correspondait
+    return null;
+};
diff --git a/module/javascript/app/vmap/map/mappopup.js b/module/javascript/app/vmap/map/mappopup.js
new file mode 100755
index 0000000000000000000000000000000000000000..1bbb08b5ce7222f2f29884f890c4fc031d2d15f9
--- /dev/null
+++ b/module/javascript/app/vmap/map/mappopup.js
@@ -0,0 +1,531 @@
+/* global nsVmap, ol, oVmap, goog, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.Map
+ * cette classe permet l'initialisation de la carte
+ */
+
+goog.provide('nsVmap.Map.MapPopup');
+goog.require('ol.Overlay');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.Map.MapPopup}: A tooltip on the map
+ *
+ * @param {ol.Feature} olFeature Feature to bind with the popup
+ * @param {ol.geom.Point|undefined} olPoint point where to put the popup
+ * @constructor
+ * @export
+ */
+nsVmap.Map.MapPopup = function (olFeature, olPoint) {
+    oVmap.log('nsVmap.Map.MapPopup');
+
+    /**
+     * @type nsVmap.Map.MapPopup
+     * @private
+     */
+    var this_ = this;
+
+    /**
+     * @type ol.Feature
+     * @private
+     */
+    this.olFeature_ = olFeature;
+
+    /**
+     * @type ol.Map
+     * @private
+     */
+    this.map_ = oVmap.getMap().getOLMap();
+
+    /**
+     * @type ol.proj
+     * @private
+     */
+    this.projection_ = this.map_.getView().getProjection().getCode();
+
+    /**
+     * Actions to add to the popup
+     */
+    this.actions = [];
+
+    /**
+     * Style à utiliser
+     */
+    this.oStyle = {};
+
+    // Ajoute la feature sur la carte
+    if (!goog.array.contains(oVmap.getMap().getPopupOverlaySource().getFeatures(), olFeature))
+        oVmap.getMap().getPopupOverlaySource().addFeature(olFeature);
+
+    // Création du HTML relatif
+    this.HTML_ = document.createElement('div');
+    this.HTML_.className = 'ol-popup';
+//    this.HTML_.draggable = 'true';
+
+    this.HTMLContainer_ = document.createElement('div');
+    this.HTML_.appendChild(this.HTMLContainer_);
+
+    this.HTMLButtonsContainer_ = document.createElement('div');
+    this.HTMLButtonsContainer_.className = 'ol-popup-buttons-container';
+    this.HTMLContainer_.appendChild(this.HTMLButtonsContainer_);
+
+    // Ajoute le style défini en properties
+    if (goog.isDefAndNotNull(oVmap['properties']['popup'])) {
+        if (goog.isDefAndNotNull(oVmap['properties']['popup']['style'])) {
+            if (goog.isString(oVmap['properties']['popup']['style'])) {
+
+                // Style définit en properties en enlevant les "\n"
+                var sStyle = oVmap['properties']['popup']['style'].replace(/<return>/g, '');
+                var aStyle1 = sStyle.split(';');
+
+                for (var i = 0; i < aStyle1.length; i++) {
+                    var aStyle2 = aStyle1[i].split(':');
+                    if (goog.isDefAndNotNull(aStyle2[0]) && goog.isDefAndNotNull(aStyle2[1])) {
+                        this.oStyle[aStyle2[0]] = aStyle2[1];
+                    }
+                    delete aStyle2;
+                }
+                for (var key in this.oStyle) {
+                    this.HTML_.style[key] = this.oStyle[key];
+                }
+            }
+        }
+    }
+
+    // Bouton close
+    this.HTMLCloser_ = document.createElement('a');
+    this.HTMLCloser_.href = '#';
+    this.HTMLCloser_.className = 'ol-popup-closer';
+    this.HTMLButtonsContainer_.appendChild(this.HTMLCloser_);
+
+    this.HTMLContent_ = document.createElement('div');
+    this.HTMLContent_.classList.add('popup-content');
+    this.HTMLContainer_.appendChild(this.HTMLContent_);
+
+
+    /**
+     * Add a click handler to hide the popup.
+     * @return {boolean} Don't follow the href.
+     */
+    this.HTMLCloser_.onclick = function () {
+        this_.remove();
+        return false;
+    };
+
+    if (oVmap['properties']['is_mobile']) {
+        $('#mobile-popup-bar').removeClass('hidden');
+        $('#mobile-popup-bar').append(this.HTML_.children);
+    } else {
+
+        /**
+         * @type {ol.Overlay}
+         * @private
+         */
+        this.popupOverlay_ = new ol.Overlay(({
+            element: this.HTML_,
+            autoPan: true,
+            position: goog.isDefAndNotNull(olPoint) ? this.getGeometryCenter(olPoint) : this.getGeometryCenter(olFeature.getGeometry()),
+            autoPanAnimation: {
+                duration: 250
+            }
+        }));
+
+        /**
+         * Put the current element upon of the others
+         */
+        this.HTML_.onclick = function () {
+
+            var map = oVmap.getMap().getOLMap();
+            var aOverlays = map.getOverlays().getArray();
+
+            // Met tous z-index à 10
+            for (var i = 0; i < aOverlays.length; i++) {
+                if ($(aOverlays[i].getElement()).hasClass('ol-popup')) {
+                    $(aOverlays[i].getElement()).css('z-index', 10);
+                }
+            }
+
+            // Met le z-index de l'élément clické à 11
+            $(this_.HTML_).css('z-index', 11);
+        };
+
+//        // Déplacement drag de la popup
+//        var positionEnd = [0, 0];
+//        var pixelStart = [0, 0];
+//        var diffX = 0;
+//        var diffY = 0;
+//
+//        function drag_start(event) {
+//            pixelStart = this_.map_.getPixelFromCoordinate(this_.popupOverlay_.getPosition());
+//            var posX = event.clientX;
+//            var posY = event.clientY;
+//            diffX = posX - pixelStart[0];
+//            diffY = posY - pixelStart[1];
+//            return false;
+//        }
+//        function drag(event) {
+//            var posX = event.clientX;
+//            var posY = event.clientY;
+//            if (posX === 0 || posY === 0)
+//                return false;
+//            positionEnd = this_.map_.getCoordinateFromPixel([posX - diffX, posY - diffY]);
+//            this_.popupOverlay_.setPosition(positionEnd);
+//            return false;
+//        }
+//        this_.HTMLContainer_.addEventListener('dragstart', drag_start, false);
+//        this_.HTMLContainer_.addEventListener('drag', drag, false);
+
+        this.map_.addOverlay(this.popupOverlay_);
+
+        // Change de coordonnées lorsqu'on change de projection
+        this.map_.on('change:view', function () {
+
+            var oldProj = this.projection_;
+            var oldCoord = this.popupOverlay_.getPosition();
+
+            if (!goog.isDef(oldCoord))
+                return 0;
+            if (!goog.isDef(oldProj))
+                return 0;
+
+            var newProj = this.map_.getView().getProjection().getCode();
+            var newCoord = ol.proj.transform(oldCoord, oldProj, newProj);
+
+            this.popupOverlay_.setPosition(newCoord);
+            this.projection_ = newProj;
+
+        }, this);
+    }
+};
+
+/**
+ * Display a message
+ * @param {string} message
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.displayMessage = function (message) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.displayMessage');
+    this.removeMessages();
+    this.addMessage(message);
+};
+
+/**
+ * Display a table on the popup according to the object
+ * @param {object} data data to display
+ * @returns {Boolean}
+ */
+nsVmap.Map.MapPopup.prototype.displayMessageTable = function (data) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.displayMessage');
+    this.removeMessages();
+    this.addMessageTable(data);
+};
+
+/**
+ * Add a message
+ * @param {string} message
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.addMessage = function (message) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.displayMessage');
+
+    if (!goog.isDef(message)) {
+        console.error('MapPopup: message not defined');
+        return 0;
+    }
+
+    this.HTMLContent_.innerHTML = message;
+    return true;
+};
+
+/**
+ * 
+ * @param {string} photoURL
+ * @returns {Number|Boolean}
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.addPhoto = function (photoURL) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.addPhoto');
+
+    if (!goog.isDef(photoURL)) {
+        console.error('MapPopup: addPhoto not defined');
+        return 0;
+    }
+
+    var this_ = this;
+
+    var img = document.createElement("img");
+    img.style.width = '100px';
+    img.src = photoURL;
+
+    if (!goog.isDefAndNotNull(this.oStyle['min-width']) || $(this_.HTML_).css('min-width') === '0px') {
+        $(this_.HTML_).css('min-width', '300px');
+    }
+
+    if (!goog.isDef(this.HTMLImageContainer_)) {
+
+        this.HTMLImageContainer_ = document.createElement("div");
+        this.HTMLImageContainer_.classList.add('popup-image-content');
+        this.HTMLImageContainer_.style['position'] = 'relative';
+        this.HTMLImageContainer_.style['float'] = 'right';
+        this.HTMLContent_.style['float'] = 'left';
+        this.HTMLContent_.style['width'] = 'calc(100% - 100px)';
+        this.HTMLContainer_.appendChild(this.HTMLImageContainer_);
+    }
+
+    this.HTMLImageContainer_.appendChild(img);
+
+    return true;
+};
+
+/**
+ * Add a table on the popup according to the object
+ * @param {object} data data to display
+ * @returns {Boolean}
+ */
+nsVmap.Map.MapPopup.prototype.addMessageTable = function (data) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.addMessageTable');
+
+    if (!goog.isDef(data)) {
+        console.error('MapPopup: data not defined');
+        return 0;
+    }
+
+    var HTMLMessageContainer = document.createElement('table');
+
+    var aAllowedFunctions = ['getPropertie'];
+
+    for (var item in data) {
+
+        // car feature est le mot clé utilisé pour stocker la feature dans infocontainer
+        if (item === 'feature')
+            continue;
+
+        var row = document.createElement('tr');
+
+        var column1 = document.createElement('td');
+        column1.className = 'padding-sides-5 map-popup-cell';
+        row.appendChild(column1);
+
+        var column2 = document.createElement('td');
+        column2.className = 'padding-sides-5 map-popup-cell';
+        row.appendChild(column2);
+
+        if (goog.isString(data[item])) {
+//            data[item] = data[item].replace(/</g, "&lt;").replace(/>/g, "&gt;");
+            
+            // Recherche les liens
+            if (oVmap.isLink(data[item], 'bo_link')) {
+                data[item] = oVmap.parseLink(data[item], 'bo_link');
+            }
+            
+            // Prévention d'injections XSS
+            data[item] = oVmap['$sanitize'](data[item]);
+            
+            // Recherche les fonctions autorisées
+            for (var i = 0; i < aAllowedFunctions.length; i++) {
+                if (data[item].indexOf('{{' + aAllowedFunctions[i] + '(') !== -1 && data[item].indexOf(')}}') !== -1) {
+                    data[item] = this.parseFunction_(data[item], aAllowedFunctions[i]);
+                }
+            }
+
+        }
+
+        column1.innerHTML = item;
+        column2.innerHTML = data[item];
+
+        HTMLMessageContainer.appendChild(row);
+
+        delete row;
+        delete column1;
+        delete column2;
+    }
+
+    this.HTMLContent_.appendChild(HTMLMessageContainer);
+    return true;
+};
+
+/**
+ * Parse and execute a function defines in sString
+ * @param {string} sString
+ * @returns {string}
+ */
+nsVmap.Map.MapPopup.prototype.parseFunction_ = function (sString) {
+
+    var sFunction = sString.substr(sString.indexOf('{{') + 2, sString.indexOf('}}') - sString.indexOf('{{') - 2);
+    var sResult = '';
+
+    if (sFunction.split(';').length > 1) {
+        console.error('Attention: plusieurs fonctions détectées dans ' + sString);
+    }
+
+    try {
+        // Split vérifie qu'il n'y a qu'une seule fonction à executer
+        sResult = eval('angular.element(vitisApp.appMainDrtv).scope().' + sFunction.split(';')[0]);
+    } catch (e) {
+
+    }
+
+    sString = sString.replace('{{' + sFunction + '}}', sResult);
+
+    return sString;
+};
+
+/**
+ * Add an action button on the popup
+ * @param {object} action
+ * @param {object} action.content content of the buton
+ * @param {object} action.event event onclick
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.addAction = function (action) {
+
+    if (this.actions.indexOf(action) === -1) {
+        this.actions.push(action);
+        this.compileActions();
+    }
+};
+
+/**
+ * Remove an action button from the popup
+ * @param {object} action action to remove
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.removeAction = function (action) {
+    if (this.actions.indexOf(action) !== -1) {
+        this.actions.splice(this.actions.indexOf(action), 1);
+        this.compileActions();
+    }
+};
+
+/**
+ * Compile the actions by this.actions
+ * @export
+ */
+nsVmap.Map.MapPopup.prototype.compileActions = function () {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.compileActions');
+
+    var this_ = this;
+
+    // Container
+    if (goog.isDef(this.HTMLDropup_))
+        this.HTMLButtonsContainer_.removeChild(this.HTMLDropup_);
+    this.HTMLDropup_ = document.createElement('div');
+    this.HTMLDropup_.className = 'dropup';
+    this.HTMLDropup_.style.position = 'inherit';
+
+    // Bouton dropup
+    this.HTMLList_ = document.createElement('a');
+    this.HTMLList_.href = '#';
+    this.HTMLList_.className = 'ol-popup-list icon-format_list_bulleted';
+    this.HTMLList_.addEventListener('click', function () {
+        $(this_.HTMLListUl_).toggleClass('block');
+    });
+    $('body').click(function (e) {
+        if ($(this_.HTMLList_)[0] !== $(e.target)[0])
+            $(this_.HTMLListUl_).removeClass('block');
+    });
+
+    // Liste
+    this.HTMLListUl_ = document.createElement('ul');
+    this.HTMLListUl_.style = 'right: 0;left: inherit;';
+    this.HTMLListUl_.className = 'dropdown-menu';
+
+    for (var i = 0; i < this.actions.length; i++) {
+        this.HTMLListLi_ = document.createElement('li');
+        this.HTMLListLiA_ = document.createElement('a');
+        this.HTMLListLiA_.href = '#';
+        this.HTMLListLiA_.innerHTML = this.actions[i]['content'];
+        this.HTMLListLiA_.addEventListener('click', this.actions[i]['event']);
+        this.HTMLListLiA_.addEventListener('click', function () {
+            $(this_.HTMLListUl_).removeClass('block');
+        });
+
+        this.HTMLListUl_.appendChild(this.HTMLListLi_);
+        this.HTMLListLi_.appendChild(this.HTMLListLiA_);
+    }
+
+    this.HTMLDropup_.appendChild(this.HTMLListUl_);
+    this.HTMLDropup_.appendChild(this.HTMLList_);
+    this.HTMLButtonsContainer_.appendChild(this.HTMLDropup_);
+};
+
+/**
+ * remove the content of the table
+ */
+nsVmap.Map.MapPopup.prototype.removeMessages = function () {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.removeMessages');
+    this.HTMLContent_.innerHTML = "";
+};
+
+/**
+ * Remove the popup
+ * @param {boolean|undefined} bRemoveFeature false if you dont want to remove the binded feature, default is true
+ * @return {boolean}
+ */
+nsVmap.Map.MapPopup.prototype.remove = function (bRemoveFeature) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.remove');
+
+    bRemoveFeature = goog.isDef(bRemoveFeature) ? bRemoveFeature : true;
+
+    this.HTMLCloser_.blur();
+
+    if (oVmap['properties']['is_mobile']) {
+        $('#mobile-popup-bar').empty()
+        $('#mobile-popup-bar').addClass('hidden');
+    } else {
+        this.popupOverlay_.setPosition(undefined);
+    }
+
+    // supprime la feature
+    if (goog.isDef(this.olFeature_) && bRemoveFeature !== false) {
+        if (goog.array.contains(oVmap.getMap().getPopupOverlaySource().getFeatures(), this.olFeature_))
+            oVmap.getMap().getPopupOverlaySource().removeFeature(this.olFeature_);
+    }
+
+    return true;
+};
+
+/**
+ * Get the center of the geometry
+ * @param {ol.geom} geom
+ * @returns {Number}
+ */
+nsVmap.Map.MapPopup.prototype.getGeometryCenter = function (geom) {
+    oVmap.log('nsVmap.Map.MapPopup.prototype.getGeometryCenter');
+
+    if (geom.getType() === 'Polygon') {
+        var position = geom.getInteriorPoint().getLastCoordinate();
+    } else if (geom.getType() === 'MultiPolygon') {
+
+        var aPolygons = geom.getPolygons();
+        var maxArea = 0;
+        var bigestPolygon = 0;
+
+        // Retrouve le plus gros polygone
+        for (var i = 0; i < aPolygons.length; i++) {
+            if (maxArea < aPolygons[i].getArea()) {
+                maxArea = aPolygons[i].getArea();
+                bigestPolygon = i;
+            }
+        }
+        var position = aPolygons[bigestPolygon].getInteriorPoint().getLastCoordinate();
+
+    } else if (geom.getType() === 'LineString') {
+        var centerPoint = Math.round(geom.getCoordinates().length / 2);
+        var position = geom.getCoordinates()[centerPoint];
+    } else if (geom.getType() === 'Circle') {
+        var position = geom.getCenter();
+    } else if (geom.getType() === 'Point' || geom.getType() === 'MultiPoint') {
+        var position = geom.getLastCoordinate();
+    } else if (geom.getType() === 'GeometryCollection') {
+        return 0;
+    } else {
+        return geom.getLastCoordinate();
+    }
+
+    return position;
+};
\ No newline at end of file
diff --git a/module/javascript/app/vmap/map/maptooltip.js b/module/javascript/app/vmap/map/maptooltip.js
new file mode 100755
index 0000000000000000000000000000000000000000..b8f945d3c3fa3107bb1604da9cb350858bf22cb4
--- /dev/null
+++ b/module/javascript/app/vmap/map/maptooltip.js
@@ -0,0 +1,67 @@
+/* global nsVmap, ol, oVmap, goog, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.Map
+ * cette classe permet l'initialisation de la carte
+ */
+
+goog.provide('nsVmap.Map.MapTooltip');
+goog.require('ol.Overlay');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.Map.MapTooltip}: A tooltip on the map
+ *
+ * @param {object} opt_options
+ * @param {string} opt_options.id id of the tooltip
+ * @param {string} opt_options.className class of the tooltip
+ * @constructor
+ * @export
+ */
+nsVmap.Map.MapTooltip = function (opt_options) {
+    oVmap.log('nsVmap.Map.MapTooltip');
+    // Param obligatiores
+    if (!goog.isDef(opt_options.id))
+        return 0;
+    // Params
+    this.id = opt_options.id;
+    this.className = goog.isDef(opt_options.className) ? opt_options.className : 'map-tooltip';
+    this.map = oVmap.getMap().getOLMap();
+    this.helpTooltipElement_ = document.createElement('div');
+    this.helpTooltipElement_.id = this.id;
+    this.helpTooltipElement_.className = this.className;
+    this.helpTooltipElement_.style.display = "none";
+    this.helpTooltip_ = new ol.Overlay({
+        element: this.helpTooltipElement_,
+        offset: [15, 15],
+        positioning: 'center-left'
+    });
+    this.map.addOverlay(this.helpTooltip_);
+    this.map.on('pointermove', function (evt) {
+        this.helpTooltip_.setPosition(evt.coordinate);
+    }, this);
+};
+
+/**
+ * Display the tooltip whith a message
+ * @param {string} message to display
+ * @returns {string} error
+ */
+nsVmap.Map.MapTooltip.prototype.displayMessage = function (message) {
+
+    if (!goog.isDef(message))
+        return 'message not defined';
+    this.helpTooltipElement_.innerHTML = message;
+    this.helpTooltipElement_.style.display = "block";
+    this.helpTooltip_.setPosition([0, 0]);
+};
+
+/**
+ * Hide the tooltip
+ * @returns {string} error
+ */
+nsVmap.Map.MapTooltip.prototype.hide = function () {
+
+    this.helpTooltipElement_.style.display = "none";
+};
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/layersorder.js b/module/javascript/app/vmap/mapmanager/layersorder.js
new file mode 100755
index 0000000000000000000000000000000000000000..b99b222fbdce6c75e64ec628850b5e203975b781
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/layersorder.js
@@ -0,0 +1,174 @@
+/* global goog, oVmap, nsVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.LayersOrder
+ * cette classe permet de changer l'ordre des couches
+ */
+
+goog.provide('nsVmap.nsMapManager.LayersOrder');
+
+goog.require('oVmap');
+
+goog.require('ol.View');
+goog.require('ol.layer.Group');
+goog.require('ol.layer.Base');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.LayersOrder}: changing layers order tool
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.LayersOrder = function () {
+    oVmap.log("nsVmap.nsMapManager.LayersOrder");
+};
+
+/**
+ * layers order directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.LayersOrder.prototype.layersorderDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.LayersOrder.prototype.layersorderDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppLayersorderController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/layersorder.html'
+    };
+};
+
+/**
+ * 
+ * @param {object} $scope the current scope
+ * @ngInject
+ * @export
+ * @constructor
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.LayersOrder.prototype.layersorderController = function ($scope) {
+    oVmap.log("nsVmap.nsMapManager.LayersOrder.prototype.layersorderController");
+
+    var olMap = this['map'];
+    var layersorderController = this;
+
+    /**
+     * Liste des couches (à l'envers)
+     * @type {Array.<ol.layer.Base>}
+     * @const
+     * @api stable
+     */
+    var selectedLayers = this['selectedLayers'] = this['map'].getLayers().getArray().slice().reverse();
+    
+    if (goog.isDefAndNotNull(oVmap['properties']['vmap'])) {
+        /**
+         * true if the tool have to be collapsed
+         */
+        this['layersorder_collapsed'] = oVmap['properties']['vmap']['layersorder_collapsed'];
+    }
+
+    // Lie la carte à la liste des couches
+    oVmap.getMap().getOLMap().getLayerGroup().on('change', function () {
+        this['selectedLayers'] = this['map'].getLayers().getArray().slice().reverse();
+    }, this);
+
+    var layers = $(".sortable-list").sortable({
+         handle: '.sortable-handle',
+        'onDrop': function ($item, container, _super, event) {
+
+            $item.removeClass(container['group']['options']['draggedClass']).removeAttr("style");
+            $("body").removeClass(container['group']['options']['bodyClass']);
+
+            data = layers.sortable('serialize').get();
+
+            layersorderController.reorganizeLayers(data[0]);
+        },
+        'onDragStart': function ($item, container, _super) {
+
+            var offset = $item.offset();
+            var pointer = container['rootGroup']['pointer'];
+
+            adjustment = {
+                left: pointer.left - offset.left,
+                top: pointer.top - offset.top
+            };
+
+            _super($item, container);
+        },
+        'onDrag': function ($item, position) {
+                        
+            $item.css({
+                left: position.left - adjustment.left,
+                top: position.top - adjustment.top
+            });
+        }
+    });
+};
+
+/**
+ * Reorganize the layers by the hashkey in the serialized data array
+ * @param {array} data
+ * @param {string} data.hashkey the hashkey of the layer
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.LayersOrder.prototype.layersorderController.prototype.reorganizeLayers = function (data) {
+
+    var oldList = this['selectedLayers'];
+
+    oVmap.getMap().getOLMap().getLayers().clear();
+
+    for (var i = data.length - 1; i >= 0; i--) {
+        for (var ii = 0; ii < oldList.length; ii++) {
+            if (oldList[ii]['$$hashKey'] === data[i]['hashkey'])
+                oVmap.getMap().getOLMap().getLayers().push(oldList[ii]);
+        }
+    }
+};
+
+/**
+ * Set a layer visible or not
+ * @param {ol.layer.Base} layer
+ * @param {boolean} bVisible
+ * @export
+ */
+nsVmap.nsMapManager.LayersOrder.prototype.layersorderController.prototype.setVisible = function (layer, bVisible) {
+    oVmap.log('nsVmap.nsMapManager.LayersOrder.prototype.layersorderController.prototype.setVisible', bVisible);
+    
+    layer.setVisible(bVisible);
+    this['map'].render();
+};
+
+/**
+ * Set the layer selectable
+ * @param {ol.layer.Base} layer Layer.
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.LayersOrder.prototype.layersorderController.prototype.setSelectable = function (layer) {
+    var isChecked = layer.get('select');
+    var oLayersTree = oVmap.getMapManager().getLayersTree();
+    layer.set('select', !isChecked);
+
+    // Change la variable visible de la couche correspondante dans oLayersTree
+    for (var i = 0; i < oLayersTree['children'].length; i++) {
+        if (oLayersTree['children'][i]['children']) {
+            oService = oLayersTree['children'][i]['children'];
+            for (var ii = 0; ii < oService.length; ii++) {
+                if (oService[ii]['olLayer']['$$hashKey'] === layer['$$hashKey'])
+                    oService[ii]['select'] = !isChecked;
+            }
+        }
+    }
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appLayersorder', nsVmap.nsMapManager.LayersOrder.prototype.layersorderDirective);
+oVmap.module.controller('AppLayersorderController', nsVmap.nsMapManager.LayersOrder.prototype.layersorderController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
new file mode 100644
index 0000000000000000000000000000000000000000..673cb4e0f66ff2e60cc0b2faab5137030da12bb0
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -0,0 +1,949 @@
+/* global oVmap, nsVmap, goog, ol, angular, vitisApp */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.LayersTree
+ * cette classe permet l'initialisation de l'arborescence de couches
+ */
+
+goog.provide('nsVmap.nsMapManager.LayersTree');
+
+goog.require('oVmap');
+
+goog.require('MapJSON');
+
+goog.require('nsVmap.Map');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Image');
+goog.require('ol.source.OSM');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.TileWMS');
+goog.require('ol.source.Image');
+goog.require('ol.source.ImageWMS');
+goog.require('ol.source.WMTS');
+goog.require('ol.format.WMTSCapabilities');
+goog.require('ol.tilegrid.TileGrid');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.LayersTree}: initializes the layers defined in data/map.json
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree = function () {
+    oVmap.log("nsVmap.nsMapManager.LayersTree");
+};
+
+/**
+ * Layer tree directive.
+ * @return {angular.Directive} The Directive Definition Object.
+ * @constructor
+ */
+nsVmap.nsMapManager.LayersTree.prototype.layertreeDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.LayersTree.prototype.layertreeDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'proj': '=appProj',
+            'lang': '=appLang'
+        },
+        controller: 'AppLayertreeController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/layertree.html'
+    };
+};
+oVmap.module.directive('appLayertree', nsVmap.nsMapManager.LayersTree.prototype.layertreeDirective);
+
+/**
+ * Directive for the layer opacity sliders
+ * @return {angular.Directive} The Directive Definition Object.
+ * @constructor
+ */
+nsVmap.nsMapManager.LayersTree.prototype.layerOpacitySliderDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.LayersTree.prototype.layerOpacitySliderDirective");
+    return {
+        restrict: 'A',
+        link: function (scope, element, attrs) {
+            setTimeout(function () {
+                var oOpacitySlider = new Slider(element[0], {
+                    'value': goog.isDefAndNotNull(scope['layer']['olLayer']) ? scope['layer']['olLayer'].getOpacity() * 100 : 100,
+                    'step': 1,
+                    'min': 0,
+                    'max': 100,
+                    formatter: function (value) {
+                        return value + ' %';
+                    }
+                });
+                oOpacitySlider.on('change', function () {
+                    var value = oOpacitySlider['getValue']();
+                    if (goog.isDefAndNotNull(scope['layer']['olLayer'])) {
+                        scope['layer']['olLayer'].setOpacity(value / 100);
+                    }
+                });
+            });
+        }
+    };
+};
+oVmap.module.directive('appLayerOpacitySlider', nsVmap.nsMapManager.LayersTree.prototype.layerOpacitySliderDirective);
+
+/**
+ *
+ * @param {object} $scope
+ * @constructor
+ * @ngInject
+ * @export
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope, $element) {
+    oVmap.log("nsVmap.nsMapManager.LayersTree.prototype.LayertreeController");
+
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.scope_ = $scope;
+
+    /**
+     * The MapManager.layersTree
+     * @type {object}
+     */
+    $scope['tree'] = oVmap.getMapManager().getLayersTree();
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * Contains the layer to apply the filter
+     */
+    this['olFilteredLayer'] = {};
+
+    this['refreshLayersEvents'] = [];
+
+    if (goog.isDefAndNotNull(oVmap['properties']['vmap'])) {
+        /**
+         * true if the layers have to be collapsed
+         */
+        this['layers_collapsed'] = oVmap['properties']['vmap']['layers_collapsed'];
+        /**
+         * true if the tool have to be collapsed
+         */
+        this['layerstree_collapsed'] = oVmap['properties']['vmap']['layerstree_collapsed'];
+    }
+
+    if (goog.isDefAndNotNull(oUrlParams['extent'])){
+        var aExtent = decodeURI(oUrlParams['extent']).split("|");
+    }
+
+    this.loadTree(aExtent);
+
+    // Événements sur les couches
+    var keepLoadedTiles = true;
+    if (goog.isDefAndNotNull(vitisApp['oWebsocket'])) {
+        vitisApp['oWebsocket'].on('event', function (event) {
+            for (var i = 0; i < this_['refreshLayersEvents'].length; i++) {
+                if (this_['refreshLayersEvents'][i]['event'] === event) {
+                    if (oVmap['bRefreshWebsockets']) {
+                        if (goog.isDefAndNotNull(this_['refreshLayersEvents'][i]['layer'])) {
+                            if (goog.isDefAndNotNull(this_['refreshLayersEvents'][i]['layer'].refreshWithTimestamp)) {
+                                this_['refreshLayersEvents'][i]['layer'].refreshWithTimestamp(keepLoadedTiles);
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    // Ferme les menus dropdowns des couches quand on clique ailleurs que sur eux ou sur leur bouton
+    $('body').click(function (evt) {
+        if ($(evt.target).hasClass('.layer-menu'))
+            return;
+        if ($(evt.target).closest('.layer-menu').length)
+            return;
+        if ($(evt.target).hasClass('.layer-menu-button'))
+            return;
+        if ($(evt.target).closest('.layer-menu-button').length)
+            return;
+        $scope.$applyAsync(function () {
+            this_.closeLayersMenus();
+        });
+    });
+
+    // Affiche les modales en plein écran pour la version mobile
+    if (oVmap['properties']['is_mobile']) {
+        $element.find('.modal').on('shown.bs.modal', function () {
+            $('.modal-backdrop.fade.in').hide();
+            $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+        });
+    }
+};
+oVmap.module.controller('AppLayertreeController', nsVmap.nsMapManager.LayersTree.prototype.LayertreeController);
+
+/**
+ * Set a layer visible or not
+ * @param {ol.layer.Base} olLayer
+ * @param {boolean} bVisible
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setVisible = function (olLayer, bVisible) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setVisible', bVisible);
+
+    olLayer.setVisible(bVisible);
+    this.setLayerWMSQueryable(olLayer, bVisible);
+    this['map'].render();
+};
+
+/**
+ * Set a layer group selectable or not
+ * @param {object} node service node in the layers tree
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setGroupSelectable = function (node) {
+
+    // Affiche ou cache les couches mémorisées
+    for (var i = 0; i < node['children'].length; i++) {
+        if (node['children'][i]['olLayer'].get('select') !== undefined)
+            node['children'][i]['olLayer'].set('select', node['selectable']);
+    }
+
+    this.memoriseGroupSelectable(node);
+};
+
+/**
+ * Function returns if a group is full visible/hidden or half visible
+ * @param {object} node service node in the layers tree
+ * @returns {Boolean|null} true if all layers from a group are visible, false if they are all hidden, null otherwise
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.isGroupVisible = function (node) {
+
+    var bGroupVisible;
+    var iVisibleLayers = 0;
+
+    // Affiche ou cache les couches mémorisées
+    for (var i = 0; i < node['children'].length; i++) {
+        if (goog.isDefAndNotNull(node['children'][i]['olLayer'])) {
+            if (node['children'][i]['olLayer'].getVisible(node['visible']) === true) {
+                iVisibleLayers++;
+            }
+        }
+    }
+
+    if (iVisibleLayers === node['children'].length)
+        bGroupVisible = true;
+    else if (iVisibleLayers === 0)
+        bGroupVisible = false;
+    else
+        bGroupVisible = null;
+
+    return bGroupVisible;
+
+};
+
+/**
+ * Set a layer group visible or invisible
+ * @param {object} node service node in the layers tree
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setGroupVisible = function (node) {
+
+    // Affiche ou cache les couches mémorisées
+    for (var i = 0; i < node['children'].length; i++) {
+        node['children'][i]['olLayer'].setVisible(node['visible']);
+    }
+
+    this.memoriseGroupVisible(node);
+};
+
+/**
+ * Memorise the selectable layers in a group
+ * @param {object} node service node in the layers tree
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.memoriseGroupSelectable = function (node) {
+
+    if (node !== undefined) {
+        var aGroup = node['children'];
+
+        if (node.selectableLayers === undefined)
+            node.selectableLayers = [];
+
+        // Mémorise les couches affichées
+        node.selectableLayers.length = 0;
+        for (var i = 0; i < aGroup.length; i++) {
+            if (aGroup[i]['olLayer'].get('select') === true)
+                node.selectableLayers.push(aGroup[i]['olLayer']);
+        }
+
+        if (node.selectableLayers.length === 0)
+            node['selectable'] = false;
+        else
+            node['selectable'] = true;
+    }
+};
+
+/**
+ * Memorise the visible layers in a group
+ * @param {object} node service node in the layers tree
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.memoriseGroupVisible = function (node) {
+
+    if (node !== undefined) {
+        var aGroup = node['children'];
+
+        if (node['visibleLayers'] === undefined)
+            node['visibleLayers'] = [];
+
+        // Mémorise les couches affichées
+        node['visibleLayers'].length = 0;
+        for (var i = 0; i < aGroup.length; i++) {
+            if (aGroup[i]['olLayer'].getVisible() === true)
+                node['visibleLayers'].push(aGroup[i]['olLayer']);
+        }
+
+        if (node['visibleLayers'].length === 0)
+            node['visible'] = false;
+        else
+            node['visible'] = true;
+    }
+};
+
+/**
+ * Function that reload the layers tree
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTree = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTree');
+
+    // recupère une copie de l'arbre des couches
+    var oTree = jQuery.extend(true, {}, oVmap.getMapManager().getLayersTree());
+
+    // Change la variable oLayersTree
+    oVmap.getMapManager().setLayersTree(oTree);
+
+    // Vide les couches en cours de la carte
+    if (this['map'].getLayers().getArray().length > 0)
+        this['map'].getLayers().clear();
+
+    this.scope_['tree'] = oTree;
+
+    // relance le chargement des couches avec le nouvel arbre
+    this.loadTree();
+
+    oVmap.resizeLayerTools(false);
+};
+
+/**
+ * Load layers from the tree
+ * @param  {array|undefined} aExtent exent to fit on
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree = function (aExtent) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree');
+
+    if (this['map'].getLayers().getArray().length > 0)
+        this['map'].getLayers().clear();
+
+    oVmap.log(this.scope_['tree']);
+
+    var tileSize = [oVmap['properties']['vmap']['wmsTilesWidth'], oVmap['properties']['vmap']['wmsTilesHeight']];
+
+    /**
+     * Objet permettant de lancer des fonctions utiles
+     * pour parser la définition de la carte
+     * @type MapJSON
+     */
+    var oMapJSON = new MapJSON({
+        'properties': oVmap['properties']
+    });
+
+    /**
+     * Vue à utiliser
+     * @type ol.View
+     */
+    var olView = oMapJSON.getViewFromDef(this.scope_['tree'], {
+        'size': this['map'].getSize(),
+        'tileSize': tileSize
+    });
+
+    /**
+     * Tableau de couches ol
+     * @type Array<ol.layer>
+     */
+    var olLayers = oMapJSON.getLayersFromDef(this.scope_['tree'], {
+        'size': this['map'].getSize(),
+        'tileSize': tileSize
+    });
+
+    // Définit la vue de la carte
+    this.addView(olView);
+
+    // Crée les évènements sur les couches
+    goog.array.clear(this['refreshLayersEvents']);
+    for (var i = 0; i < olLayers.length; i++) {
+        var aEvents = olLayers[i].get('events');
+        if (goog.isArray(aEvents)) {
+            goog.array.removeDuplicates(aEvents);
+            for (var ii = 0; ii < aEvents.length; ii++) {
+                this['refreshLayersEvents'].push({
+                    'layer': olLayers[i],
+                    'event': aEvents[ii]
+                });
+            }
+        }
+    }
+
+    // Définit les couches de la carte
+    for (var i = 0; i < olLayers.length; i++) {
+        this.addLayer(olLayers[i]);
+    }
+
+    // Va à l'étendue fournie
+    if (goog.isDefAndNotNull(aExtent)) {
+        this['map'].getView().fit(aExtent, {
+            nearest : true
+        });
+    }
+};
+
+/**
+ * Add the olView
+ * @param {object} olView
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.addView = function (olView) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.addView');
+
+    // Récupère l'ancienne étendue
+    var oldExtent = this['map'].getView().calculateExtent(this['map'].getSize());
+
+    // Récupère l'ancienne et la nouvelle projection
+    var oldProjection = this['map'].getView().getProjection().getCode();
+    var newProjection = olView.getProjection().getCode();
+
+    // Set le home position
+    olView.set('homePosition', {
+        center: olView.getCenter(),
+        resolution: olView.getResolution()
+    });
+
+    // Récupère l'ancien home position
+    var oldPosition = this['map'].getView().get('homePosition');
+
+    oVmap.getMap().setOpenLayersView(olView);
+    this['map'].setView(olView);
+    this['proj'] = olView.getProjection().getCode();
+
+    // Reprojette en cas de changment de carte
+    if (goog.isDef(oldProjection) && goog.isDef(newProjection) && goog.isDef(oldExtent) && goog.isDef(oldPosition)) {
+        // Reprojette l'étendue
+        var newExtent = ol.proj.transformExtent(oldExtent, oldProjection, newProjection);
+        this['map'].getView().fit(newExtent, {
+            nearest: true
+        });
+
+        // Reprojette les features
+        oVmap.getMap().reprojectFeatures(oldProjection, newProjection);
+    }
+
+    // Met à jour l'outil d'overview en fonction de la nouvelle carte
+    var overviewMap = oVmap.getToolsManager().getBasicTools().getControls().getOverviewMap();
+    if (overviewMap !== undefined) {
+        overviewMap.ovmap_.setView(new ol.View({
+            resolution: olView.getProperties().resolution,
+            rotation: olView.getProperties().rotation,
+            center: olView.getProperties().center,
+            projection: olView.getProjection().getCode()
+        }));
+    }
+
+    // Met à jour l'outil CurrentProjection & MapName
+    $("#current-projection").html(oVmap['oProjections'][this['map'].getView().getProjection().getCode()]);
+    var currentMap = "";
+    var vMapCatalog = oVmap.getMapManager().getMapCatalog();
+    for (var i = 0; i < vMapCatalog['maps'].length; i++) {
+        if (vMapCatalog['maps'][i]['used'] === true) {
+            var currentMapName = vMapCatalog['maps'][i]['name'];
+        }
+    }
+    $("map-name").html(currentMapName);
+};
+
+/**
+ * Add a layer on the map
+ * @param {object} olLayer
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.addLayer = function (olLayer) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.addLayer');
+
+    this['map'].addLayer(olLayer);
+    oVmap.layerAdded(olLayer);
+};
+
+/**
+ * Get the filter FormReader scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.getFilterFormReaderScope = function () {
+    return angular.element($('#layerstree_filter_formreader').children()).scope();
+};
+
+/**
+ * Display the layer filter form
+ * @param {ol.layer} olLayer
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.displayFilterLayerModal = function (olLayer) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.displayFilterLayerModal');
+
+    var this_ = this;
+
+    this['olFilteredLayer'] = olLayer;
+    if (!goog.isDefAndNotNull(olLayer.get('filter_form'))) {
+        olLayer.set('filter_form', {
+            'search': {}
+        });
+    }
+    if (!goog.isDefAndNotNull(olLayer.get('filter_values'))) {
+        olLayer.set('filter_values', {
+            'search': {}
+        });
+    }
+
+    var oFormDefinition = olLayer.get('filter_form');
+    var oFormValues = olLayer.get('filter_values');
+    var sLayerEmbedJs = olLayer.get('filter_form_embedjs');
+
+    // Supprime les valeurs qui sont égales à -1000000
+
+    // Bouton submit
+    var button = {
+        "fields": [{
+                "type": "button",
+                "class": "btn-ungroup btn-group-sm hidden",
+                "nb_cols": 12,
+                "buttons": [{
+                        "visibleAllTabs": true,
+                        "id": "layerstree_filter_formreader_submit_btn",
+                        "type": "submit",
+                        "label": "FORM_UPDATE",
+                        "name": "form_submit",
+                        "class": "btn-primary"
+                    }
+                ]
+            }
+        ]
+    };
+
+    // Ajout du bouton caché submit (si il n'existe pas déjà)
+    if (!angular.equals(oFormDefinition['search']['rows'][oFormDefinition['search']['rows'].length - 1], button))
+        oFormDefinition['search']['rows'].push(button);
+
+    // Evènement submit
+    oFormDefinition['search']['event'] = function (oFormValuesResulted) {
+        olLayer.set('filter_values', oFormValuesResulted);
+        olLayer['applyFilter']();
+        $('#layerstree-filter-modal').modal('hide');
+        $.notify("Opération réalisée avec succès, les couches de la carte se mettent à jour", "info");
+    };
+
+    var filterFormReaderScope = this.getFilterFormReaderScope();
+    filterFormReaderScope.$evalAsync(function () {
+
+        filterFormReaderScope['ctrl']['setDefinitionName']('search');
+        filterFormReaderScope['ctrl']['setFormValues'](oFormValues);
+        filterFormReaderScope['ctrl']['setFormDefinition'](oFormDefinition);
+        filterFormReaderScope['ctrl']['loadForm']();
+
+        // eval du js + call constructor form
+
+        if (typeof destructor_form === "function") {
+            destructor_form();
+        }
+        // Suppression de la fonction "constructor_form" (sinon s'éxècute à chaque ouverture de formulaire).
+        if (typeof constructor_form === "function"){
+            constructor_form = undefined;
+        }
+
+        if(goog.isDefAndNotNull(sLayerEmbedJs)){
+            eval(sLayerEmbedJs);
+            constructor_form(filterFormReaderScope, null);
+        }
+
+        $('#layerstree-filter-modal').modal('show');
+    });
+};
+
+/**
+ * Display/hide the layer menu
+ * @param {ol.Layer} oLayer
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleLayerMenu = function (oLayer, $event) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.toggleLayerMenu');
+
+    if (oLayer['displayedMenu'] === true) {
+        this.closeLayersMenus();
+    } else {
+        this.closeLayersMenus();
+        oLayer['displayedMenu'] = true;
+    }
+
+    // Resize la fenêtre
+    setTimeout(function () {
+
+        var iLayerTop = $($event.target).closest('.layertree-item').offset()['top'];
+        var iLayerHeight = $($event.target).closest('.layertree-item').height();
+        var iMenuTop = $($event.target).closest('.layers-tree-ul').find('.layer-menu').position()['top'];
+        var iBodyHeight = $('body').height();
+        var iMaxHeight = iBodyHeight - iMenuTop - 40;
+
+        $($event.target).closest('.layers-tree-ul').find('.layer-menu').css('max-height', iMaxHeight + 'px');
+        $($event.target).closest('.layers-tree-ul').find('.layer-menu').css('top', (iLayerTop + iLayerHeight - 5) + 'px');
+    });
+};
+
+/**
+ * Close all the layers manus
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.closeLayersMenus = function () {
+
+    for (var i = 0; i < this.scope_['tree']['children'].length; i++) {
+        if (goog.isDefAndNotNull(this.scope_['tree']['children'][i]['children'])) {
+            for (var ii = 0; ii < this.scope_['tree']['children'][i]['children'].length; ii++) {
+                if (goog.isDefAndNotNull(this.scope_['tree']['children'][i]['children'][ii]['olLayer'])) {
+                    this.scope_['tree']['children'][i]['children'][ii]['displayedMenu'] = false;
+                }
+            }
+        }
+    }
+};
+
+/**
+ * Toggle the sublayer sSublayer in the olLayer
+ * @param {ol.Layer} olLayer
+ * @param {string} sSublayer
+ * @param {string} sCheckboxId
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleSubLayer = function (olLayer, sSublayer, sCheckboxId) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.toggleSubLayer');
+
+    // Vérifie que la sous-couche soit bien disponibles
+    var aAvaliableSublayers = olLayer.get('sublayers');
+    if (aAvaliableSublayers.indexOf(sSublayer) === -1) {
+        console.error('Sublayer not avaliable');
+        return null;
+    }
+
+    // Vérifie que les paramètres soient bien disponibles
+    var oParams = olLayer.getSource().getParams();
+    if (!goog.isDefAndNotNull(oParams)) {
+        console.error('Params not avaliable');
+        return null;
+    }
+    if (!goog.isString(oParams['LAYERS'])) {
+        console.error('Params[LAYERS] not avaliable');
+        return null;
+    }
+
+    var isSublayerActive = this.isSublayerActive(olLayer, sSublayer);
+    if (isSublayerActive === true) {
+        this.unactiveSublayer(olLayer, sSublayer, sCheckboxId);
+    } else if (isSublayerActive === false) {
+        this.activeSublayer(olLayer, sSublayer);
+    }
+
+    oVmap['scope'].$broadcast('layersChanged');
+};
+
+/**
+ * Return true if the sublayer sSublayer is active on olLayer
+ * @param {ol.Layer} olLayer
+ * @param {string} sSublayer
+ * @returns {boolean}
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.isSublayerActive = function (olLayer, sSublayer) {
+
+    // Vérifie que la sous-couche soit bien disponibles
+    var aActiveSublayers = olLayer.get('activeSublayers');
+    if (!goog.isDefAndNotNull(aActiveSublayers)) {
+        console.error('aActiveSublayers undefined');
+        return false;
+    }
+
+    if (aActiveSublayers.indexOf(sSublayer) !== -1) {
+        return true;
+    } else {
+        return false;
+    }
+};
+
+/**
+ * Active the sublayer sSublayer in olLayer
+ * @param {ol.Layer} olLayer
+ * @param {string} sSublayer
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.activeSublayer = function (olLayer, sSublayer) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.activeSublayer');
+
+    // Vérifie que la sous-couche soit bien disponibles
+    var aAvaliableSublayers = olLayer.get('sublayers');
+    var aActiveSublayers = olLayer.get('activeSublayers');
+    if (aAvaliableSublayers.indexOf(sSublayer) === -1) {
+        console.error('Sublayer not avaliable');
+        return null;
+    }
+
+    // Vérifie que les paramètres soient bien disponibles
+    var oParams = olLayer.getSource().getParams();
+    if (!goog.isDefAndNotNull(oParams)) {
+        console.error('Params not avaliable');
+        return null;
+    }
+    if (!goog.isString(oParams['LAYERS'])) {
+        console.error('Params[LAYERS] not avaliable');
+        return null;
+    }
+    if (aActiveSublayers.indexOf(sSublayer) !== -1) {
+        console.error('sublayer already active in layer');
+        return null;
+    }
+
+    // Ajoute la sous-couche
+    var tmpActiveSublayers = [];
+    for (var i = 0; i < aAvaliableSublayers.length; i++) {
+        if (aAvaliableSublayers[i] == sSublayer ||
+                aActiveSublayers.indexOf(aAvaliableSublayers[i]) !== -1) {
+            tmpActiveSublayers.push(aAvaliableSublayers[i]);
+        }
+    }
+
+    // Enregistre le résultat
+    olLayer.set('activeSublayers', tmpActiveSublayers);
+    oParams['LAYERS'] = tmpActiveSublayers.join(',');
+    olLayer.getSource().updateParams(oParams);
+
+    // rend la couche interrogeable
+    this.setSublayerWMSQueryable(olLayer, sSublayer, true);
+};
+
+/**
+ * Unactive the sublayer sSublayer in olLayer
+ * @param {ol.Layer} olLayer
+ * @param {string} sSublayer
+ * @param {string} sCheckboxId
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.unactiveSublayer = function (olLayer, sSublayer, sCheckboxId) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.unactiveSublayer');
+
+    // Vérifie que la sous-couche soit bien disponibles
+    var aAvaliableSublayers = olLayer.get('sublayers');
+    if (aAvaliableSublayers.indexOf(sSublayer) === -1) {
+        console.error('Sublayer not avaliable');
+        return null;
+    }
+
+    // Vérifie que les paramètres soient bien disponibles
+    var oParams = olLayer.getSource().getParams();
+    if (!goog.isDefAndNotNull(oParams)) {
+        console.error('Params not avaliable');
+        return null;
+    }
+    if (!goog.isString(oParams['LAYERS'])) {
+        console.error('Params[LAYERS] not avaliable');
+        return null;
+    }
+
+    var aSublayers = oParams['LAYERS'].split(',');
+
+    // Vérification que au moins une couche est définie
+    if (aSublayers.length <= 1) {
+        $.notify('Au moins une couche doit être présente par calque', 'error');
+        $(sCheckboxId.replace(':', '\\:')).prop('checked', true);
+        return null;
+    }
+
+    // Vide la sous-couche
+    if (aSublayers.indexOf(sSublayer) !== -1) {
+        aSublayers.splice(aSublayers.indexOf(sSublayer), 1);
+    } else {
+        console.error('sublayer not defined in layer');
+        return null;
+    }
+
+    // Enregistre le résultat
+    olLayer.set('activeSublayers', aSublayers);
+    oParams['LAYERS'] = aSublayers.join(',');
+    olLayer.getSource().updateParams(oParams);
+
+    // rend la couche non interrogeable
+    this.setSublayerWMSQueryable(olLayer, sSublayer, false);
+};
+
+/**
+ * LayertreeController.prototype.isLayerWMSQueryable - Renvoi true false ou null en fonction de l'état des couches du calque
+ *
+ * @param  {ol.Layer} olLayer
+ * @return {boolean|null}
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.isLayerWMSQueryable = function(olLayer) {
+
+    var aQueryableSublayers = olLayer.get('queryableSublayers');
+    var aActiveSublayers = olLayer.get('activeSublayers');
+    if (goog.isArray(aQueryableSublayers) && goog.isArray(aActiveSublayers)) {
+        if (aQueryableSublayers.length >= aActiveSublayers.length) {
+            olLayer.set('wms_queryable', true);
+            return true;
+        } else if (aQueryableSublayers.length > 0) {
+            olLayer.set('wms_queryable', null);
+            return null;
+        } else {
+            olLayer.set('wms_queryable', false);
+            return false;
+        }
+    }
+    return false;
+}
+
+/**
+ * LayertreeController.prototype.toggleLayerWMSQueryable - Active / désactive l'interrogation WMS pour le calque et ses couches
+ *
+ * @param  {ol.Layer} olLayer
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleLayerWMSQueryable = function(olLayer) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.toggleLayerWMSQueryable');
+
+    if (olLayer.get('wms_queryable') === true) {
+        this.setLayerWMSQueryable(olLayer, false);
+    } else {
+        this.setLayerWMSQueryable(olLayer, true);
+    }
+}
+
+/**
+ * LayertreeController.prototype.toggleLayerWMSQueryable - Active / désactive l'interrogation WMS pour le calque et ses couches
+ *
+ * @param  {ol.Layer} olLayer
+ * @param  {boolean} bQueryable
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setLayerWMSQueryable = function(olLayer, bQueryable) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.setLayerWMSQueryable');
+
+    // Calque
+    if (bQueryable === true) {
+        // Rend le calque interrogeable WMS
+        olLayer.set('wms_queryable', true);
+    } else {
+        // Rend le calque ininterrogeable WMS
+        olLayer.set('wms_queryable', false);
+    }
+
+    // Sous couches
+    if (bQueryable === true) {
+        // Rend toutes les couches du calque interrogeables WMS
+        olLayer.set('queryableSublayers', angular.copy(olLayer.get('activeSublayers')));
+    } else {
+        // Rend toutes les couches du calque ininterrogeables WMS
+        olLayer.set('queryableSublayers', []);
+    }
+
+    oVmap['scope'].$broadcast('layersChanged');
+}
+
+/**
+ * LayertreeController.prototype.isSublayerWMSQueryable - Renvoi true false en fonction de si la couche est interrogeable WMS
+ *
+ * @param  {ol.Layer} olLayer
+ * @param  {string} sSublayer
+ * @return {boolean}
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.isSublayerWMSQueryable = function(olLayer, sSublayer) {
+
+    var aQueryableSublayers = olLayer.get('queryableSublayers');
+    if (goog.isArray(aQueryableSublayers)) {
+        if (aQueryableSublayers.indexOf(sSublayer) !== -1) {
+            return true;
+        }
+    }
+    return false;
+}
+
+/**
+ * LayertreeController.prototype.toggleSublayerWMSQueryable - Active / désactive l'interrogation WMS
+ *
+ * @param  {ol.Layer} olLayer
+ * @param  {string} sSublayer
+ * @return {boolean|null}
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleSublayerWMSQueryable = function(olLayer, sSublayer) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.toggleSublayerWMSQueryable');
+
+    var aQueryableSublayers = olLayer.get('queryableSublayers');
+    if (goog.isArray(aQueryableSublayers)) {
+        if (!this.isSublayerWMSQueryable(olLayer, sSublayer)) {
+            this.setSublayerWMSQueryable(olLayer, sSublayer, true);
+        } else {
+            this.setSublayerWMSQueryable(olLayer, sSublayer, false);
+        }
+    }
+
+    oVmap['scope'].$broadcast('layersChanged');
+}
+
+/**
+ * LayertreeController.prototype.toggleSublayerWMSQueryable - Active / désactive l'interrogation WMS
+ *
+ * @param  {ol.Layer} olLayer
+ * @param  {string} sSublayer
+ * @param  {boolean} bValue
+ * @return {boolean|null}
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setSublayerWMSQueryable = function(olLayer, sSublayer, bValue) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.setSublayerWMSQueryable');
+
+    var aQueryableSublayers = olLayer.get('queryableSublayers');
+    if (goog.isArray(aQueryableSublayers)) {
+        if (bValue) {
+            aQueryableSublayers.push(sSublayer);
+            olLayer.set('queryableSublayers', aQueryableSublayers);
+        } else {
+            if (aQueryableSublayers.indexOf(sSublayer) !== -1) {
+                aQueryableSublayers.splice(aQueryableSublayers.indexOf(sSublayer), 1);
+                olLayer.set('queryableSublayers', aQueryableSublayers);
+            }
+        }
+    }
+
+    oVmap['scope'].$broadcast('layersChanged');
+}
diff --git a/module/javascript/app/vmap/mapmanager/maplegend.js b/module/javascript/app/vmap/mapmanager/maplegend.js
new file mode 100644
index 0000000000000000000000000000000000000000..48d2e54ec1915eb1e28b91b4908630d62aa5b32c
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/maplegend.js
@@ -0,0 +1,318 @@
+/* global oVmap, goog, nsVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.MapLegend
+ * cette classe permet d'afficher la légende
+ */
+
+goog.provide('nsVmap.nsMapManager.MapLegend');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.MapLegend}: Map legend tool
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend = function () {
+    oVmap.log("nsVmap.nsMapManager.MapLegend");
+};
+
+/**
+ * Loads the legend
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.loadLegend = function () {
+    angular.element('#maplegendcontainer').scope()['ctrl']['loadLegend']();
+}
+
+/**
+ * Allow to hide the unaccessible legend images
+ * @param {object} element
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.hideBrokenLegend = function (element) {
+    oVmap.log("nsVmap.nsMapManager.MapLegend.prototype.hideBrokenLegend");
+
+    $(element).closest('.layer-legend').hide();
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * map legend directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ * @ngInject
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.MapLegend.prototype.maplegendDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppMaplegendController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/maplegend.html'
+    };
+};
+
+/**
+ * map legend image node directive (Allow th onmouseover)
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ * @ngInject
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendImageDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.MapLegend.prototype.maplegendImageDirective");
+    return {
+        link: function (scope, element) {
+            var timeout = 500;
+            var i = 0;
+            $(element).mouseenter(function () {
+                i++;
+                var ii = angular.copy(i);
+
+                // Si la souris est dedans depuis timeout ms
+                setTimeout(function () {
+                    if (ii === i) {
+                        var myPopover;
+                        $('[app-maplegend]').popover({
+                            'html': true,
+                            'content': '<img src="' + scope['node']['legendURL'] + '" class="img-responsive">',
+                            'placement': function (popover) {
+                                myPopover = popover;
+                                return 'right';
+                            }
+                        });
+                        $('[app-maplegend]').popover('show');
+
+                        // Place la popover
+                        setTimeout(function () {
+                            var popoverTop = $(myPopover).offset()['top'];
+                            var popoverHeight = $(myPopover).height();
+                            var popoverBottom = popoverTop + popoverHeight;
+                            var bodyHeight = $('body').height();
+                            var footerHeight = $('#footer_line').height();
+                            var avaliableHeight = bodyHeight - footerHeight;
+
+                            if (popoverBottom > avaliableHeight) {
+                                $(myPopover).css('top', popoverTop - (popoverBottom - avaliableHeight) + 'px');
+                            }
+                        });
+                    }
+                }, timeout);
+            }).mouseleave(function () {
+                i++;
+                $('[app-maplegend]').popover('destroy');
+            });
+        }
+    };
+};
+
+/**
+ * map legend controller
+ * @param {object} $scope
+ * @ngInject
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope) {
+    oVmap.log("nsVmap.nsMapManager.MapLegend.prototype.maplegendController");
+
+    var this_ = this;
+
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this['aUrls'] = [];
+
+    /**
+     * Contains the events stocked by listenLayers()
+     */
+    this.aListenedEvents_ = [];
+
+    if (goog.isDefAndNotNull(oVmap['properties']['vmap'])) {
+        /**
+         * true if the tool have to be collapsed
+         */
+        this['legend_collapsed'] = oVmap['properties']['vmap']['legend_collapsed'];
+    }
+
+    oVmap['scope'].$on('layersChanged', function () {
+        this_.loadLegend();
+    });
+    setTimeout(function () {
+        this_.loadLegend();
+    });
+};
+
+/**
+ * Loads the legend
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.loadLegend = function () {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.loadLegend');
+
+    this['oUrls'] = this.getLegendUrls();
+    this.downloadLegendImgs(this['oUrls']);
+};
+
+/**
+ * Get the legend URLs
+ * @returns {object}
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.getLegendUrls = function () {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.getLegendUrls');
+
+    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var oUrls = {};
+
+    // Récupération des URL WMS
+    for (var i = 0; i < aLayers.length; i++) {
+        if (aLayers[i].get('legend') === true) {
+            if (aLayers[i].get('visible') === true) {
+                if (aLayers[i].get('type') === 'tilewms') {
+
+                    var sLayerName = aLayers[i].get('name');
+                    oUrls[sLayerName] = [];
+
+                    for (var ii = 0; ii < aLayers[i].getSource().getUrls().length; ii++) {
+
+                        var sLayers = aLayers[i].getSource().getParams()['LAYERS'];
+                        var aLayerParam = [];
+                        if (goog.isDefAndNotNull(sLayers)) {
+                            aLayerParam = aLayers[i].getSource().getParams()['LAYERS'].split(',');
+                        }
+
+
+                        for (var iii = 0; iii < aLayerParam.length; iii++) {
+
+                            var separator = aLayers[i].getSource().getUrls()[ii].indexOf('?') !== -1 ? '&' : '?';
+
+                            oUrls[sLayerName].push({
+                                'layerId': i,
+                                'collapsed': false,
+                                'url': aLayers[i].getSource().getUrls()[ii],
+                                'layer': aLayerParam[iii],
+                                'olLayer': aLayers[i],
+                                'layerName': aLayers[i].get('name'),
+                                'service_login': goog.isDefAndNotNull(aLayers[i].get('service_login')) ? aLayers[i].get('service_login') : null,
+                                'service_password': goog.isDefAndNotNull(aLayers[i].get('service_password')) ? aLayers[i].get('service_password') : null,
+                                'legendURL': aLayers[i].getSource().getUrls()[ii] + separator + 'request=GetLegendGraphic&LAYER=' + aLayerParam[iii] + '&FORMAT=image/png&VERSION=1.1.0&service=WMS'
+                            });
+                        }
+                    }
+                } else if (aLayers[i].get('type') === 'imagewms') {
+
+                    var sLayerName = aLayers[i].get('name');
+
+                    var sLayers = aLayers[i].getSource().getParams()['LAYERS'];
+                    var aLayerParam = [];
+                    if (goog.isDefAndNotNull(sLayers)) {
+                        aLayerParam = aLayers[i].getSource().getParams()['LAYERS'].split(',');
+                    }
+                    oUrls[sLayerName] = [];
+
+                    for (var iii = 0; iii < aLayerParam.length; iii++) {
+
+                        var separator = aLayers[i].getSource().getUrl().indexOf('?') !== -1 ? '&' : '?';
+
+                        oUrls[sLayerName].push({
+                            'layerId': i,
+                            'collapsed': false,
+                            'url': aLayers[i].getSource().getUrl(),
+                            'layer': aLayerParam[iii],
+                            'olLayer': aLayers[i],
+                            'layerName': aLayers[i].get('name'),
+                            'service_login': goog.isDefAndNotNull(aLayers[i].get('service_login')) ? aLayers[i].get('service_login') : null,
+                            'service_password': goog.isDefAndNotNull(aLayers[i].get('service_password')) ? aLayers[i].get('service_password') : null,
+                            'legendURL': aLayers[i].getSource().getUrl() + separator + 'request=GetLegendGraphic&LAYER=' + aLayerParam[iii] + '&FORMAT=image/png&VERSION=1.1.0&service=WMS'
+                        });
+                    }
+                }
+            }
+        }
+    }
+
+    return oUrls;
+};
+
+/**
+ * Download the blob including the login/pass headers on the request
+ * @param {object} oUrls
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.downloadLegendImgs = function (oUrls) {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.downloadLegendImgs');
+    for (var key in oUrls) {
+        for (var i = 0; i < oUrls[key].length; i++) {
+            oUrls[key][i]['legendBlobURL'] = this.downloadLegendImg(oUrls[key][i]);
+        }
+    }
+};
+
+/**
+ * Télécharge l'image de la légende et la remplie au format blob sous l'attribut legendBlobURL
+ * @param {object} oLegend
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.downloadLegendImg = function (oLegend) {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.downloadLegendImg');
+
+    var this_ = this;
+    var xhr = new XMLHttpRequest();
+    xhr.responseType = 'blob';
+    xhr.onreadystatechange = function () {
+        this_.$scope_.$applyAsync(function () {
+            if ((xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200)
+                    && (xhr.response.type === "image/png" || xhr.response.type === "image/jpg" || xhr.response.type === "image/jpeg")) {
+                oLegend['legendBlobURL'] = URL.createObjectURL(xhr.response);
+            } else {
+                oLegend['legendBlobURL'] = false;
+            }
+        });
+    };
+    xhr.open('GET', oLegend['legendURL'], true);
+    if (goog.isDefAndNotNull(oLegend['service_login']) && goog.isDefAndNotNull(oLegend['service_password'])) {
+        xhr.setRequestHeader("Authorization", "Basic " + btoa(oLegend['service_login'] + ":" + oLegend['service_password']));
+    }
+    // Par défaut la légende est non visible
+    this_.$scope_.$applyAsync(function () {
+        oLegend['legendBlobURL'] = false;
+    });
+    xhr.send();
+};
+
+/**
+ * Retourne true si au moins une des légendes a été chargée
+ * @param {array} aLegends
+ * @returns {Boolean}
+ * @export
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.areLegendsLoaded = function (aLegends) {
+
+    var bAreLegendsLoaded = false;
+    for (var i = 0; i < aLegends.length; i++) {
+        if (aLegends[i]['legendBlobURL'] !== false) {
+            bAreLegendsLoaded = true;
+        }
+    }
+    return bAreLegendsLoaded;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMaplegend', nsVmap.nsMapManager.MapLegend.prototype.maplegendDirective);
+oVmap.module.directive('legendImageNode', nsVmap.nsMapManager.MapLegend.prototype.maplegendImageDirective);
+oVmap.module.controller('AppMaplegendController', nsVmap.nsMapManager.MapLegend.prototype.maplegendController);
diff --git a/module/javascript/app/vmap/mapmanager/mapmanager.js b/module/javascript/app/vmap/mapmanager/mapmanager.js
new file mode 100644
index 0000000000000000000000000000000000000000..c13c9aae888788c3844528a192df7f652b71cb9a
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmanager.js
@@ -0,0 +1,1487 @@
+/* global nsVmap, oVmap, ol, goog, angular, vitisApp, bootbox, oUrlParams */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.MapManager
+ * cette classe permet l'initialisation des outils de couches
+ */
+
+goog.provide('nsVmap.nsMapManager.MapManager');
+
+goog.require('nsVmap.nsMapManager.LayersTree');
+goog.require('nsVmap.nsMapManager.LayersOrder');
+goog.require('nsVmap.nsMapManager.MapLegend');
+goog.require('nsVmap.nsMapManager.nsMapModal.MapModalManager');
+goog.require('ol.source.Vector');
+goog.require('ol.layer.Image');
+goog.require('ol.source.ImageVector');
+goog.require('ol.format.GPX');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.format.IGC');
+goog.require('ol.format.KML');
+goog.require('ol.format.TopoJSON');
+goog.require('goog.dom');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.MapManager}: initializes the layers tools
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.MapManager = function () {
+    oVmap.log('nsVmap.nsMapManager.MapManager');
+
+    /**
+     * Object which contains the map catalog
+     * @type {array<object>}
+     * @private
+     */
+    this.oMapCatalog_ = [];
+
+    /**
+     * Object which contains the layers tree
+     * @type {object}
+     * @private
+     */
+    this.oLayersTree_ = {};
+
+    /**
+     * Objet which contains the map modal manager tool
+     * @type {nsVmap.nsMapManager.nsMapModal.MapModalManager}
+     * @private
+     */
+    this.oMapModalTool_ = {};
+
+    /**
+     * Objet which contains the layers tree tool and initialize the map
+     * @type {nsVmap.nsMapManager.LayersTree}
+     * @private
+     */
+    this.oLayersTreeTool_ = {};
+
+    /**
+     * Objet which contains the layers order tool
+     * @type {nsVmap.nsMapManager.LayersOrder}
+     * @private
+     */
+    this.oLayersOrderTool_ = {};
+
+    /**
+     * Objet which contains the map legend tool
+     * @type {nsVmap.nsMapManager.MapLegend}
+     * @private
+     */
+    this.oMapLegendTool_ = {};
+
+
+    // Charge le catalogue et les objets de MapManager
+    if (goog.isDef(oVmap['properties']['token'])) {
+
+        var this_ = this;
+        ajaxRequest({
+            'method': 'GET',
+            'url': oVmap['properties']['api_url'] + "/vmap/mapcatalog",
+            'async': false,
+            'responseType': '',
+            'success': function (response) {
+                var oMapCatalog = JSON.parse(response['data']);
+                if (goog.isDef(oMapCatalog['mapcatalogs']))
+                    oMapCatalog = oMapCatalog['mapcatalogs'][0];
+                this_.loadMapTools(oMapCatalog);
+            },
+            'error': function (response) {
+                var oMapCatalog = {
+                    'maps': [],
+                    'services': {
+                        'wms': [],
+                        'bing': [],
+                        'osm': []
+                    },
+                    'usedMap': null
+                };
+                this_.loadMapTools(oMapCatalog);
+            }
+        });
+
+    } else {
+
+        // cas ou le token ne soit pas renseigné
+        this.loadMapTools({
+            "maps": [],
+            "services": {},
+            "status": 0
+        });
+    }
+};
+
+/**
+ * Load the json files and initialize oMapCatalog_ and oLayersTree_
+ * @param {object} oMapCatalog
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.loadMapTools = function (oMapCatalog) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.loadMapTools');
+    oVmap.log("oMapCatalog: ", oMapCatalog);
+
+    // Vérifie si l'utilisateur a le droit à au moins une carte
+    if (oMapCatalog['maps'].length === 0) {
+        oMapCatalog['maps'].push({
+            "name": "Carte vide",
+            "description": "",
+            "thumbnail": "",
+            "projection": "EPSG:3857",
+            "url": null
+        });
+
+        // Si status === 1 cela veut dire que le chargement c'est bien effectué,
+        // l'utilisateur n'a donc tout simplement aucune carte associée
+        if (oMapCatalog['status'] === 1) {
+            // Vérifie si le mode vmap a été chargé
+            if (goog.isDefAndNotNull(angular.element(vitisApp.appMainDrtv).injector())) {
+                setTimeout(function () {
+                    var $envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
+                    if ($envSrvc['oSelectedMode']['mode_id'] === 'vmap')
+                        bootbox.alert('<h4>Aucune carte n\'est associée à cet utilisateur, veuillez contacter l\'administrateur de l\'application</h4>');
+                }, 3000);
+            }
+        }
+    }
+
+    this.oMapCatalog_ = oMapCatalog;
+
+    var usedMap = oMapCatalog['usedMap'];
+
+    // Utilisation de la carte donnée dans l'URL
+    if (goog.isDefAndNotNull(oUrlParams['map_id'])) {
+        for (var i = 0; i < oMapCatalog['maps'].length; i++) {
+            if (oMapCatalog['maps'][i]['map_id'] === parseFloat(oUrlParams['map_id'])) {
+                usedMap = angular.copy(i);
+                oMapCatalog['usedMap'] = usedMap;
+            }
+        }
+    }
+
+    if (goog.isDefAndNotNull(usedMap) && goog.isDefAndNotNull(oMapCatalog['maps'][usedMap]['url'])) {
+
+        // Signale la carte utilisée
+        this.setUsedMap();
+
+        // Chargement de l'arbre de couches
+        this.loadLayersTools(oMapCatalog['maps'][usedMap]['url']);
+
+        // Instanciation des objets
+        this.oMapModalTool_ = new nsVmap.nsMapManager.nsMapModal.MapModalManager(oMapCatalog);
+
+    } else {
+
+        this.oLayersTree_ = {
+            "name": "Tree",
+            "children": [{
+                    "view": {
+                        "center": [225989.8114356043, 6761426.974988975],
+                        "zoom": 11,
+                        "projection": "EPSG:2154"
+                    }
+                }]
+        };
+
+        // Instanciation des objets
+        this.oLayersTreeTool_ = new nsVmap.nsMapManager.LayersTree();
+        this.oLayersOrderTool_ = new nsVmap.nsMapManager.LayersOrder();
+        this.oMapLegendTool_ = new nsVmap.nsMapManager.MapLegend();
+
+        // Instanciation des objets
+        this.oMapModalTool_ = new nsVmap.nsMapManager.nsMapModal.MapModalManager(oMapCatalog);
+
+    }
+};
+
+/**
+ * Load the layers tree from the json file
+ * @param {string} sUrl url to the file
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.loadLayersTools = function (sUrl) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.loadLayersTools');
+
+    var MapManager = this;
+
+    if (goog.isDefAndNotNull(sUrl)) {
+
+        ajaxRequest({
+            'method': 'GET',
+            'url': sUrl,
+            'async': false,
+            'responseType': '',
+            'success': function (response) {
+
+                var oLayersTree = JSON.parse(response['data']);
+                if (goog.isDef(oLayersTree['mapjsons']))
+                    oLayersTree = oLayersTree['mapjsons'][0];
+                oVmap.log(oLayersTree);
+                MapManager.oLayersTree_ = oLayersTree;
+
+                // Instanciation des objets
+                MapManager.oLayersTreeTool_ = new nsVmap.nsMapManager.LayersTree();
+                MapManager.oLayersOrderTool_ = new nsVmap.nsMapManager.LayersOrder();
+                MapManager.oMapLegendTool_ = new nsVmap.nsMapManager.MapLegend();
+            }
+        });
+    }
+};
+
+/**
+ * Load a new map
+ * @param {object} element Html element witch contains the url to the map.json file
+ * @param {object} element.url link to the map.json file
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.loadMap = function (element) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.loadMap');
+
+    if (oVmap['properties']['is_mobile']) {
+        oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    }
+
+    // Récupère l'url
+    var sUrl = element.getAttribute("url");
+
+    if (!goog.isDefAndNotNull(sUrl)) {
+        return 0;
+    }
+    if (sUrl.length === 0) {
+        return 0;
+    }
+
+    // Récupère l'arbre de couches
+    var this_ = this;
+    this_.getAjaxLayersTree(sUrl, function(oTree){
+
+        oVmap.log("oTree: ", oTree);
+
+        // Change la variable oLayersTree
+        this_.setLayersTree(oTree);
+
+        // Rafraichit la carte
+        this_.reloadMap();
+
+        // Signale que c'est la carte utilisée
+        for (var i = 0; i < this_.oMapCatalog_['maps'].length; i++) {
+            if (this_.oMapCatalog_['maps'][i]['url'] === sUrl)
+            this_.oMapCatalog_['usedMap'] = i;
+        }
+        this_.setUsedMap();
+
+        oVmap.log("oVmap.event: mapChanged");
+        oVmap['scope'].$broadcast('mapChanged');
+        setTimeout(function () {
+            oVmap.resizeLayerTools();
+        }, 1000);
+    });
+};
+
+/**
+ * Put the used map to used
+ * @returns {undefined}
+ */
+nsVmap.nsMapManager.MapManager.prototype.setUsedMap = function () {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.setUsedMap');
+
+    // Met toutes les cartes à used = false
+    for (var i = 0; i < this.oMapCatalog_['maps'].length; i++) {
+        this.oMapCatalog_['maps'][i]['used'] = false;
+    }
+
+    // Met la carte utilisée à used = true
+    this.oMapCatalog_['maps'][this.oMapCatalog_['usedMap']]['used'] = true;
+
+    oVmap.resizeLayerTools(false);
+};
+
+/**
+ * Add a new layer with url service
+ * @param {object} oLayer Layer to add, contains:
+ * oLayer.layerType : layer type (tilewms, imagewms, osm, bing, wmts, imagevector)
+ * oLayer.url : the url of the layer
+ * oLayer.serviceName : service name
+ * oLayer.layerName : the layer name
+ * oLayer.layerTitle : the displayed layer name
+ * oLayer.queryable : true if the layer is queryable
+ * oLayer.key : use key
+ * oLayer.culture : language to use
+ * oLayer.style : style to use
+ *
+ * @export
+ * @experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.addLayer = function (oLayer) {
+    oVmap.log("nsVmap.nsMapManager.MapManager.prototype.addLayer");
+
+    var newLayer = {};
+    var aExistingUrls = [];
+    var doesServiceExist = false;
+    var oTree = jQuery.extend(true, {}, oVmap.getMapManager().getLayersTree());
+    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var aCenter = oVmap.getMap().getOLMap().getView().getCenter();
+    var sResolution = oVmap.getMap().getOLMap().getView().getResolution();
+    var sZoom = oVmap.getMap().getOLMap().getView().getZoom();
+
+    // Test si le service est déjà inclus, si il l'est, la variable
+    // doesServiceExist prend la valeur de l'index du service
+    for (var i = 0; i < oTree['children'].length; i++) {
+        if (oTree['children'][i]['name'] === oLayer.serviceName)
+            doesServiceExist = i;
+    }
+
+    // Test si la couche est interrogeable (non checkée par défaut)
+    oLayer.select = null;
+    if (oLayer.queryable === "true")
+        oLayer.select = false;
+
+    // Recrée la vue
+    oTree['children'][0]['view']['zoom'] = sZoom;
+    oTree['children'][0]['view']['center'] = aCenter;
+    oTree['children'][0]['view']['resolution'] = sResolution;
+
+    // Recrée un arble de couches
+    if ((oLayer.layerType === "tilewms") || (oLayer.layerType === "imagewms")) {
+
+        // Test si la couche existe
+        var aWMSServicesParams = [];
+
+        // Mémorise les couches présentes
+        for (var i = 0; i < aLayers.length; i++) {
+            if (aLayers[i].get('type') === "tilewms") {
+                // TileWMS peut supporter plusieurs URL, si se cas se présente on vérifie chacune des url
+                var aUrls = aLayers[i].getSource().getUrls();
+                for (var ii = 0; ii < aUrls.length; ii++) {
+                    aWMSServicesParams.push({
+                        url: aUrls[ii],
+                        layers: aLayers[i].getSource().getParams()['LAYERS']
+                    });
+                }
+            }
+            if (aLayers[i].get('type') === "imagewms") {
+
+                aWMSServicesParams.push({
+                    url: aLayers[i].getSource().getUrl(),
+                    layers: aLayers[i].getSource().getParams()['LAYERS']
+                });
+            }
+        }
+        // Les compare à la couche ajoutée
+        for (var i = 0; i < aWMSServicesParams.length; i++) {
+            if (aWMSServicesParams[i].url === oVmap['properties']['use_proxy_for_tiles'] ? oVmap.getMapManager().parseProxyUrl(oLayer.url) : oLayer.url && aWMSServicesParams[i].layers === oLayer.layerName) {
+                $.notify('La couche est déjà présente', 'wms-log-message');
+                return null;
+            }
+        }
+
+        // Login/Password
+        oLayer.service_options = '';
+        if (goog.isString(oLayer.login) && goog.isString(oLayer.password)) {
+            if (oLayer.login.trim().length > 0 && oLayer.password.trim().length > 0) {
+                oLayer.service_options = JSON.stringify({
+                    'login': oLayer.login,
+                    'password': oLayer.password
+                });
+            }
+        }
+
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "name": oLayer.layerTitle,
+                        "index": 1000000,
+                        "layerType": "tilewms",
+                        "visible": "true",
+                        "legend": "true",
+                        "select": oLayer.select,
+                        "url": oLayer.url,
+                        "service_options": oLayer.service_options,
+                        "params": {
+                            "LAYERS": oLayer.layerName,
+                            "VERSION": oLayer.version,
+                            "STYLES": goog.isDefAndNotNull(oLayer.style) ? oLayer.style : ''
+                        }
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerTitle,
+                "index": 1000000,
+                "layerType": "tilewms",
+                "visible": "true",
+                "legend": "true",
+                "select": oLayer.select,
+                "url": oLayer.url,
+                "service_options": oLayer.service_options,
+                "params": {
+                    "LAYERS": oLayer.layerName,
+                    "VERSION": oLayer.version,
+                    "STYLES": goog.isDefAndNotNull(oLayer.style) ? oLayer.style : ''
+                }
+            };
+
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else if (oLayer.layerType === "osm") {
+        // Test si la couche est déjà incluse
+        for (var i = 0; i < oTree['children'].length; i++) {
+            if (oTree['children'][i]['children']) {
+                for (var ii = 0; ii < oTree['children'][i]['children'].length; ii++) {
+                    if (oTree['children'][i]['children'][ii]['url'] === oLayer.url) {
+                        $.notify('La couche est déjà présente', 'error');
+                        return 0;
+                    }
+                    if (oLayer.url == '' && oTree['children'][i]['children'][ii]['url'] == 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png') {
+                        $.notify('La couche est déjà présente', 'error');
+                        return 0;
+                    }
+                }
+            }
+        }
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "index": 1000000,
+                        "name": oLayer.layerTitle,
+                        "visible": "true",
+                        "layerType": "osm",
+                        "url": oLayer.url
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerTitle,
+                "index": 1000000,
+                "visible": "true",
+                "layerType": "osm",
+                "url": oLayer.url
+            };
+
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else if (oLayer.layerType === "xyz") {
+        // Test si la couche est déjà incluse
+        for (var i = 0; i < oTree['children'].length; i++) {
+            if (oTree['children'][i]['children']) {
+                for (var ii = 0; ii < oTree['children'][i]['children'].length; ii++) {
+                    if (oTree['children'][i]['children'][ii]['url'] === oLayer.url) {
+                        $.notify('La couche est déjà présente', 'error');
+                        return 0;
+                    }
+                }
+            }
+        }
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "index": 1000000,
+                        "name": oLayer.layerTitle,
+                        "visible": "true",
+                        "layerType": "xyz",
+                        "url": oLayer.url
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerTitle,
+                "index": 1000000,
+                "visible": "true",
+                "layerType": "xyz",
+                "url": oLayer.url
+            };
+
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else if (oLayer.layerType === "bing") {
+        // Test si la couche est déjà incluse
+        for (var i = 0; i < oTree['children'].length; i++) {
+            if (oTree['children'][i]['children']) {
+                for (var ii = 0; ii < oTree['children'][i]['children'].length; ii++) {
+                    if (oTree['children'][i]['children'][ii]['imagerySet'] === oLayer.layerName) {
+                        $.notify('La couche est déjà présente', 'error');
+                        return 0;
+                    }
+                }
+            }
+        }
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "name": oLayer.layerName,
+                        "index": 1000000,
+                        "imagerySet": oLayer.layerName,
+                        "visible": "true",
+                        "layerType": "bing",
+                        "key": oLayer.key,
+                        "culture": oLayer.culture
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerName,
+                "index": 1000000,
+                "imagerySet": oLayer.layerName,
+                "visible": "true",
+                "layerType": "bing",
+                "key": oLayer.key,
+                "culture": oLayer.culture
+            };
+
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else if (oLayer.layerType === "wmts") {
+        // Test si la couche est déjà incluse
+        for (var i = 0; i < oTree['children'].length; i++) {
+            if (oTree['children'][i]['children']) {
+                for (var ii = 0; ii < oTree['children'][i]['children'].length; ii++) {
+                    if (oTree['children'][i]['children'][ii]['layer'] === oLayer.layerName) {
+                        $.notify('La couche est déjà présente', 'error');
+                        return 0;
+                    }
+                }
+            }
+        }
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "name": oLayer.layerTitle,
+                        "index": 1000000,
+                        "layer": oLayer.layerName,
+                        "visible": "true",
+                        "layerType": "wmts",
+                        "matrixSet": oLayer.matrixSet,
+                        "style": oLayer.style,
+                        "format": oLayer.format,
+                        "requestEncoding": oLayer.requestEncoding,
+                        "service_options": oLayer.service_options,
+                        "version": oLayer.version,
+                        "url": oLayer.url
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerTitle,
+                "index": 1000000,
+                "layer": oLayer.layerName,
+                "visible": "true",
+                "layerType": "wmts",
+                "matrixSet": oLayer.matrixSet,
+                "style": oLayer.style,
+                "format": oLayer.format,
+                "requestEncoding": oLayer.requestEncoding,
+                "service_options": oLayer.service_options,
+                "version": oLayer.version,
+                "url": oLayer.url
+            };
+
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else if (oLayer.layerType === "imagevector") {
+
+        // Test si la couche est déjà incluse
+        for (var i = 0; i < oTree['children'].length; i++) {
+            if (oTree['children'][i]['children']) {
+                for (var ii = 0; ii < oTree['children'][i]['children'].length; ii++) {
+                    if (oTree['children'][i]['children'][ii]['layerType'] === 'imagevector')
+                        if (oTree['children'][i]['children'][ii]['url'] !== undefined) {
+                            if (oTree['children'][i]['children'][ii]['url'] === oVmap['properties']['use_proxy_for_tiles'] ? oVmap.getMapManager().parseProxyUrl(oLayer.url) : oLayer.url) {
+                                $.notify('La couche est déjà présente', 'error');
+                                return 0;
+                            }
+                        }
+                }
+            }
+        }
+        // Ajout de la couche dans oTree
+        if (doesServiceExist === false) {
+            newLayer = {
+                "name": oLayer.serviceName,
+                "children": [{
+                        "name": oLayer.layerTitle,
+                        "index": 1000000,
+                        "visible": "true",
+                        "layerType": "imagevector",
+                        "url": oLayer.url,
+                        "features": oLayer.features,
+                        "style": oLayer.style
+                    }]
+            };
+            oTree['children'].push(newLayer);
+        } else {
+            newLayer = {
+                "name": oLayer.layerTitle,
+                "index": 1000000,
+                "visible": "true",
+                "layerType": "imagevector",
+                "url": oLayer.url,
+                "features": oLayer.features,
+                "style": oLayer.style
+            };
+            oTree['children'][doesServiceExist]['children'].push(newLayer);
+        }
+    } else {
+        console.error('type :"' + oLayer.layerType + '" non pris en compte');
+    }
+
+    // Change la variable oLayersTree
+    oVmap.getMapManager().setLayersTree(oTree);
+    oVmap.getMapManager().reloadMap();
+
+    // resize les outils de couches
+    oVmap.resizeLayerTools(false);
+};
+
+/**
+ * Remove a layer from the map and the layers tree
+ * @param {ol.layer.Base} olLayer Layer to remove
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.removeLayer = function (olLayer) {
+    oVmap.log("removeLayer");
+
+    var oLayersTree = this.oLayersTree_;
+    var resolution = oVmap.getMap().getOLMap().getView().getResolution();
+    var center = oVmap.getMap().getOLMap().getView().getCenter();
+
+    // Supprime la couche de MapManager.oLayersTree
+    for (var i = 0; i < oLayersTree['children'].length; i++) {
+        if (oLayersTree['children'][i]['children']) {
+            var oService = oLayersTree['children'][i]['children'];
+            for (var ii = 0; ii < oService.length; ii++) {
+                if (oService[ii]['olLayer']['$$hashKey'] === olLayer['$$hashKey'])
+                    oService.splice(ii, 1);
+            }
+        }
+    }
+
+    // Supprime la couche de la carte
+    oVmap.getMap().getOLMap().removeLayer(olLayer);
+
+    // Verifie si le parent n'est pas vide et le supprime si c'est le cas
+    for (var i = 0; i < oLayersTree['children'].length; i++) {
+        if (oLayersTree['children'][i]['children']) {
+            if (oLayersTree['children'][i]['children'].length === 0) {
+                oVmap.getMap().getOLMap().getLayers().getArray().length = 0;
+                oLayersTree['children'].splice(i, 1);
+                // Comme il y a un watch sur oLayersTree_, lors du splice, LayersTree recharge l'arbre des couches
+                // Il est donc important de vider les couches visibles avant le splice pour pas se retrouver
+                // avec des couches en double
+                this.reloadMap();
+            }
+        }
+    }
+
+    // Retourne au zoom d'avant la suppression
+    oVmap.getMap().getOLMap().getView().setResolution(resolution);
+    oVmap.getMap().getOLMap().getView().setCenter(center);
+};
+
+/**
+ * Add a Layer from a vector content
+ * @param {string|object} content
+ * @param {string} serviceName
+ * @param {string} layerTitle
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.addLayerFromVectorContent = function (content, serviceName, layerTitle) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.addLayerFromVectorContent');
+
+    var sFeatures;
+
+    try {
+        sFeatures = $.parseJSON(content);
+    } catch (e) {
+        sFeatures = content;
+    }
+
+    // Récupère l'objet features depuis la chaine de caractères
+    var formatConstructors = [
+        ol.format.GPX,
+        ol.format.GeoJSON,
+        ol.format.IGC,
+        ol.format.KML,
+        ol.format.TopoJSON
+    ];
+
+    // Essaye de lire la source celon les formats suivants
+    for (var i = 0; i < formatConstructors.length; i++) {
+        var format = new formatConstructors[i]();
+        try {
+            var features = format.readFeatures(sFeatures, {
+                featureProjection: oVmap.getMap().getOLMap().getView().getProjection()
+            });
+            // Si la lecture a réussi, alors oFeaturesReaded prend la valeur de la géométrie
+            if (features.length > 0) {
+                var oFeaturesReaded = features;
+                i = formatConstructors.length;
+            }
+        } catch (err) {
+        }
+    }
+
+    if (goog.isDefAndNotNull(oFeaturesReaded)) {
+
+        // Ajoute la couche
+        var oLayer = {
+            layerType: 'imagevector',
+            serviceName: serviceName,
+            layerTitle: layerTitle,
+            features: oFeaturesReaded
+        };
+        this.addLayer(oLayer);
+        return true;
+    } else {
+        $.notify('Impossible de lire les géométries', 'error');
+        console.error('Impossible de lire les géométries: ', content);
+        return false;
+    }
+};
+
+/**
+ * Load a new map from a file
+ * @param {object} element Html element witch contains the file-container, url
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.loadMapFromFile = function (element) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.loadMapFromFile');
+
+    var fileContainer = element.getAttribute("file-container");
+    var url = element.getAttribute("url");
+
+    $("#maplist-log-message").empty();
+
+    // si on utilise l'url
+    if (url !== "") {
+
+        // var firstCharacters=url.substr(0,3);
+        var firstCharacters = url;
+
+        // Si l'url vient du web
+        if (firstCharacters === 'htt' || firstCharacters === 'www') {
+            // Récupère l'arbre de couches
+            oVmap.getMapManager().getAjaxLayersTree(url, function(oTree){
+
+                // Cange les variables oLayersTree et aLayersList des objets dans les layers tools
+                oVmap.getMapManager().setLayersTree(oTree);
+
+                // Simule le click de la souris sur le bouton "btn-reload-map"
+                oVmap.getMapManager().reloadMap();
+            });
+        } else {
+            // For security reasons JavaScript's access to the file system on the client is restricted
+            var error = 'Erreur lors du chargement du fichier: Pour de raisons de sécurité,';
+            error += ' lors de l\'utilisation d\'un fichier local, vous devez utiliser le bouton "Chercher"';
+            $.notify(error, 'error');
+            return;
+        }
+    } else if (fileContainer !== "") {// si on utilise le fichier uploadé
+
+        var files = document.getElementById(fileContainer).files;
+        if (!files.length) {
+            $.notify('Veuillez sélectionner un fichier', 'error');
+            return;
+        }
+        var file = files[0];
+        var reader = new FileReader();
+
+        // If we use onloadend, we need to check the readyState.
+        reader.onloadend = function (evt) {
+            if (evt.target.readyState === FileReader.DONE) { // DONE == 2
+
+                // Récupère l'objet oTree depuis la chaine de caractères
+                var oTree = $.parseJSON(evt.target.result);
+                // Cange les variables oLayersTree et aLayersList des objets dans les layers tools
+                oVmap.getMapManager().setLayersTree(oTree);
+                // Simule le click de la souris sur le bouton "btn-reload-map"
+                oVmap.getMapManager().reloadMap();
+            }
+        };
+        reader.readAsText(file);
+    } else {
+        $.notify('Veuillez sélectionner un fichier', 'error');
+        return;
+    }
+    oVmap.simuleClick('close-modal-button');
+};
+
+/**
+ * Reload the map
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.reloadMap = function () {
+    oVmap.log('nsVmap.nsMapManager.MapManager.reloadMap');
+
+    var scope = angular.element($("#layertree")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].reloadTree();
+    });
+};
+
+/**
+ * Load the catalog array from the json file
+ * @param {string} sUrl url to the file
+ * @return {object<oMapCatalog>}
+ */
+nsVmap.nsMapManager.MapManager.prototype.ajaxGetMapCatalog = function (sUrl) {
+    var oMapCatalog;
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': sUrl,
+        'async': false,
+        'responseType': '',
+        'success': function (response) {
+            var data = JSON.parse(response['data']);
+            if (goog.isDef(data['mapcatalogs'])) {
+                oMapCatalog = data['mapcatalogs'][0];
+            }
+        }
+    });
+
+    return oMapCatalog;
+};
+
+/**
+ * Load the layers tree from the json file
+ * @param {string} sUrl url to the file
+ * @param {function} callback callback function, takes the tree on first param
+ * @return {object<LayersTree>}
+ */
+nsVmap.nsMapManager.MapManager.prototype.getAjaxLayersTree = function (sUrl, callback) {
+    var LayersTree;
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': sUrl,
+        'responseType': '',
+        'ajaxLoader': true,
+        'success': function (response) {
+            var data = JSON.parse(response['data']);
+            if (goog.isDef(data['mapjsons'])) {
+                LayersTree = data['mapjsons'][0];
+            }
+
+            oVmap.log(LayersTree);
+            callback.call(this, LayersTree);
+        }
+    });
+};
+
+/**
+ * Remove the selection layers
+ */
+nsVmap.nsMapManager.MapManager.prototype.removeSelectionLayers = function () {
+    oVmap.log("removeSelectionLayers");
+    var map = oVmap.getMap().getOLMap();
+    var aLayers = map.getLayers().getArray();
+    for (var i = aLayers.length - 1; i >= 0; i--) {
+        if (aLayers[i].get('type') === 'selection') {
+            map.removeLayer(aLayers[i]);
+        }
+    }
+    ;
+};
+
+/**
+ * Remove the selection features
+ */
+nsVmap.nsMapManager.MapManager.prototype.removeSelectionFeatures = function () {
+    oVmap.log("removeSelectionFeatures");
+    var featureOverlay = oVmap.getMap().getSelectionOverlay();
+    var aFeatures = featureOverlay.getSource().getFeatures();
+    for (var i = aFeatures.length - 1; i >= 0; i--) {
+        featureOverlay.getSource().removeFeature(aFeatures[i])
+    }
+};
+
+/**
+ * Collapse in/out the tool
+ * @param {object} element html trigger element witch have a "data-target" attr with is the #id of the target
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.collapseElement = function (element) {
+    var collapse = element.getAttribute("collapse");
+    var targetElement = $(element.getAttribute("data-target"))[0];
+
+    if (collapse === "in") {
+        element.setAttribute("collapse", "out");
+        $(element).find('.list-group-icon2').removeClass('icon-keyboard_arrow_down');
+        $(element).find('.list-group-icon2').addClass('icon-keyboard_arrow_right');
+    } else if (collapse === "out") {
+        element.setAttribute("collapse", "in");
+        $(element).find('.list-group-icon2').removeClass('icon-keyboard_arrow_right');
+        $(element).find('.list-group-icon2').addClass('icon-keyboard_arrow_down');
+    } else
+        console.error("value 'collapse' of element is not allowed: " + element);
+
+    targetElement.setAttribute("collapse", element.getAttribute("collapse"));
+    oVmap.resizeLayerTools(true);
+};
+
+/**
+ * Add the proxy to the wms/wmts... url
+ * @param {string} url
+ * @returns {String}
+ */
+nsVmap.nsMapManager.MapManager.prototype.parseProxyUrl = function (url) {
+
+    if (!goog.isDef(url))
+        return undefined;
+
+    var proxyUrl = oVmap['properties']['proxy_url'];
+
+    url = url.replace(/\?/g, "&");
+
+    var parsedProxyUrl = proxyUrl + '?url=' + url;
+
+    return parsedProxyUrl;
+};
+
+/**
+ * Add the proxy to the wms/wmts... urls
+ * @param {array<string>} aUrls
+ * @returns {Array<string>}
+ */
+nsVmap.nsMapManager.MapManager.prototype.parseProxyUrls = function (aUrls) {
+
+    if (!goog.isDef(aUrls))
+        return undefined;
+
+    var parsedProxyUrls = [];
+
+    for (var i = 0; i < aUrls.length; i++) {
+        parsedProxyUrls.push(this.parseProxyUrl(aUrls[i]));
+    }
+
+    return parsedProxyUrls;
+};
+
+/**
+ * Reload the layers implicated by the event_id
+ * @param {string} sEventId
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.reloadEventLayers = function (sEventId) {
+
+    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var keepLoadedTiles = true;
+
+    if (goog.isDefAndNotNull(oVmap['properties']['controls']))
+        if (goog.isDefAndNotNull(oVmap['properties']['controls']['RefreshSocket']))
+            if (goog.isDefAndNotNull(oVmap['properties']['controls']['RefreshSocket']['keep_loaded_tiles']))
+                keepLoadedTiles = oVmap['properties']['controls']['RefreshSocket']['keep_loaded_tiles'];
+
+    for (var i = 0; i < aLayers.length; i++) {
+        var aEvents = aLayers[i].get('events');
+        if (goog.isDefAndNotNull(aEvents)) {
+            if (aEvents.indexOf(sEventId) !== -1) {
+                aLayers[i].refreshWithTimestamp(keepLoadedTiles);
+            }
+        }
+        delete aEvents;
+    }
+};
+
+/**
+ * Get a tiled layer from an image layer
+ * @param {ol.layer.Image} imageLayer Image layer
+ * @param {object} tile_options
+ * @param {array} tile_options.tileSize size of the tiles
+ * @param {array} tile_options.tileOrigin origin of the tiles
+ * @returns {ol.layer.Tile} Tiled layer
+ */
+nsVmap.nsMapManager.MapManager.prototype.getImageWMSFromTiledWMS = function (imageLayer, tile_options) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getImageWMSFromTiledWMS');
+    oVmap.log("tile_options: ", tile_options);
+
+    var imageSource = imageLayer.getSource();
+    var olMap = oVmap.getMap().getOLMap();
+    var resolutions = [];
+    var projection = olMap.getView().getProjection();
+    var maxResolution = ol.extent.getWidth(projection.getExtent()) / 256;
+    var tileSize = goog.isDef(tile_options.tileSize) ? tile_options.tileSize : [2000, 2000];
+    var origin = goog.isDef(tile_options.tileOrigin) ? tile_options.tileOrigin : [projection.getExtent()[0], projection.getExtent()[3]];
+
+    for (var i = 0; i < 18; i++) {
+        resolutions[i] = maxResolution / Math.pow(2, i);
+    }
+
+    var tileGrid = new ol.tilegrid.TileGrid({
+        origin: origin,
+        resolutions: resolutions,
+        tileSize: tileSize
+    });
+
+
+    var tileSource = new ol.source.TileWMS({
+        attributions: imageSource.attributions_,
+        params: imageSource.params_,
+        crossOrigin: imageSource.crossOrigin_,
+        hidpi: imageSource.hidpi_,
+        logo: imageSource.logo_,
+        tileGrid: tileGrid,
+        projection: imageSource.projection_,
+        serverType: imageSource.serverType_,
+        url: imageSource.url_,
+        wrapX: imageSource.wrapX_
+    });
+
+    var tiledLayer = new ol.layer.Tile({
+        opacity: imageSource.values_.opacity,
+        source: tileSource,
+        visible: imageSource.values_.visible,
+        minResolution: imageSource.values_.minResolution,
+        maxResolution: imageSource.values_.maxResolution
+    });
+
+    return tiledLayer;
+};
+
+/**
+ * Use getImageWMSFromTiledWMS to set non visible the imageWMS layers and add the tileWMS copys layers
+ * @param {object} tile_options
+ * @param {array} tile_options.tileSize size of the tiles
+ * @param {array} tile_options.tileOrigin origin of the tiles
+ */
+nsVmap.nsMapManager.MapManager.prototype.changeImageWMSLayersToTiledWMS = function (tile_options) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.changeImageWMSLayersToTiledWMS');
+
+    var this_ = this;
+    var olMap = oVmap.getMap().getOLMap();
+    var olLayers = olMap.getLayers();
+
+    /**
+     * Container of the layers removed by changeImageWMSFromTiledWMS()
+     */
+    this.removedImageLayers_ = [];
+
+    /**
+     * Container of the layers added by changeImageWMSFromTiledWMS()
+     */
+    this.addedImageLayers_ = [];
+
+    olLayers.forEach(function (oLayer) {
+        if (oLayer.getSource() instanceof ol.source.ImageWMS && oLayer.getVisible()) {
+
+            // Copie de la couche en version tuilée
+            var tiledLayer = this_.getImageWMSFromTiledWMS(oLayer, tile_options);
+
+            // Mémorise la couche dans this.removedImageLayers_
+            this_.removedImageLayers_.push(oLayer);
+
+            // Mémorise la couche dans this.removedImageLayers_
+            this_.addedImageLayers_.push(tiledLayer);
+
+            // Ajoute la couche tiled
+            olMap.addLayer(tiledLayer);
+
+            // Rend invisible la couche image
+            oLayer.setVisible(false);
+        }
+    });
+};
+
+/**
+ * Revert the changed made by changeImageWMSLayersToTiledWMS()
+ */
+nsVmap.nsMapManager.MapManager.prototype.revertImageWMSToTiledWMS = function () {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.revertImageWMSToTiledWMS');
+
+    var olMap = oVmap.getMap().getOLMap();
+
+    // rend visible les couches précédament rendues invisibles
+    if (goog.isDefAndNotNull(this.removedImageLayers_)) {
+        for (var i = 0; i < this.removedImageLayers_.length; i++) {
+            this.removedImageLayers_[i].setVisible(true);
+        }
+    }
+
+    // Supprime les couches précédament ajoutées
+    if (goog.isDefAndNotNull(this.addedImageLayers_)) {
+        for (var i = 0; i < this.addedImageLayers_.length; i++) {
+            olMap.removeLayer(this.addedImageLayers_[i]);
+        }
+    }
+};
+
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+/**
+ * oLayersTree_ getter
+ * @return {nsVmap.nsMapManager.LayersTree} LayersTree tool
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.getLayersTreeTool = function () {
+    return this.oLayersTreeTool_;
+};
+
+/**
+ * oLayersOrderTool_ getter
+ * @return {nsVmap.nsMapManager.LayersOrder} LayersOrder tool
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.getLayersOrderTool = function () {
+    return this.oLayersOrderTool_;
+};
+
+/**
+ * oMapLegendTool_ getter
+ * @return {nsVmap.nsMapManager.MapLegend} MapLegend tool
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMapLegendTool = function () {
+    return this.oMapLegendTool_;
+};
+
+/**
+ * oMapModalTool_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.MapModal} MapModal tool
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMapModalTool = function () {
+    return this.oMapModalTool_;
+};
+
+/**
+ * LayersTree_ getter (also set the visibility of the layers with the new ones)
+ * @return {object} Layers tree
+ * @api experimental
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getLayersTree = function () {
+
+    var oMap = oVmap.getMap().getOLMap();
+    var aLayers = oMap.getLayers().getArray();
+
+    /**
+     * Recursive function that update parameters recursively
+     * @param {object} node
+     */
+    var updateOnTree = function (node) {
+        // Recursive
+        if (goog.isDef(node['children'])) {
+            for (var i = 0; i < node['children'].length; i++) {
+                updateOnTree(node['children'][i]);
+            }
+        }
+        // Update
+        if (goog.isDef(node['olLayer'])) {
+            node['visible'] = node['olLayer'].getVisible();
+            node['index'] = aLayers.indexOf(node['olLayer']);
+            node['opacity'] = node['olLayer'].getOpacity();
+        }
+    };
+
+    for (var i = 0; i < this.oLayersTree_['children'].length; i++) {
+        updateOnTree(this.oLayersTree_['children'][i]);
+    }
+
+    return this.oLayersTree_;
+};
+
+/**
+ * Get the JSON layers tree
+ * @returns {String}
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getJSONLayersTree = function () {
+
+    // recupère une copie de l'arbre des couches
+    var oLayersTree = jQuery.extend(true, {}, oVmap.getMapManager().getLayersTree());
+    var oMap = oVmap.getMap().getOLMap();
+    var aDiscardedAttributes = [
+        'olLayer',
+        '$$hashKey',
+        'visibleLayers'
+    ];
+
+    /**
+     * Recursive function that cleans the nodes of layers tree
+     * @param {object} node
+     */
+    var cleanNode = function (node) {
+        if (goog.isDef(node['children'])) {
+            for (var i = 0; i < node['children'].length; i++) {
+                cleanNode(node['children'][i]);
+            }
+        }
+        // Supprime les objets à structure circulaire (non transformables en JSON)
+        for (var i = 0; i < aDiscardedAttributes.length; i++) {
+            if (goog.isDef(node[aDiscardedAttributes[i]])) {
+                delete node[aDiscardedAttributes[i]];
+            }
+        }
+        if (goog.isDef(node['view'])) {
+            node['view']['extent'] = oMap.getView().calculateExtent(oMap.getSize());
+            node['view']['projection'] = oMap.getView().getProjection().getCode();
+        }
+        if (node['layerType'] === 'imagevector') {
+            if (goog.isDefAndNotNull(node['features'])) {
+                delete node['features'];
+                node['features'] = [];
+            }
+        }
+    };
+
+    // Nettoie les paramètres définis par aDiscardedAttributes
+    for (var i = 0; i < oLayersTree['children'].length; i++) {
+        cleanNode(oLayersTree['children'][i]);
+    }
+
+    // Convertit en JSON tout en ignorant les objets de structure circulaire
+    var cache = [];
+    var sJSONLayersTree = JSON.stringify(oLayersTree, function (key, value) {
+        if (typeof value === 'object' && value !== null) {
+            if (cache.indexOf(value) !== -1) {
+                // Circular reference found
+                return;
+            }
+            cache.push(value);
+        }
+        return value;
+    });
+    cache = null;
+
+    return sJSONLayersTree;
+};
+
+/**
+ * LayersTree_ setter
+ * @param {object} oTree Layers tree
+ * @api experimental
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.setLayersTree = function (oTree) {
+    this.oLayersTree_ = oTree;
+};
+
+/**
+ * oMapCatalog_ getter
+ * @return {array} map catalog
+ * @api experimental
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMapCatalog = function () {
+    return this.oMapCatalog_;
+};
+
+/**
+ * oMapCatalog_ setter
+ * @param {array} aCatalog Map catalog array
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.setMapCatalog = function (aCatalog) {
+    this.oMapCatalog_ = aCatalog;
+};
+
+/**
+ * sMapToLoadUrl_ getter
+ * @return {string} the url when calling loadMap
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMapToLoadUrl = function () {
+    return this.sMapToLoadUrl_;
+};
+
+/**
+ * sMapToLoadUrl_ setter
+ * @param {string} sMapToLoadUrl the url when calling loadMap
+ * @api experimental
+ */
+nsVmap.nsMapManager.MapManager.prototype.setMapToLoadUrl = function (sMapToLoadUrl) {
+    this.sMapToLoadUrl_ = sMapToLoadUrl;
+};
+
+/**
+ * Get the list of the queryable by layer_id layers
+ * @param {boolean} bOnlyVisible true if you want to get only the visible layers
+ * @returns {Array} List of the queryable layers
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getQueryableLayers = function (bOnlyVisible) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableLayers');
+
+    bOnlyVisible = goog.isDef(bOnlyVisible) ? bOnlyVisible : false;
+    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var aQueryableLayers = [];
+
+    for (var i = 0; i < aLayers.length; i++) {
+        if ((aLayers[i].get('bo_queryable') === true) && goog.isDef(aLayers[i].get('layer_id'))) {
+            if (bOnlyVisible !== true || aLayers[i].getVisible() === true) {
+                aQueryableLayers.push(aLayers[i]);
+            }
+        }
+    }
+    return aQueryableLayers;
+};
+
+/**
+ * Get the businessObjects from the passed layers
+ * @param {array} aLayers
+ * @returns {array}
+ */
+nsVmap.nsMapManager.MapManager.prototype.getBusinessObjectsFromLayers = function (aLayers) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getBusinessObjectsFromLayers');
+
+    var oBusinessObjects = {};
+    var aBos, bo_id;
+
+    for (var i = 0; i < aLayers.length; i++) {
+        aBos = aLayers[i].get('business_objects');
+        for (var ii = 0; ii < aBos.length; ii++) {
+            bo_id = aBos[ii]['business_object_id'];
+
+            // Si le bo est déjà dans la liste
+            if (goog.isDefAndNotNull(oBusinessObjects[bo_id])) {
+                oBusinessObjects[bo_id]['layers'].push(aLayers[i]);
+                continue;
+            }
+
+            oBusinessObjects[bo_id] = {
+                'bo_id': bo_id,
+                'layers': [aLayers[i]],
+                'bo_title': aBos[ii]['title'],
+                'bo_id_field': aBos[ii]['id_field'],
+                'bo_user_rights': aBos[ii]['user_rights'],
+                'bo_search_field': aBos[ii]['search_field'],
+                'bo_result_field': aBos[ii]['result_field'],
+                'bo_search_use_strict': aBos[ii]['search_use_strict'],
+                'bo_selection_buffer': aBos[ii]['selection_buffer'],
+                'bo_geom_column': aBos[ii]['geom_column'],
+                'bo_geom_type': aBos[ii]['geom_type'],
+                'bo_min_edition_scale': aBos[ii]['min_edition_scale'],
+                'bo_max_edition_scale': aBos[ii]['max_edition_scale'],
+                'bo_index': goog.isDefAndNotNull(aBos[ii]['index']) ? aBos[ii]['index'] : 1000000
+            };
+        }
+    }
+
+    return oBusinessObjects;
+};
+
+/**
+ * Use getQueryableLayers to get the queryable business objects, group by bo_id if the same bo is used by two different layers
+ * @param {boolean} bOnlyVisible true if you want to get only the visible layers
+ * @returns {object} the queryables business objects
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects = function (bOnlyVisible) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects');
+
+    var oBusinessObjects = this.getBusinessObjectsFromLayers(this.getQueryableLayers(bOnlyVisible));
+    var oQueryableBOs = {};
+
+    for (var key in oBusinessObjects) {
+        if (goog.isDefAndNotNull(oBusinessObjects[key]['bo_user_rights'])) {
+            if (oBusinessObjects[key]['bo_user_rights'].indexOf('SELECT') !== -1) {
+                oQueryableBOs[key] = oBusinessObjects[key];
+            }
+        }
+    }
+
+    return oQueryableBOs;
+};
+
+/**
+ * Use getQueryableLayers to get the queryable business objects, group by bo_id if the same bo is used by two different layers
+ * @param {boolean} bOnlyVisible true if you want to get only the visible layers
+ * @returns {array} the queryables business objects
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjectsAsArray = function (bOnlyVisible) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjectsAsArray');
+
+    var aQueryableBOs = [];
+    var oQueryableBOs = this.getQueryableBusinessObjects(bOnlyVisible);
+
+    for (var key in oQueryableBOs) {
+        aQueryableBOs.push(oQueryableBOs[key]);
+    }
+
+    return aQueryableBOs;
+};
+
+/**
+ * getQueryableGetFeatureInfoLayers function - Récupère la liste des couches permettant le GetFeatureInfo
+ *
+ * @param  {boolean} bOnlyVisible true pour recevoir uniquement les couches visibles
+ * @return {array}
+ */
+nsVmap.nsMapManager.MapManager.prototype.getQueryableGetFeatureInfoLayers = function (bOnlyVisible) {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableGetFeatureInfoLayers');
+
+    var aQueryableLayers = [];
+    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+
+    for (var i = 0; i < aLayers.length; i++) {
+        if (bOnlyVisible && !aLayers[i].getVisible()) {
+            continue;
+        } else {
+            if (aLayers[i].get('is_queryable_getfeatureinfo')) {
+                // Si le GetFeatureInfo est ectivé
+                if (goog.isDefAndNotNull(oVmap['properties'])) {
+                    if (goog.isDefAndNotNull(oVmap['properties']['selection'])) {
+                        if (goog.isDefAndNotNull(oVmap['properties']['selection']['enable_getfeatureinfo'])) {
+                            if (oVmap['properties']['selection']['enable_getfeatureinfo']) {
+                                if (aLayers[i].get('wms_queryable') === true || aLayers[i].get('wms_queryable') === null) {
+                                    aQueryableLayers.push(aLayers[i]);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return aQueryableLayers;
+};
+
+/**
+ * Get the insertable business objects
+ * @returns {object}
+ * @export
+ */
+nsVmap.nsMapManager.MapManager.prototype.getInsertableBusinessObjects = function () {
+    oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getInsertableBusinessObjects');
+
+    var oBusinessObjects = this.getBusinessObjectsFromLayers(this.getQueryableLayers());
+    var aInsertableBOs = [];
+
+    for (var key in oBusinessObjects) {
+        if (goog.isDefAndNotNull(oBusinessObjects[key]['bo_user_rights'])) {
+            if (oBusinessObjects[key]['bo_user_rights'].indexOf('INSERT') !== -1) {
+                aInsertableBOs.push(oBusinessObjects[key]);
+            }
+        }
+    }
+
+    return aInsertableBOs;
+};
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/bingsuggestions.js b/module/javascript/app/vmap/mapmanager/mapmodal/bingsuggestions.js
new file mode 100755
index 0000000000000000000000000000000000000000..01251a42440bf24cca798a527d2720dd0e841243
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/bingsuggestions.js
@@ -0,0 +1,126 @@
+/* global oVmap, nsVmap, goog */
+
+/**
+* @author: Armand Bahi
+* @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.BingSuggestions
+* cette classe permet d'afficher les suggestions bing'
+*/
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.BingSuggestions');
+
+goog.require('oVmap');
+
+/**
+* @classdesc
+* Class {@link nsVmap.nsMapManager.nsMapModal.BingSuggestions}: load the map list suggestions
+*
+* @constructor
+* @export
+*/
+nsVmap.nsMapManager.nsMapModal.BingSuggestions = function(){
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.BingSuggestions");
+};
+
+/************************************************
+---------- DIRECTIVES AND CONTROLLERS -----------
+*************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsDirective = function() {oVmap.log("nsVmap.bingsuggestionsDirective");
+  return {
+    restrict: 'E',
+    scope: {
+      'map': '=appMap',
+      'lang': '=appLang'
+    },
+    controller: 'AppBingsuggestionsController',
+    controllerAs: 'ctrl',
+    bindToController: true,
+    templateUrl: oVmap['properties']['vmap_folder'] + '/'+'template/layers/mapmodal/bingsuggestions.html'
+  };
+};
+
+/**
+ * map list controller
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsController = function() {oVmap.log("nsVmap.bingsuggestionsController");
+
+  /**
+  * The maps catalog
+  * @type {object}
+  * @api stable
+  */
+  this.catalog = this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+  /**
+  * The current projection
+  * @type {object}
+  * @api stable
+  */
+  this.projection = this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+  this['properties'] = oVmap['properties'];
+};
+
+/**
+ * Add the layer
+ * @param {object} oLayerOptions
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsController.prototype.addLayer = function(oLayerOptions) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsController.prototype.addLayer');
+    
+    var sKey;
+    var sImagerySet;
+    var sCulture;
+
+    if (goog.isDefAndNotNull(oLayerOptions)) {
+        sKey = oLayerOptions['key'];
+        sImagerySet = oLayerOptions['imagerySet'];
+        sCulture = oLayerOptions['culture'];
+    }else{
+        sKey = this['sKey'];
+        sImagerySet = this['sImagerySet'];
+        sCulture = this['sCulture'];
+    }
+    
+    if (!goog.isDefAndNotNull(sKey) || sKey === '') {
+        $.notify('Veuillez renseigner la clé Bing Maps', 'error');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(sImagerySet) || sImagerySet === '') {
+        $.notify('Veuillez renseigner une couche à utiliser', 'error');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(sCulture) || sCulture === '') {
+        $.notify('Veuillez renseigner une langue à utiliser', 'error');
+        return 0;
+    }
+
+    var oLayer = {};
+    oLayer.layerType = "bing";
+    oLayer.serviceName = 'Bing Maps';
+    oLayer.key = sKey;
+    oLayer.layerName = sImagerySet;
+    oLayer.culture = sCulture;
+    
+    oVmap.getMapManager().addLayer(oLayer);
+};
+
+/**
+ * reload variables
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsController.prototype.reload = function() {
+
+  this.catalog = this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+  this.projection = this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appBingsuggestions', nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsDirective);
+oVmap.module.controller('AppBingsuggestionsController', nsVmap.nsMapManager.nsMapModal.BingSuggestions.prototype.bingsuggestionsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/loadgeometry.js b/module/javascript/app/vmap/mapmanager/mapmodal/loadgeometry.js
new file mode 100755
index 0000000000000000000000000000000000000000..6f8cc64745f570511eaf2e6cdfd5daeb79b4f7d7
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/loadgeometry.js
@@ -0,0 +1,269 @@
+/* global oVmap, FileReader, goog, nsVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.LoadGeometry
+ * cette classe permet d'afficher les suggestions geometry'
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.LoadGeometry');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.LoadGeometry}: load the map list suggestions
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.LoadGeometry = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.LoadGeometry");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryDirective = function () {
+    oVmap.log("nsVmap.loadgeometryDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppLoadgeometryController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/loadgeometry.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @ngInject
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryController = function ($scope) {
+    oVmap.log("nsVmap.loadgeometryController");
+
+
+    var this_ = this;
+    this.$scope = $scope;
+
+    /**
+     * Id of the html element witch contains the file
+     * @type string
+     */
+    this.sFileContainer;
+
+    /**
+     * The selected file
+     * @type object
+     */
+    $scope['oSelectedFile'] = {};
+
+    /**
+     * The selected file name
+     * @type string
+     */
+    $scope['sFileName'] = '';
+
+    /**
+     * Service to add name
+     * @type string
+     */
+    $scope['sServiceName'] = '';
+
+    /**
+     * Layer to add name
+     * @type string
+     */
+    $scope['sLayerTitle'] = '';
+
+    /**
+     * True if the function needs to search from an url, 
+     * false from a file ginven in this.sFileContainer
+     * @type boolean
+     */
+    $scope['bIsUrl'] = false;
+
+    /**
+     * The html drop zone
+     * @type {object}
+     * @api stable
+     */
+    var dropZone = document.getElementById('upload-geometry-file-drop-zone');
+
+    /**
+     * The html browse element
+     * @type {object}
+     * @api stable
+     */
+    var browseButton = document.getElementById('browse-geometry-button');
+
+
+    // Active et configure le bouton browse
+
+    /**
+     * Function called after the browse event
+     * @function
+     */
+    var fileChanged = function () {
+
+        var element = this;
+
+        // Informe qui porte le fichier
+        this_.sFileContainer = element.id;
+
+        // Applique les changements sur le scope
+        $scope.$applyAsync(function () {
+            $scope['oSelectedFile'] = element.files[0];
+            $scope['bIsUrl'] = false;
+            if (goog.isDefAndNotNull($scope['oSelectedFile'])) {
+                $scope['sFileName'] = angular.copy($scope['oSelectedFile']['name']);
+            } else {
+                $scope['sFileName'] = '';
+            }
+        });
+    };
+
+    browseButton.addEventListener('change', fileChanged, false);
+
+
+    // Active et configure le drag and drop
+
+    /**
+     * Function called after the drop event
+     * @function
+     * @api experimental
+     */
+    var ondrop = function (event) {
+        event.stopPropagation();
+        event.preventDefault();
+        var files = event.dataTransfer.files;
+        this.files = files;
+
+        // Informe qui porte le fichier
+        this_.sFileContainer = this.id;
+
+        // Applique les changements sur le scope
+        $scope.$applyAsync(function () {
+            $scope['oSelectedFile'] = files[0];
+            $scope['bIsUrl'] = false;
+            if (goog.isDefAndNotNull($scope['oSelectedFile'])) {
+                $scope['sFileName'] = angular.copy($scope['oSelectedFile']['name']);
+            } else {
+                $scope['sFileName'] = '';
+            }
+        });
+
+        this.className = 'upload-drop-zone';
+        return false;
+    }
+
+    /**
+     * Function called after the dragover event
+     * @function
+     * @api experimental
+     */
+    var ondragover = function (event) {
+        this.className = 'upload-drop-zone drop';
+        event.stopPropagation();
+        event.preventDefault();
+        event.dataTransfer.dropEffect = 'copy';
+        return false;
+    }
+
+    /**
+     * Function called after the dragleave event
+     * @function
+     * @api experimental
+     */
+    var ondragleave = function () {
+        this.className = 'upload-drop-zone';
+        return false;
+    }
+
+    dropZone.addEventListener('dragover', ondragover, false);
+    dropZone.addEventListener('dragleave', ondragleave, false);
+    dropZone.addEventListener('drop', ondrop, false);
+};
+
+/**
+ * Adds the layer
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryController.prototype.addLayer = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryController.prototype.addLayer');
+
+    var this_ = this;
+
+    var fileContainer = this.sFileContainer;
+    var url = this.$scope['sFileName'];
+    var serviceName = this.$scope['sServiceName'];
+    var layerTitle = this.$scope['sLayerTitle'];
+
+    // Noms par défaut
+    serviceName = serviceName !== '' ? serviceName : 'Local';
+    layerTitle = layerTitle !== '' ? layerTitle : 'Local';
+
+    if (serviceName === "" || layerTitle === "") {
+        $.notify('Veuillez renseigner les noms du service et de la couche', 'error');
+        return;
+    }
+
+    if (this.$scope['bIsUrl'] && url !== "") {// si on utilise l'url
+
+        if (url.substr(0, 4) !== 'http') {
+            $.notify('URL incorrecte');
+            return;
+        }
+        showAjaxLoader();
+        $.get(url).done(function (data) {
+            hideAjaxLoader();
+            if (oVmap.getMapManager().addLayerFromVectorContent(data, serviceName, layerTitle)) {
+                oVmap.simuleClick('close-modal-button');
+            }
+        }).error(function (data) {
+            hideAjaxLoader();
+            $.notify('impossible de charger le contenu de l\'URL');
+        });
+
+    } else if (goog.isString(fileContainer) && fileContainer !== '') {// si on utilise le fichier uploadé
+
+        var files = document.getElementById(fileContainer).files;
+        if (!files.length) {
+            $.notify('Veuillez sélectionner un fichier ou une url', 'error');
+            return;
+        }
+        var file = files[0];
+        var reader = new FileReader();
+
+        layerTitle = layerTitle !== 'Local' ? layerTitle : file['name'];
+
+        // If we use onloadend, we need to check the readyState.
+        reader.onloadend = function (evt) {
+            if (evt.target.readyState === FileReader.DONE) {
+                if (oVmap.getMapManager().addLayerFromVectorContent(evt.target.result, serviceName, layerTitle)) {
+                    oVmap.simuleClick('close-modal-button');
+                }
+            }
+        };
+        reader.readAsText(file);
+    } else {
+        $.notify('Veuillez sélectionner un fichier ou une URL', 'error');
+        return;
+    }
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appLoadgeometry', nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryDirective);
+oVmap.module.controller('AppLoadgeometryController', nsVmap.nsMapManager.nsMapModal.LoadGeometry.prototype.loadgeometryController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/maplist.js b/module/javascript/app/vmap/mapmanager/mapmodal/maplist.js
new file mode 100644
index 0000000000000000000000000000000000000000..98baa60b3fc587cd8077f860f01f3c58d8c9284e
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/maplist.js
@@ -0,0 +1,219 @@
+/* global oVmap, nsVmap, goog, ol */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.MapList
+ * cette classe permet d'afficher la liste des cartes disponibles
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.MapList');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.MapList}: load the map list tool
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapList = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapList");
+};
+
+/**
+ *
+ * @param {object} element
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.changeFilePath = function (element) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.MapList.prototype.changeFilePath');
+
+    var fileName = $(element).val();
+    var lastBackslash = fileName.lastIndexOf('\\');
+
+    if (lastBackslash !== -1) {
+        fileName = fileName.slice(lastBackslash + 1);
+    }
+
+    $("#upload-file-info").val(fileName);
+
+    $("#upload-file-add-button").attr("url", "");
+
+    $("#upload-file-add-button").attr("file-container", element.id);
+};
+
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppMaplistController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/maplist.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @constructor
+ * @ngInject
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController");
+
+    /**
+     * Future map url
+     * @type {string}
+     */
+    this['newMapUrl'] = '';
+
+    /**
+     * The maps catalog
+     * @type {object}
+     */
+    this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+
+    /**
+     * @type object
+     */
+    this['projections'] = oVmap['oProjections'];
+
+
+    this['mapForm'] = {
+        'view': {}
+    };
+
+    // Active et configure le drag and drop
+
+    /**
+     * The html drop zone
+     * @type {object}
+     * @api stable
+     */
+    var dropZone = document.getElementById('maplist-file-drop-zone');
+
+    /**
+     * Function called after the drop event
+     * @function
+     * @api experimental
+     */
+    var ondrop = function (event) {
+        event.stopPropagation();
+        event.preventDefault();
+        var files = event.dataTransfer.files;
+        this.files = files;
+        $('#upload-file-info').val(files[0].name);
+        $('#upload-file-add-button').attr("file-container", this.id);
+
+        this.className = 'upload-drop-zone';
+        return false;
+    };
+
+    /**
+     * Function called after the dragover event
+     * @function
+     * @api experimental
+     */
+    var ondragover = function (event) {
+        this.className = 'upload-drop-zone drop';
+        event.stopPropagation();
+        event.preventDefault();
+        event.dataTransfer.dropEffect = 'copy';
+        return false;
+    };
+
+    /**
+     * Function called after the dragleave event
+     * @function
+     * @api experimental
+     */
+    var ondragleave = function () {
+        this.className = 'upload-drop-zone';
+        return false;
+    };
+
+    dropZone.addEventListener('dragover', ondragover, false);
+    dropZone.addEventListener('dragleave', ondragleave, false);
+    dropZone.addEventListener('drop', ondrop, false);
+
+};
+
+/**
+ * Initialize the "new map" form
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController.prototype.initNewMapForm = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.MapList.prototype.initNewMapForm');
+
+    this['mapForm']['view'] = {
+        'center': this['map'].getView().getCenter(),
+        'zoom': this['map'].getView().getZoom(),
+        'maxZoom': 28,
+        'minZoom': 0,
+        'projection': this['map'].getView().getProjection().getCode()
+    };
+};
+
+/**
+ * Creates a new map
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController.prototype.createNewMap = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.MapList.prototype.createNewMap');
+
+    var newMap = {
+        "name": "Tree",
+        "children": [{
+                "view": this['mapForm']['view']
+            }]
+    };
+
+
+    // Change la variable oLayersTree
+    oVmap.getMapManager().setLayersTree(newMap);
+
+    // Simule le click de la souris sur le bouton "btn-reload-map"
+    oVmap.getMapManager().reloadMap();
+
+    // Met toutes les cartes à used = false
+    var oMapCatalog_ = oVmap.getMapManager().getMapCatalog();
+    for (var i = 0; i < oMapCatalog_['maps'].length; i++) {
+        oMapCatalog_['maps'][i]['used'] = false;
+    }
+
+    // Recharge la légende et l'outil 'projection en cours'
+    oVmap.layerAdded();
+    $("#map-name").html('Nouvelle carte');
+};
+
+/**
+ * Reproject the center whan changing map
+ */
+nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController.prototype.reprojectCenter = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController.prototype.reprojectCenter');
+
+    var currentProjeciton = this['map'].getView().getProjection();
+    var projectedCoordinates = ol.proj.transform(this['mapForm']['view']['center'], currentProjeciton, this['mapForm']['view']['projection']);
+
+    this['mapForm']['view']['center'] = projectedCoordinates;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMaplist', nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistDirective);
+oVmap.module.controller('AppMaplistController', nsVmap.nsMapManager.nsMapModal.MapList.prototype.maplistController);
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js b/module/javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js
new file mode 100644
index 0000000000000000000000000000000000000000..bd1150b4f386c2807fa30a27b3638aeeb84a8c26
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js
@@ -0,0 +1,199 @@
+/* global oVmap, nsVmap, goog */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.MapListLitle
+ * cette classe permet d'afficher la liste des cartes disponibles
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.MapListLitle');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.MapListLitle}: load the map list litle tool
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapListLitle = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapListLitle");
+};
+
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppMaplistlitleController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/' + (oVmap['properties']['is_mobile'] ? 'maplistlitle_mobile.html' : 'maplistlitle.html')
+    };
+};
+
+/**
+ * map list controller
+ * @param {object} $scope the current scope
+ * @export
+ * @constructor
+ * @ngInject
+ */
+nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleController = function ($scope) {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleController");
+
+    var maplistlitleController = this;
+    var scope = $scope;
+
+    /**
+     * The maps catalog
+     * @type {object}
+     */
+    this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+
+    /**
+     * Filter string
+     * @type string
+     */
+    $scope['filter'] = "";
+
+    /**
+     * Map themes
+     * @type array
+     */
+    $scope['themes'] = this.getMapThemes(this['catalog']['maps']);
+
+    /**
+     * Displayed maps grouped by themes
+     * @type object
+     */
+    $scope['mapsByThemes'] = [];
+
+    /**
+     * @private
+     */
+    $scope['filterTheme'] = "";
+
+    // Filtre le résultat
+    $scope.$watchGroup(['filter', 'filterTheme'], function () {
+
+        var filteredArray = goog.array.filter(maplistlitleController['catalog']['maps'], function (element, index, array) {
+
+            var filter = String(scope['filter']).toLowerCase().withoutAccents();
+            var name = String(element['name']).toLowerCase().withoutAccents();
+            var description = String(element['description']).toLowerCase().withoutAccents();
+            var themeName = String(element['theme_name']).toLowerCase().withoutAccents();
+            themeName = (themeName === 'null') ? 'autres' : themeName;
+
+            // Vérifie si la carte est conforme au filter
+            if (name.indexOf(filter) !== -1 || description.indexOf(filter) !== -1 || themeName.indexOf(filter) !== -1) {
+
+                // Vérifie si la carte est conforme au theme selectionné
+                if ($scope['filterTheme'] === '' || $scope['filterTheme'].toLowerCase().withoutAccents() === themeName) {
+                    return true;
+                } else {
+                    return false;
+                }
+            } else
+                return false;
+
+        });
+
+        scope['mapsByThemes'] = maplistlitleController.groupMapByThemes(filteredArray);
+    });
+
+    $('body').click(function (e) {
+        try {
+            if (!$.contains($('#maplistlitle-container')[0], $(e.target)[0])) {
+                $('#maplistlitle-container').removeClass('open');
+            }
+        } catch (e) {
+        }
+    });
+
+    $('.maplist-map').click(function () {
+        $('#maplistlitle-container').removeClass('open');
+    });
+};
+
+/**
+ * Group the maps by theme and return a tree
+ * @param {array} aMaps
+ * @returns {object}
+ */
+nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleController.prototype.groupMapByThemes = function (aMaps) {
+
+    var oMapsByThemes = {};
+    var aMapsByThemes = [];
+
+    for (var i = 0; i < aMaps.length; i++) {
+        if (!goog.isDef(oMapsByThemes[aMaps[i]['theme_name']])) {
+            oMapsByThemes[aMaps[i]['theme_name']] = [aMaps[i]];
+        } else {
+            oMapsByThemes[aMaps[i]['theme_name']].push(aMaps[i]);
+        }
+    }
+
+    for (oTheme in oMapsByThemes) {
+        aMapsByThemes.push({
+            'themeName': oTheme,
+            'themeId': oTheme.toLowerCase().withoutAccents(),
+            'maps': oMapsByThemes[oTheme]
+        });
+    }
+
+    // Ordronne alpha
+    goog.array.sortObjectsByKey(aMapsByThemes, 'themeId');
+
+    // Place Autres à la fin
+    var nullThemeIndex;
+    for (var i = 0; i < aMapsByThemes.length; i++) {
+        if(aMapsByThemes[i]['themeId'] === 'null'){
+            nullThemeIndex = angular.copy(i);
+        }
+    }
+    if (goog.isDefAndNotNull(nullThemeIndex) && aMapsByThemes.length > 0) {
+        goog.array.moveItem(aMapsByThemes, nullThemeIndex, aMapsByThemes.length - 1);
+    }
+
+    return aMapsByThemes;
+};
+
+/**
+ * Get the list of the themes
+ * @param {array} aMaps
+ * @returns {Array} themes
+ */
+nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleController.prototype.getMapThemes = function (aMaps) {
+
+    var aThemes = [];
+    var themeName;
+
+    for (var i = 0; i < aMaps.length; i++) {
+        themeName = aMaps[i]['theme_name'] === null ? 'Autres' : aMaps[i]['theme_name'];
+        if (aThemes.indexOf(themeName) === -1) {
+            //  Mémorise le theme en remplaçant null par Autres
+            aThemes.push(themeName);
+        }
+    }
+
+    return aThemes;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMaplistlitle', nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleDirective);
+oVmap.module.controller('AppMaplistlitleController', nsVmap.nsMapManager.nsMapModal.MapListLitle.prototype.maplistlitleController);
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/mapmodal.js b/module/javascript/app/vmap/mapmanager/mapmodal/mapmodal.js
new file mode 100755
index 0000000000000000000000000000000000000000..457f731d1631af7e9aec291fae1916140954eff2
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/mapmodal.js
@@ -0,0 +1,228 @@
+/* global nsVmap, goog, oVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.MapModalManager
+ * cette classe contient les elements de la fenêtre modale permetant la gestion des cartes
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.MapModalManager');
+
+goog.require('oVmap');
+
+goog.require('nsVmap.nsMapManager.nsMapModal.MapList');
+goog.require('nsVmap.nsMapManager.nsMapModal.MapListLitle');
+goog.require('nsVmap.nsMapManager.nsMapModal.MyMap');
+goog.require('nsVmap.nsMapManager.nsMapModal.WMSSuggestions');
+goog.require('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions');
+goog.require('nsVmap.nsMapManager.nsMapModal.XYZSuggestions');
+goog.require('nsVmap.nsMapManager.nsMapModal.LoadGeometry');
+goog.require('nsVmap.nsMapManager.nsMapModal.OSMSuggestions');
+goog.require('nsVmap.nsMapManager.nsMapModal.BingSuggestions');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.MapModalManager}: load the modal map manager
+ *
+ * @param {object} aCatalog Catalog
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager = function (aCatalog) {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MapModalManager");
+    /**
+     * Object which contains the map catalog
+     * @type {array<object>}
+     * @private
+     */
+    this.oMapCatalog_ = aCatalog;
+
+    /** 
+     * Objet which contains the map list litle tool
+     * @type {nsVmap.nsMapManager.nsMapModal.MapListLitle} 
+     * @private
+     */
+    this.oMapListLitle_ = new nsVmap.nsMapManager.nsMapModal.MapListLitle();
+
+    /** 
+     * Objet which contains the map list tool
+     * @type {nsVmap.nsMapManager.nsMapModal.MapList} 
+     * @private
+     */
+    this.oMapList_ = new nsVmap.nsMapManager.nsMapModal.MapList();
+
+    /** 
+     * Objet which contains the map my map
+     * @type {nsVmap.nsMapManager.nsMapModal.MyMap} 
+     * @private
+     */
+    this.oMyMap_ = new nsVmap.nsMapManager.nsMapModal.MyMap();
+
+    /** 
+     * Objet which contains the wms suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.WMSSuggestions} 
+     * @private
+     */
+    this.oWMSSuggestions_ = new nsVmap.nsMapManager.nsMapModal.WMSSuggestions();
+
+    /** 
+     * Objet which contains the wms suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.WMTSSuggestions} 
+     * @private
+     */
+    this.oWMTSSuggestions_ = new nsVmap.nsMapManager.nsMapModal.WMTSSuggestions();
+
+    /**
+     * Objet which contains the geometry suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.LoadGeometry} 
+     * @private
+     */
+    this.oLoadGeometry_ = new nsVmap.nsMapManager.nsMapModal.LoadGeometry();
+
+    /** 
+     * Objet which contains the open street map suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.OSMSuggestions} 
+     * @private
+     */
+    this.oOSMSuggestions_ = new nsVmap.nsMapManager.nsMapModal.OSMSuggestions();
+
+    /** 
+     * Objet which contains the XYZ suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.XYZSuggestions} 
+     * @private
+     */
+    this.oXYZSuggestions_ = new nsVmap.nsMapManager.nsMapModal.XYZSuggestions();
+
+    /** 
+     * Objet which contains the Bing suggestions tool
+     * @type {nsVmap.nsMapManager.nsMapModal.BingSuggestions} 
+     * @private
+     */
+    this.oBingSuggestions_ = new nsVmap.nsMapManager.nsMapModal.BingSuggestions();
+};
+
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.mapmodalDirective = function () {
+    oVmap.log("nsVmap.mapmodalDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'proj': '=appProj',
+            'lang': '=appLang'
+        },
+        controller: 'AppMapmodalController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/mapmodal.html'
+    };
+};
+
+/**
+ * map list controller
+ * @ngInject
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.mapmodalController = function () {
+    oVmap.log("nsVmap.mapmodalController");
+};
+
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+/**
+ * oMapList_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.MapList} Map list tool
+ * @api experimental
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getMapListTool = function () {
+    return this.oMapList_;
+};
+
+/**
+ * oMyMap_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.MyMap} My map tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getMyMapTool = function () {
+    return this.oMyMap_;
+};
+
+/**
+ * oWMSSuggestions_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.WMSSuggestions} WMSSuggestions tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getWMSSuggestionsTool = function () {
+    return this.oWMSSuggestions_;
+};
+
+/**
+ * oOSMSuggestions_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.OSMSuggestions} OSMSuggestions tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getOSMSuggestionsTool = function () {
+    return this.oOSMSuggestions_;
+};
+
+/**
+ * oXYZSuggestions_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.XYZSuggestions} XYZSuggestions tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getXYZSuggestionsTool = function () {
+    return this.oXYZSuggestions_;
+};
+
+/**
+ * oBingSuggestions_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.BingSuggestions} BingSuggestions tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getBingSuggestionsTool = function () {
+    return this.oBingSuggestions_;
+};
+
+/**
+ * oIGNSuggestions_ getter
+ * @return {nsVmap.nsMapManager.nsMapModal.IGNSuggestions} IGNSuggestions tool
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getIGNSuggestionsTool = function () {
+    return this.oIGNSuggestions_;
+};
+
+/**
+ * oMapCatalog_ getter
+ * @return {array} map catalog
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.getMapCatalog = function () {
+    return this.oMapCatalog_;
+};
+
+/**
+ * oMapCatalog_ setter
+ * @param {array} aCatalog Map catalog array
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.setMapCatalog = function (aCatalog) {
+    this.oMapCatalog_ = aCatalog;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMapmodal', nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.mapmodalDirective);
+oVmap.module.controller('AppMapmodalController', nsVmap.nsMapManager.nsMapModal.MapModalManager.prototype.mapmodalController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/mymap.js b/module/javascript/app/vmap/mapmanager/mapmodal/mymap.js
new file mode 100755
index 0000000000000000000000000000000000000000..8e0f0180c3caaf1457493747efef1a8ef534fa20
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/mymap.js
@@ -0,0 +1,156 @@
+/* global oVmap, nsVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.MyMap
+ * cette classe permet d'afficher la liste des cartes disponibles
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.MyMap');
+
+goog.require('oVmap');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.MyMap}: load the my map tool
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * my map directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapDirective = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppMymapController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/mymap.html'
+    };
+};
+
+/**
+ * my map controller
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController");
+
+    /**
+     * Href for the download map button
+     * @type {string}
+     * @api stable
+     */
+    this.mapFileHref = this['mapFileHref'] = '';
+
+    /**
+     * The layers tree
+     * @type {object}
+     * @api stable
+     */
+    this.oLayersTree = this['oLayersTree'] = {};
+
+    /**
+     * The view to apply
+     * @type {ol.View}
+     * @api stable
+     */
+    this.view = this['view'] = {};
+    this['displayedView'] = {};
+
+    var isIE = false || !!document['documentMode'];
+    var isEdge = !isIE && !!window['StyleMedia'];
+
+    this['isIE'] = (isIE === true || isEdge === true);
+};
+
+/**
+ * reload the layers tree view
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.reloadTree = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.reloadTree");
+
+    this['oLayersTree'] = oVmap.getMapManager().getLayersTree();
+
+    this['view'] = {
+        'zoom': oVmap.getMap().getOLMap().getView().getZoom(),
+        'center': oVmap.getMap().getOLMap().getView().getCenter(),
+        'projection': oVmap.getMap().getOLMap().getView().getProjection().getCode(),
+        'extent': this['map'].getView().calculateExtent(this['map'].getSize())
+    };
+
+    this['displayedView'] = {
+        'zoom': this['view']['zoom'],
+        'center': this['view']['center'][0] + ', '+this['view']['center'][1],
+        'projection': oVmap['oProjections'][this['view']['projection']],
+        'extent': this['view']['extent'][0] + ', ' + this['view']['extent'][1] + ', ' + this['view']['extent'][3] + ', ' + this['view']['extent'][3]
+    };
+
+    this.reloadMapFile();
+
+    $('[data-toggle="tooltip"]').tooltip();
+};
+
+/**
+ * Remove a layer from the map and the layers tree
+ * @param {ol.layer.Base} olLayer Layer to remove
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.removeLayer = function (olLayer) {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.removeLayer");
+
+    oVmap.getMapManager().removeLayer(olLayer);
+    this.reloadTree();
+};
+
+/**
+ * Set the map.json file to download in the exportMapButton button
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.reloadMapFile = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.reloadMapFile");
+
+    var sMapFile = oVmap.getMapManager().getJSONLayersTree();
+
+    var data = "data:text/json;charset=utf-8," + encodeURIComponent(sMapFile);
+
+    this['mapFileHref'] = data;
+    $("#exportMapButton").attr("href", data);
+};
+
+/**
+ * Download the JSONLayersTree using msSaveBlob (only for windows)
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.downloadBlob = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController.prototype.downloadBlob");
+
+    var oBlob = new Blob([oVmap.getMapManager().getJSONLayersTree()]);
+    window.navigator['msSaveBlob'](oBlob, 'map.json');
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMymap', nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapDirective);
+oVmap.module.controller('AppMymapController', nsVmap.nsMapManager.nsMapModal.MyMap.prototype.mymapController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/osmsuggestions.js b/module/javascript/app/vmap/mapmanager/mapmodal/osmsuggestions.js
new file mode 100755
index 0000000000000000000000000000000000000000..6c82a58ac9d390ad4e55900be7a4968575244f3a
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/osmsuggestions.js
@@ -0,0 +1,120 @@
+/* global goog, nsVmap, oVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.OSMSuggestions
+ * cette classe permet d'afficher les suggestions osm'
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.OSMSuggestions');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.OSMSuggestions}: load the map list suggestions
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.OSMSuggestions = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.OSMSuggestions");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsDirective = function () {
+    oVmap.log("nsVmap.osmsuggestionsDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppOsmsuggestionsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/osmsuggestions.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsController = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.OSMSuggestions.osmsuggestionsController");
+
+    /**
+     * The maps catalog
+     * @type {object}
+     * @api stable
+     */
+    this.catalog = this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+    /**
+     * The current projection
+     * @type {object}
+     * @api stable
+     */
+    this.projection = this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+
+    this['properties'] = oVmap['properties'];
+
+    this['sLayerName'] = '';
+    this['sLayerUrl'] = '';
+
+};
+
+/**
+ * Add the layer
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsController.prototype.addLayer = function (oLayerOptions) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsController.prototype.addLayer');
+
+    var sName;
+    var sUrl;
+
+    if (goog.isDefAndNotNull(oLayerOptions)) {
+        sName = oLayerOptions['name'];
+        sUrl = oLayerOptions['url'];
+    } else {
+        sName = this['sLayerName'];
+        sUrl = this['sLayerUrl'];
+    }
+
+    if (!goog.isString(sName) || sName === '') {
+        $.notify('Informations manquantes: Nom', 'error');
+        return;
+    }
+
+    var oLayer = {};
+    oLayer.url = sUrl;
+    oLayer.layerType = "osm";
+    oLayer.serviceName = 'Open Street Map';
+    oLayer.layerTitle = sName;
+
+    oVmap.getMapManager().addLayer(oLayer);
+};
+
+/**
+ * reload variables
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsController.prototype.reload = function () {
+
+    this.catalog = this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+    this.projection = this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appOsmsuggestions', nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsDirective);
+oVmap.module.controller('AppOsmsuggestionsController', nsVmap.nsMapManager.nsMapModal.OSMSuggestions.prototype.osmsuggestionsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/wmssuggestions.js b/module/javascript/app/vmap/mapmanager/mapmodal/wmssuggestions.js
new file mode 100755
index 0000000000000000000000000000000000000000..3ff6d69ec15c2139a3246861ec118be5b476d9ec
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/wmssuggestions.js
@@ -0,0 +1,428 @@
+/* global angular, oVmap, ol, goog, nsVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.WMSSuggestions
+ * cette classe permet d'afficher les suggestions wms'
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.WMSSuggestions');
+
+goog.require('oVmap');
+
+goog.require('ol.source.ImageWMS');
+goog.require('ol.format.WMSCapabilities');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.WMSSuggestions}: load the map list suggestions
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.WMSSuggestions");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsDirective = function () {
+    oVmap.log("nsVmap.wmssuggestionsDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'proj': '=appProj',
+            'lang': '=appLang'
+        },
+        controller: 'AppWmssuggestionsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/wmssuggestions.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @ngInject
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController = function ($scope) {
+    oVmap.log("nsVmap.wmssuggestionsController");
+
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * The displayed layers
+     * @type {array<ol.Layer>}
+     * @api stable
+     */
+    this['aLayers'] = [];
+
+    /**
+     * The displayed services
+     * @type {array}
+     * @api stable
+     */
+    $scope['aServices'] = [];
+
+    /**
+     * The service url
+     * @type string
+     */
+    this.sServiceUrl_ = '';
+
+    /**
+     * The service login
+     * @type string
+     */
+    this.sServiceLogin_ = '';
+
+    /**
+     * The service password
+     * @type string
+     */
+    this.sServicePassword_ = '';
+
+    /**
+     * The selected service
+     */
+    $scope['oSelectedService'] = {
+        'url': '',
+        'login': '',
+        'password': ''
+    };
+
+    /**
+     * Id of the selected style
+     * @type number
+     */
+    $scope['oSelectedStyle'] = {};
+
+    /**
+     * Filter string
+     * @type string
+     */
+    $scope['filter'] = "";
+
+    // Filtre le résultat
+    $scope.$watch('filter', function () {
+
+        var filteredArray = goog.array.filter(this_['aLayers'], function (element, index, array) {
+
+            var filter = String($scope['filter']).toLowerCase().withoutAccents();
+            var name = String(element['Name']).toLowerCase().withoutAccents();
+            var title = String(element['Title']).toLowerCase().withoutAccents();
+            var projections = String(element['projections']).toLowerCase().withoutAccents();
+
+            // Vérifie si la carte est conforme au filter
+            if (name.indexOf(filter) !== -1 || title.indexOf(filter) !== -1 || projections.indexOf(filter) !== -1) {
+                return true;
+            } else
+                return false;
+        });
+
+        this_['aLayersFiltered'] = filteredArray;
+    });
+
+    this.reloadServicesList();
+};
+
+/**
+ * Make a getCapabilities request and load the layers list
+ * @ngInject
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.getCapabilities = function () {
+    oVmap.log("getCapabilities");
+
+    var this_ = this;
+    var sUrl = angular.copy(this.$scope_['oSelectedService']['url'].removeURLParams(['request', 'service', 'version']));
+    var aLayers = [];
+
+    // Clear la liste des couches proposées
+    goog.array.clear(this['aLayers']);
+    goog.array.clear(this['aLayersFiltered']);
+
+    if (sUrl === "") {
+        $.notify('Veuillez renseigner une URL', 'error');
+        return 0;
+    }
+
+    // Effectue une copie (au cas où l'utilisateur modifie l'url après le getCapabilities)
+    this.sServiceUrl_ = angular.copy(this.$scope_['oSelectedService']['url'].removeURLParams(['request', 'service', 'version']));
+    this.sServiceLogin_ = angular.copy(this.$scope_['oSelectedService']['login']);
+    this.sServicePassword_ = angular.copy(this.$scope_['oSelectedService']['password']);
+
+    // Crée l'url
+    if (sUrl.indexOf("?") === -1)
+        sUrl += "?";
+    else
+        sUrl += "&";
+    sUrl += "service=WMS&version=1.3.0&request=GetCapabilities";
+
+    // Efface le message d'erreur
+    $("#log-message").empty();
+    // Affiche l'image d'attente
+    $("#load-img-wms").show();
+
+    var oHeaders = {
+        "charset": "charset=utf-8"
+    };
+    if (goog.isString(this.$scope_['oSelectedService']['login']) && goog.isString(this.$scope_['oSelectedService']['password'])) {
+        if (this.$scope_['oSelectedService']['login'].length > 0 && this.$scope_['oSelectedService']['password'].length > 0) {
+            oHeaders['Authorization'] = "Basic " + btoa(this.$scope_['oSelectedService']['login'] + ":" + this.$scope_['oSelectedService']['password']);
+        }
+    }
+
+    // appel ajax
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['proxy_url'] + '?url=' + encodeURIComponent(sUrl),
+        'headers': oHeaders,
+        'scope': this.$scope_,
+        'timeout': 5000,
+        'responseType': 'text',
+        'success': function (resp) {
+
+            function rhtmlspecialchars(str) {
+                if (typeof (str) == "string") {
+                    str = str.replace(/&gt;/ig, ">");
+                    str = str.replace(/&lt;/ig, "<");
+                    str = str.replace(/&#039;/g, "'");
+                    str = str.replace(/&quot;/ig, '"');
+                    str = str.replace(/&amp;/ig, '&'); /* must do &amp; last */
+                }
+                return str;
+            }
+
+            // Cache l'image d'attente
+            $("#load-img-wms").hide();
+            if (resp['data'] === "") {
+                oVmap.log("GetCapabilities sans résultat");
+                // Affiche le nouveau message d'erreur
+                var error = 'Requête GetCapabilities sans résultat, veuillez vérifier l\'URL du service';
+                $.notify(error, 'error');
+                return 0;
+            }
+
+            oVmap.log("GetCapabilities pass");
+            var parser = new ol.format.WMSCapabilities();
+            var result = rhtmlspecialchars(resp['data']);
+
+            try {
+                result = parser.read(result);
+            } catch (e) {
+                bootbox.alert(resp['data']);
+                return 0;
+            }
+
+            var aLayerProjection = [];
+            var mapProjection = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+            var serviceTitle = result['Service']['Title'];
+
+            /**
+             * Browse all the <layer> tags to fill aLayers
+             * @param {object} layer node
+             */
+            var searchLayers = function (layer) {
+                if (layer['Layer'] === undefined)
+                    aLayers.push(layer);
+                else
+                    for (var i = 0; i < layer['Layer'].length; i++) {
+                        searchLayers(layer['Layer'][i]);
+                    }
+            };
+
+            searchLayers(result['Capability']['Layer']);
+            aLayers['serviceTitle'] = serviceTitle;
+            aLayers['version'] = result['version'];
+
+            // Récupère les projections admises pour chaque couche
+            $(rhtmlspecialchars(resp['data'])).find('Layer').each(function () {
+                var oProjection = {
+                    sName: $(this).children("Name").text(),
+                    sCodes: ''
+                };
+
+                if ($(this).children("CRS").length > 0 && $(this).children("CRS").length < 10) {
+                    for (var i = 0; i < $(this).children("CRS").length; i++) {
+                        oProjection.sCodes += $(this).children("CRS")[i]['innerHTML'] + ' ';
+                    }
+                }
+                if ($(this).children("SRS").length > 0 && $(this).children("SRS").length < 10) {
+                    for (var i = 0; i < $(this).children("SRS").length; i++) {
+                        oProjection.sCodes += $(this).children("SRS")[i]['innerHTML'] + ' ';
+                    }
+                }
+                aLayerProjection.push(oProjection);
+            });
+
+            // Regarde si la couche est compatible
+            for (var i = 0; i < aLayers.length; i++) {
+                for (var ii = 0; ii < aLayerProjection.length; ii++) {
+                    if (aLayerProjection[ii].sName === aLayers[i]['Name']) {
+                        aLayers[i]['projections'] = aLayerProjection[ii].sCodes;
+                    }
+                }
+            }
+
+            // Affiche la liste
+            $("#wms-suggestions-list").show();
+
+            this_['aLayers'] = aLayers;
+            this_['aLayersFiltered'] = aLayers;
+        },
+        'error': function (response) {
+            // Cache l'image d'attente
+            $("#load-img-wms").hide();
+            console.error(response);
+
+            // Affiche le nouveau message d'erreur
+            var error = 'Erreur lors du chargement (plus d\'infos en console)';
+            $.notify(error, 'error');
+        }
+    });
+};
+
+/**
+ * Add the selected layer
+ * @param {object} oLayerOptions
+ * @param {string|undefined} sStyleName
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.addLayer = function (oLayerOptions, sStyleName) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.addLayer');
+
+    var sUrl = this.sServiceUrl_;
+    var sLayerName = oLayerOptions['Name'];
+    var sLayerTitle = oLayerOptions['Title'];
+    var bQueryable = oLayerOptions['queryable'];
+    var version = this['aLayers']['version'];
+    var style;
+
+    if (goog.isDefAndNotNull(sStyleName)) {
+        style = sStyleName;
+        $('#wms-select-style-modal').modal('hide');
+    } else {
+        if (goog.isArray(oLayerOptions['Style'])) {
+            if (oLayerOptions['Style'].length > 1) {
+                this['oLayerToAdd'] = oLayerOptions;
+                this.$scope_['oSelectedStyle'] = this['oLayerToAdd']['Style'][0];
+                $('#wms-select-style-modal').modal('show');
+                return 0;
+            } else {
+                if (goog.isDefAndNotNull(oLayerOptions['Style'][0])) {
+                    if (goog.isDefAndNotNull(oLayerOptions['Style'][0]['Name'])) {
+                        style = oLayerOptions['Style'][0]['Name'];
+                    }
+                }
+            }
+        }
+    }
+
+    // Ajoute ?service=WMS
+    if (sUrl.indexOf("?") === -1)
+        sUrl += "?service=WMS";
+
+    // Récupère le nom du service
+    var sServiceName = this.getServiceTitle(oLayerOptions);
+
+    var oLayer = {};
+    oLayer.url = sUrl;
+    oLayer.login = this.sServiceLogin_;
+    oLayer.password = this.sServicePassword_;
+    oLayer.layerType = "imagewms";
+    oLayer.serviceName = sServiceName;
+    oLayer.layerName = sLayerName;
+    oLayer.layerTitle = sLayerTitle;
+    oLayer.queryable = bQueryable;
+    oLayer.version = version;
+    oLayer.style = style;
+
+    oVmap.getMapManager().addLayer(oLayer);
+};
+
+/**
+ * Get the service title
+ * @param {object} oLayerOptions
+ * @returns {string}
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.getServiceTitle = function (oLayerOptions) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.getServiceTitle');
+
+    var sServiceName;
+    var aCatalogServices = this.$scope_['aServices'];
+
+    for (var i = 0; i < aCatalogServices.length; i++) {
+        if (aCatalogServices[i]['url'] === this.sServiceUrl_) {
+            sServiceName = aCatalogServices[i]['name'];
+        }
+    }
+
+    if (!goog.isDefAndNotNull(sServiceName)) {
+        sServiceName = this['aLayers']['serviceTitle'];
+    }
+
+    return sServiceName;
+};
+
+/**
+ * Get the avaliable services (with login and password)
+ * @returns {Array}
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.reloadServicesList = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController.prototype.reloadServicesList');
+
+    var aServices = [];
+    var oOptions;
+    var oCatalog = angular.copy(oVmap.getMapManager().getMapCatalog());
+
+    for (var i = 0; i < oCatalog['services']['wms'].length; i++) {
+        aServices.push(oCatalog['services']['wms'][i]);
+    }
+
+    for (var i = 0; i < aServices.length; i++) {
+        oOptions = {};
+        if (goog.isDefAndNotNull(aServices[i]['service_options'])) {
+            if (goog.isString(aServices[i]['service_options'])) {
+                try {
+                    oOptions = JSON.parse(aServices[i]['service_options']);
+                } catch (e) {
+                    oOptions = {};
+                }
+            } else if (goog.isObject(aServices[i]['service_options'])) {
+                oOptions = aServices[i]['service_options'];
+            }
+        }
+        if (goog.isDefAndNotNull(oOptions['login']) && goog.isDefAndNotNull(oOptions['password'])) {
+            aServices[i]['login'] = oOptions['login'];
+            aServices[i]['password'] = oOptions['password'];
+        } else {
+            aServices[i]['login'] = '';
+            aServices[i]['password'] = '';
+        }
+    }
+
+    this.$scope_['aServices'] = aServices;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appWmssuggestions', nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsDirective);
+oVmap.module.controller('AppWmssuggestionsController', nsVmap.nsMapManager.nsMapModal.WMSSuggestions.prototype.wmssuggestionsController);
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/wmtssuggestions.js b/module/javascript/app/vmap/mapmanager/mapmodal/wmtssuggestions.js
new file mode 100755
index 0000000000000000000000000000000000000000..c14cc6b2a237bcacc53708448354c19b97fbf708
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/wmtssuggestions.js
@@ -0,0 +1,381 @@
+/* global goog, oVmap, nsVmap, this */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.WMTSSuggestions
+ * cette classe permet d'afficher les suggestions wmts'
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.WMTSSuggestions}: load the map list suggestions
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.WMTSSuggestions");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsDirective = function () {
+    oVmap.log("nsVmap.wmtssuggestionsDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppWmtssuggestionsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/wmtssuggestions.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @ngInject
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController = function ($scope) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController');
+
+    var this_ = this;
+
+    this.$scope_ = $scope;
+
+    this.appMainScope_ = angular.element(vitisApp.appMainDrtv).scope();
+
+    /**
+     * The maps catalog
+     * @type {object}
+     */
+    this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+
+    /**
+     * The displayed layers
+     * @type {array}
+     */
+    this['aLayers'] = [];
+
+    /**
+     * Filter string
+     * @type string
+     */
+    $scope['filter'] = "";
+
+    this['oService'];
+    this['sRequestUrl'] = '';
+    this['sRequestType'] = 'KVP';
+    this['sRequestVersion'] = '1.0.0';
+
+    this['oLayerToAdd'];
+    this['sLayerToAdd_name'];
+    this['sLayerToAdd_style_name'];
+    this['sLayerToAdd_matrix_name'];
+    this['oLayerToAdd_matrix_def'] = {};
+
+    this['oCapabilities'];
+
+    $scope['iServiceIndex'];
+    $scope['iSelectedStyleIndex'];
+
+    // Rafraichit oLayerToAdd_matrix_def quand sLayerToAdd_matrix_name est modifié
+    $scope.$watch('ctrl.sLayerToAdd_matrix_name', function (value) {
+
+        goog.object.clear(this_['oLayerToAdd_matrix_def']);
+
+        if (goog.isDefAndNotNull(value) && value !== '') {
+            if (goog.isDefAndNotNull(this_['oCapabilities'])) {
+                if (goog.isDefAndNotNull(this_['oCapabilities']['Contents'])) {
+                    if (goog.isDefAndNotNull(this_['oCapabilities']['Contents'])) {
+                        if (goog.isArray(this_['oCapabilities']['Contents']['TileMatrixSet'])) {
+                            var aTileMatrixSet = this_['oCapabilities']['Contents']['TileMatrixSet'];
+                            for (var i = 0; i < aTileMatrixSet.length; i++) {
+                                if (aTileMatrixSet[i]['Identifier'] === value) {
+                                    this_['oLayerToAdd_matrix_def'] = angular.copy(aTileMatrixSet[i]);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    });
+
+    // Filtre le résultat
+    $scope.$watch('filter', function () {
+
+        var filteredArray = goog.array.filter(this_['aLayers'], function (element, index, array) {
+
+            var filter = String($scope['filter']).toLowerCase().withoutAccents();
+            var name = String(element['Identifier']).toLowerCase().withoutAccents();
+            var title = String(element['Title']).toLowerCase().withoutAccents();
+
+            // Vérifie si la carte est conforme au filter
+            if (name.indexOf(filter) !== -1 || title.indexOf(filter) !== -1) {
+                return true;
+            } else
+                return false;
+        });
+
+        this_['aLayersFiltered'] = filteredArray;
+    });
+};
+
+/**
+ * Select a service on the template
+ * @param {integer} iServiceIndex
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.selectService = function (iServiceIndex) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.selectService');
+
+    this['oService'] = this['catalog']['services']['wmts'][iServiceIndex];
+    if (goog.isDefAndNotNull(this['oService'])) {
+        this['sRequestUrl'] = goog.isDefAndNotNull(this['oService']['url']) ? this['oService']['url'] : '';
+        this['sRequestType'] = goog.isDefAndNotNull(this['oService']['service_type_type']) ? this['oService']['service_type_type'] : 'KVP';
+        this['sRequestVersion'] = goog.isDefAndNotNull(this['oService']['service_type_version']) ? this['oService']['service_type_version'] : '1.0.0';
+    } else {
+        this['sRequestUrl'] = '';
+        this['sRequestType'] = 'KVP';
+        this['sRequestVersion'] = '1.0.0';
+    }
+};
+
+/**
+ * Make a getCapabilities request and load the layers list
+ * @export
+ * @api experimental
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.getCapabilities = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.getCapabilities');
+
+    if (!goog.isDefAndNotNull(this['sRequestUrl']) || this['sRequestUrl'] === '') {
+        $.notify('Informations insuffisantes: URL', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sRequestType']) || this['sRequestType'] === '') {
+        $.notify('Informations insuffisantes: Type', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sRequestVersion']) || this['sRequestVersion'] === '') {
+        $.notify('Informations insuffisantes: Version', 'error');
+        return null;
+    }
+
+    var this_ = this;
+
+    // Affiche l'image d'attente
+    $("#load-img-wmts").show();
+
+    // Cache la liste
+    $("#wmts-suggestions-list").hide();
+
+    // Clear les informations
+    goog.array.clear(this['aLayers']);
+    goog.array.clear(this['aLayersFiltered']);
+    goog.object.clear(this_['oCapabilities']);
+
+    // Enlève certains attributs au cas où l'utilisateur est ait écrits dans l'url
+    var sRequestUrl = angular.copy(this['sRequestUrl'].removeURLParams(['request', 'service', 'version']));
+
+    this.appMainScope_['WMTSCapabilities']({
+        'serviceUrl': sRequestUrl,
+        'serviceVersion': this['sRequestVersion'],
+        'WMTSType': this['sRequestType']
+    }, function (oCapabilities) {
+
+        this_['oCapabilities'] = oCapabilities;
+
+        // Cache l'image d'attente
+        $("#load-img-wmts").hide();
+
+        // Affiche la liste
+        $("#wmts-suggestions-list").show();
+
+        var bCapabilitiesOk = false;
+        if (goog.isDefAndNotNull(this_['oCapabilities'])) {
+            if (goog.isDefAndNotNull(this_['oCapabilities']['Contents'])) {
+                if (goog.isDefAndNotNull(this_['oCapabilities']['Contents']['Layer'])) {
+                    bCapabilitiesOk = true;
+                }
+            }
+        }
+        if (!bCapabilitiesOk) {
+            $.notify('Contenu du service incohérent', 'error');
+            return null;
+        } else {
+            this_['aLayers'] = this_['oCapabilities']['Contents']['Layer'];
+            this_['aLayersFiltered'] = this_['oCapabilities']['Contents']['Layer'];
+        }
+
+    }, function (sError) {
+        // Cache l'image d'attente
+        $("#load-img-wmts").hide();
+        this_.appMainScope_.$root['modalWindow']('dialog', 'Service non valide', {
+            'className': 'modal-danger',
+            'message': sError
+        });
+    });
+};
+
+/**
+ * Add a wmts layer
+ * @param {object} oLayer
+ * @param {array<object>} oLayer.Style
+ * @param {array<object>} oLayer.TileMatrixSetLink
+ * @param {string} oLayer.Identifier
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.addLayer = function (oLayer) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.addLayer');
+
+    // Réinit les variables
+    this['sLayerToAdd_name'] = '';
+    this['sLayerToAdd_style_name'] = '';
+    this['sLayerToAdd_format_name'] = '';
+    this['sLayerToAdd_matrix_name'] = '';
+
+    if (!goog.isArray(oLayer['Style'])) {
+        $.notify('Informations insuffisantes: Style', 'error');
+        return null;
+    }
+    if (!goog.isArray(oLayer['TileMatrixSetLink'])) {
+        $.notify('Informations insuffisantes: Matrice', 'error');
+        return null;
+    }
+
+    this['oLayerToAdd'] = oLayer;
+    this['sLayerToAdd_name'] = oLayer['Identifier'];
+    this['sLayerToAdd_title'] = oLayer['Title'];
+
+    if (oLayer['Style'].length === 1 && oLayer['Format'].length === 1 && oLayer['TileMatrixSetLink'].length === 1) {
+        this['sLayerToAdd_style_name'] = this['oLayerToAdd']['Style'][0]['Identifier'];
+        this['sLayerToAdd_format_name'] = this['oLayerToAdd']['Format'][0];
+        this['sLayerToAdd_matrix_name'] = this['oLayerToAdd']['TileMatrixSetLink'][0]['TileMatrixSet'];
+        this.addLayerToAdd();
+    } else {
+        this['sLayerToAdd_style_name'] = '?';
+        this['sLayerToAdd_format_name'] = '?';
+        this['sLayerToAdd_matrix_name'] = '?';
+        $('#wmts-select-matrix-modal').modal('show');
+    }
+};
+
+/**
+ * Add the layer to add using
+ * this.oCapabilities
+ * this.sLayerToAdd_name
+ * this.sLayerToAdd_title
+ * this.sLayerToAdd_style_name
+ * this.sLayerToAdd_matrix_name
+ * this.sLayerToAdd_format_name
+ * this.sRequestType
+ * this.sRequestVersion
+ * this.sRequestUrl
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.addLayerToAdd = function () {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController.prototype.addLayerToAdd');
+
+    if (!goog.isDefAndNotNull(this['sLayerToAdd_name']) || this['sLayerToAdd_name'] === '') {
+        $.notify('Informations insuffisantes: Nom de la couche', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sLayerToAdd_title']) || this['sLayerToAdd_title'] === '') {
+        $.notify('Informations insuffisantes: Titre de la couche', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sLayerToAdd_style_name']) || this['sLayerToAdd_style_name'] === '?') {
+        $.notify('Informations insuffisantes: Style', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sLayerToAdd_matrix_name']) || this['sLayerToAdd_matrix_name'] === '?') {
+        $.notify('Informations insuffisantes: Matrice', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['sLayerToAdd_format_name']) || this['sLayerToAdd_format_name'] === '?') {
+        $.notify('Informations insuffisantes Format', 'error');
+        return null;
+    }
+
+    var bCapabilitiesOk = false;
+    if (goog.isDefAndNotNull(this['oCapabilities'])) {
+        if (goog.isDefAndNotNull(this['oCapabilities']['Contents'])) {
+            if (goog.isDefAndNotNull(this['oCapabilities']['Contents']['Layer'])) {
+                bCapabilitiesOk = true;
+            }
+        }
+    }
+    if (!bCapabilitiesOk) {
+        $.notify('Contenu du service incohérent', 'error');
+        return null;
+    }
+
+    $('#wmts-select-matrix-modal').modal('hide');
+
+    var oLayer = {};
+    oLayer.layerType = "wmts";
+    oLayer.layerName = this['sLayerToAdd_name'];
+    oLayer.layerTitle = this['sLayerToAdd_title'];
+    oLayer.style = this['sLayerToAdd_style_name'];
+    oLayer.matrixSet = this['sLayerToAdd_matrix_name'];
+    oLayer.format = this['sLayerToAdd_format_name'];
+    oLayer.requestEncoding = this['sRequestType'];
+    oLayer.version = this['sRequestVersion'];
+    oLayer.url = this['sRequestUrl'];
+    oLayer.service_options = JSON.stringify(this['oCapabilities']);
+
+    // Définit le nom du service (depuis le catalogue, ServiceIdentification, ServiceProvider)
+    if (goog.isDefAndNotNull(this.$scope_['iServiceIndex'])) {
+        if (goog.isDefAndNotNull(this['catalog'])) {
+            if (goog.isDefAndNotNull(this['catalog']['services'])) {
+                if (goog.isDefAndNotNull(this['catalog']['services']['wmts'])) {
+                    if (goog.isDefAndNotNull(this['catalog']['services']['wmts'][this.$scope_['iServiceIndex']])) {
+                        if (goog.isDefAndNotNull(this['catalog']['services']['wmts'][this.$scope_['iServiceIndex']]['name'])) {
+                            oLayer.serviceName = this['catalog']['services']['wmts'][this.$scope_['iServiceIndex']]['name'];
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (!goog.isDefAndNotNull(oLayer.serviceName)) {
+        if (goog.isDefAndNotNull(this['oCapabilities']['ServiceProvider'])) {
+            if (goog.isDefAndNotNull(this['oCapabilities']['ServiceProvider']['ProviderName'])) {
+                oLayer.serviceName = this['oCapabilities']['ServiceProvider']['ProviderName'];
+            }
+        }
+    }
+    if (!goog.isDefAndNotNull(oLayer.serviceName)) {
+        if (goog.isDefAndNotNull(this['oCapabilities']['ServiceIdentification'])) {
+            if (goog.isDefAndNotNull(this['oCapabilities']['ServiceIdentification']['Title'])) {
+                oLayer.serviceName = this['oCapabilities']['ServiceIdentification']['Title'];
+            }
+        }
+    }
+    if (!goog.isDefAndNotNull(oLayer.serviceName)) {
+        oLayer.serviceName = 'Service WMTS';
+    }
+
+    oVmap.getMapManager().addLayer(oLayer);
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appWmtssuggestions', nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsDirective);
+oVmap.module.controller('AppWmtssuggestionsController', nsVmap.nsMapManager.nsMapModal.WMTSSuggestions.prototype.wmtssuggestionsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/xyzsuggestions.js b/module/javascript/app/vmap/mapmanager/mapmodal/xyzsuggestions.js
new file mode 100755
index 0000000000000000000000000000000000000000..83e9542c6f5707c0e5180d5370ea849af9ab9bbd
--- /dev/null
+++ b/module/javascript/app/vmap/mapmanager/mapmodal/xyzsuggestions.js
@@ -0,0 +1,136 @@
+/* global goog, nsVmap, oVmap, this */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsMapManager.nsMapModal.XYZSuggestions
+ * cette classe permet d'afficher les suggestions xyz'
+ */
+
+goog.provide('nsVmap.nsMapManager.nsMapModal.XYZSuggestions');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsMapManager.nsMapModal.XYZSuggestions}: load the map list suggestions
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.XYZSuggestions = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.XYZSuggestions");
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+/**
+ * map list directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsDirective = function () {
+    oVmap.log("nsVmap.xyzsuggestionsDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppXyzsuggestionsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/layers/mapmodal/xyzsuggestions.html'
+    };
+};
+
+/**
+ * map list controller
+ * @export
+ * @constructor
+ */
+nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsController = function () {
+    oVmap.log("nsVmap.nsMapManager.nsMapModal.XYZSuggestions.xyzsuggestionsController");
+
+    this['properties'] = oVmap['properties'];
+    /**
+     * The maps catalog
+     * @type {object}
+     * @api stable
+     */
+    this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+
+    /**
+     * The current projection
+     * @type {object}
+     * @api stable
+     */
+    this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+
+    /**
+     * The layer will be added
+     */
+    this['oLayerToAdd'] = {
+        'sService': '',
+        'sLayer': '',
+        'sUrl': ''
+    };
+};
+
+/**
+ * Add the layer defined by this.oLayerToAdd
+ * @param {object|undefined} oLayer name and url of the layer to add, if not provided, will use oLayerToAdd
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsController.prototype.addLayer = function (oLayer) {
+    oVmap.log('nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsController.prototype.addLayer');
+    
+    var sService;
+    var sLayer;
+    var sUrl;
+
+    if (goog.isDefAndNotNull(oLayer)) {
+        sService = oLayer['name'];
+        sLayer = oLayer['name'];
+        sUrl = oLayer['url'];
+    } else {
+        sService = this['oLayerToAdd']['sService'];
+        sLayer = this['oLayerToAdd']['sLayer'];
+        sUrl = this['oLayerToAdd']['sUrl'];
+    }
+
+    if (!goog.isDefAndNotNull(sService)) {
+        $.notify('Informations insuffisantes: Service', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(sLayer)) {
+        $.notify('Informations insuffisantes: sLayer', 'error');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(sUrl)) {
+        $.notify('Informations insuffisantes: sUrl', 'error');
+        return null;
+    }
+
+    oVmap.getMapManager().addLayer({
+        url: sUrl,
+        layerType: "xyz",
+        serviceName: sService,
+        layerTitle: sLayer
+    });
+};
+
+/**
+ * reload variables
+ * @export
+ */
+nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsController.prototype.reload = function () {
+
+    this['catalog'] = oVmap.getMapManager().getMapModalTool().getMapCatalog();
+    this['projection'] = oVmap.getMap().getOLMap().getView().getProjection().getCode();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appXyzsuggestions', nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsDirective);
+oVmap.module.controller('AppXyzsuggestionsController', nsVmap.nsMapManager.nsMapModal.XYZSuggestions.prototype.xyzsuggestionsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/requires.js b/module/javascript/app/vmap/requires.js
new file mode 100755
index 0000000000000000000000000000000000000000..2eae1b6a727b42ff523d7e606e3dfa5baecbe4fd
--- /dev/null
+++ b/module/javascript/app/vmap/requires.js
@@ -0,0 +1,14 @@
+/* global goog, angular, nsVmap, less, bootbox, ol, vitisApp */
+/**
+ * @author: Armand Bahi
+ */
+//less.refresh();
+//G_testRunner.setStrict(false);
+
+goog.provide('vmap');
+goog.require('oVmap');
+goog.require('nsVmap.Map');
+goog.require('nsVmap.Map.MapTooltip');
+goog.require('nsVmap.Map.MapPopup');
+goog.require('nsVmap.nsMapManager.MapManager');
+goog.require('nsVmap.nsToolsManager.ToolsManager');
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/basictools.js b/module/javascript/app/vmap/tools/basictools.js
new file mode 100644
index 0000000000000000000000000000000000000000..f53955c43cccd66024db099c860b32b003b11aca
--- /dev/null
+++ b/module/javascript/app/vmap/tools/basictools.js
@@ -0,0 +1,432 @@
+/* global goog, nsVmap, oVmap */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.BasicTools
+ * cette classe permet l'initialisation des outils de base de carte
+ */
+goog.provide('nsVmap.nsToolsManager.BasicTools');
+
+goog.require('oVmap');
+
+goog.require('nsVmap.nsToolsManager.VmapUser');
+goog.require('nsVmap.nsToolsManager.Controls');
+goog.require('nsVmap.nsToolsManager.Location');
+goog.require('nsVmap.nsToolsManager.Measure');
+goog.require('nsVmap.nsToolsManager.Select');
+goog.require('nsVmap.nsToolsManager.Insert');
+goog.require('nsVmap.nsToolsManager.Print');
+goog.require('nsVmap.nsToolsManager.Urlexporter');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.BasicTools}: Add the basic tools
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools');
+
+    this.oLocation_ = new nsVmap.nsToolsManager.Location();
+    this.oMeasure_ = new nsVmap.nsToolsManager.Measure();
+    this.oSelect_ = new nsVmap.nsToolsManager.Select();
+    this.oInsert_ = new nsVmap.nsToolsManager.Insert();
+    this.oPrint_ = new nsVmap.nsToolsManager.Print();
+    this.oControls_ = new nsVmap.nsToolsManager.Controls();
+    this.oUrlExporter_ = new nsVmap.nsToolsManager.Urlexporter();
+};
+
+/**
+ * Toggle a basic tool
+ * @param {object} toolHTML The html id of the tool
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.toggleTool = function (toolHTML) {
+
+    var isActive = $(toolHTML).hasClass('active');
+
+    // Desactive tous les outils
+    this.toggleOutTools();
+
+    // Passe en mode actif le bouton html de l'outil
+    if (isActive === false) {
+        $(toolHTML).addClass('active');
+        $(toolHTML).parent().children('.dropdown-menu').show();
+    }
+};
+
+/**
+ * show a basic tool
+ * @param {object} toolHTML The html id of the tool
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.showTool = function (toolHTML) {
+
+    $(toolHTML).addClass('active');
+    $(toolHTML).parent().children('.dropdown-menu').show();
+};
+
+/**
+ * hide a basic tool
+ * @param {object} toolHTML The html id of the tool
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.hideTool = function (toolHTML) {
+
+    $(toolHTML).removeClass('active');
+    $(toolHTML).parent().children('.dropdown-menu').hide();
+};
+
+/**
+ * Toggle out all the basic tools
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.toggleOutTools = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.prototype.toggleOutTools');
+
+    // Passe tous les boutons en mode inactif
+    $('.basic-tools-element').removeClass('active');
+    // Ferme les drowdown
+    $('.basic-tools-dropdown-element').hide();
+    // Supprime les actions en cours
+    oVmap.getMap().removeActionsAndTooltips();
+    // Lance les évènements
+    oVmap.log('oVmap event: toggleOutTools');
+    //
+    oVmap['scope'].$broadcast('toggleOutTools');
+};
+
+/**
+ * Hide the mobile menu
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.hideMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.prototype.hideMobileMenu');
+    angular.element('#map-basic-tools').scope()['ctrl']['hideMobileMenu']();
+    this.toggleOutTools();
+};
+
+/**
+ * Display the mobile menu
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.displayAdvancedMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.prototype.displayAdvancedMobileMenu');
+    angular.element('#map-basic-tools').scope()['ctrl']['displayAdvancedMobileMenu']();
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * Basic tools Directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.BasicTools.prototype.basictoolsDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppBasictoolsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'basictools_mobile.html' : 'basictools.html')
+    };
+};
+
+/**
+ * Basic tools Controller
+ * @param {object} $scope
+ * @param {object} $timeout
+ * @param {object} $element
+ * @ngInject
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController = function ($scope, $timeout, $element) {
+    oVmap.log("nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController");
+
+    this.$scope_ = $scope;
+    this.$element_ = $element;
+
+    $scope['$oLocation'];
+    $scope['$oMeasure'];
+    $scope['$oSelect'];
+    $scope['$oInsert'];
+    $scope['$oPrint'];
+    $scope['$oControls'];
+
+    // Menus mobile
+    $scope['bMobileMenuOpen'] = false;
+    $scope['bMobileLocationMenuOpen'] = false;
+    $scope['bMobileLayersMenuOpen'] = false;
+    $scope['bMobileAdvancedMenuOpen'] = false;
+    $scope['locationGoToProjection'] = 'EPSG:4326';
+    $scope['locationGoToX'] = '';
+    $scope['locationGoToY'] = '';
+
+    $timeout(function () {
+        for (var oChild = $scope.$$childHead; oChild; oChild = oChild.$$nextSibling) {
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Location.prototype.locationController)
+                $scope['$oLocation'] = oChild;
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Measure.prototype.measureController)
+                $scope['$oMeasure'] = oChild;
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Select.prototype.selecttoolController)
+                $scope['$oSelect'] = oChild;
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Insert.prototype.inserttoolController)
+                $scope['$oInsert'] = oChild;
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Print.prototype.printController)
+                $scope['$oPrint'] = oChild;
+            if (oChild.ctrl.constructor === nsVmap.nsToolsManager.Controls.prototype.controlsController)
+                $scope['$oControls'] = oChild;
+        }
+    });
+
+    // Ferme les outils quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        oVmap.getToolsManager().getBasicTools().toggleOutTools();
+    });
+
+    // Affiche les modales en plein écran pour la version mobile
+    if (oVmap['properties']['is_mobile']) {
+        $element.find('.modal').on('shown.bs.modal', function () {
+            $('.modal-backdrop.fade.in').hide();
+            $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+        });
+    }
+};
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+/**
+ * oSelect_ getter
+ * @return {nsVmap.nsToolsManager.Select} Select object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getSelect = function () {
+    return this.oSelect_;
+};
+
+/**
+ * oInsert_ getter
+ * @return {nsVmap.nsToolsManager.Insert} Insert object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getInsert = function () {
+    return this.oInsert_;
+};
+
+/**
+ * oLocation_ getter
+ * @return {nsVmap.nsToolsManager.Location} Location object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getLocation = function () {
+    return this.oLocation_;
+};
+
+/**
+ * oMeasure_ getter
+ * @return {nsVmap.nsToolsManager.Measure} Measure object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getMeasure = function () {
+    return this.oMeasure_;
+};
+
+/**
+ * oPrint_ getter
+ * @return {nsVmap.nsToolsManager.Print} Print object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getPrint = function () {
+    return this.oPrint_;
+};
+
+/**
+ * oControls_ getter
+ * @return {nsVmap.nsToolsManager.Controls} Controls object
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.getControls = function () {
+    return this.oControls_;
+};
+
+
+/********************************************
+ *           INTERFACE MOBILE
+ *******************************************/
+
+/**
+ * Affiche l'interface menu mobile
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.displayMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.displayMobileMenu');
+    this.$scope_['bMobileMenuOpen'] = true;
+};
+
+/**
+ * Cache l'interface menu mobile et affiche la carte
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.hideMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.hideMobileMenu');
+
+    // Ferme les menus
+    this.$scope_['bMobileMenuOpen'] = false;
+    this.$scope_['bMobileLocationMenuOpen'] = false;
+    this.$scope_['bMobileLayersMenuOpen'] = false;
+    this.$scope_['bMobileAdvancedMenuOpen'] = false;
+    this.$scope_['bMobileRequeteurOpen'] = false;
+
+    // Ferme l'éventuelle popup affichée
+    this.closeSelectionPopup();
+
+    // Ferme l'accordéon
+    $(this.$element_).find('.sublinks.collapse.in').collapse('hide');
+};
+
+/**
+ * Affiche l'outil de localisation pour mobile
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.displayLocationMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.displayLocationMobileMenu');
+
+    this.hideMobileMenu();
+    this.$scope_['bMobileLocationMenuOpen'] = true;
+    this.displayMobileMenu();
+};
+
+/**
+ * Affiche l'outil calques et cartes pour mobile
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.displayLayersMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.displayLayersMobileMenu');
+
+    this.hideMobileMenu();
+    this.$scope_['bMobileLayersMenuOpen'] = true;
+    this.displayMobileMenu();
+};
+
+/**
+ * Affiche l'outil calques et cartes pour mobile
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.displayAdvancedMobileMenu = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.displayAdvancedMobileMenu');
+
+    this.hideMobileMenu();
+    this.$scope_['bMobileAdvancedMenuOpen'] = true;
+    this.displayMobileMenu();
+};
+
+/**
+ * Affiche le requêteur
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.displayRequeteur = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.displayRequeteur');
+
+    this.hideMobileMenu();
+    this.$scope_['bMobileRequeteurOpen'] = true;
+    this.displayMobileMenu();
+
+    angular.element($('#vmap-advancedselect-tool')).scope()['ctrl'].displaySelectionTable([]);
+};
+
+
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.closeSelectionPopup = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.closeSelectionPopup');
+
+    angular.element($('#vmap-basicselect-tool')).scope()['ctrl'].closeSelectionPopup();
+};
+
+/*****************************************
+ *                Location
+ *****************************************/
+
+/**
+ * Ferme le menu mobile et place la carte à son étendue propre
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.locationGoHome = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.locationGoHome');
+
+    this.hideMobileMenu();
+    angular.element($('#location-search-tool')).scope()['ctrl']['goHome']();
+};
+
+/**
+ * Ferme le menu mobile et centre sur la position courante
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.locationGeolocateMe = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.locationGeolocateMe');
+
+    this.hideMobileMenu();
+    oVmap.getMap().centerGPSPosition();
+};
+
+/**
+ * Ferme le menu mobile et centre sur l'étendue max
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.locationMaxExtent = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.locationMaxExtent');
+
+    this.hideMobileMenu();
+    angular.element($('#location-search-tool')).scope()['ctrl']['maxExtent']();
+};
+
+/**
+ * Affiche le fromulaire de localisation sur coordonnées
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.locationGoCoordinates = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.locationGoCoordinates');
+
+    this.$scope_['locationGoToProjection'] = 'EPSG:4326';
+    this.$scope_['locationGoToX'] = '';
+    this.$scope_['locationGoToY'] = '';
+    this.$scope_['locationProjections'] = angular.element($('#location-search-tool')).scope()['ctrl']['projections'];
+    $('#location-goto-modal').modal('show');
+};
+
+/**
+ * Ferme le menu mobile et centre sur les coordonnées renseignées
+ * @param {number} CoordX
+ * @param {number} CoordY
+ * @param {string} projection
+ * @export
+ */
+nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController.prototype.locationGoTo = function (CoordX, CoordY, projection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicTools.basictoolsController.locationGoTo');
+
+    $('#location-goto-modal').modal('hide');
+
+    this.hideMobileMenu();
+    angular.element($('#location-search-tool')).scope()['ctrl']['goTo'](CoordX, CoordY, projection);
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appBasictools', nsVmap.nsToolsManager.BasicTools.prototype.basictoolsDirective);
+oVmap.module.controller('AppBasictoolsController', nsVmap.nsToolsManager.BasicTools.prototype.basictoolsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/controls.js b/module/javascript/app/vmap/tools/controls.js
new file mode 100755
index 0000000000000000000000000000000000000000..67b20e2e0fa4df43af05829b3365f6282f0ae60d
--- /dev/null
+++ b/module/javascript/app/vmap/tools/controls.js
@@ -0,0 +1,429 @@
+/* global oVmap, nsVmap, goog, ol */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Controls
+ * cette classe permet l'initialisation des interactons, controles etc..
+ */
+goog.provide('nsVmap.nsToolsManager.Controls');
+
+goog.require('oVmap');
+
+goog.require('ol.Map');
+goog.require('ol.control');
+goog.require('ol.control.Attribution');
+goog.require('ol.control.Control');
+goog.require('ol.control.FullScreen');
+goog.require('ol.control.MousePosition');
+goog.require('ol.control.OverviewMap');
+goog.require('ol.control.Rotate');
+goog.require('ol.control.ScaleLine');
+goog.require('ol.control.Zoom');
+goog.require('ol.control.ZoomSlider');
+goog.require('ol.control.ZoomToExtent');
+goog.require('ol.interaction.DragAndDrop');
+goog.require('ol.format.GPX');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.format.IGC');
+goog.require('ol.format.KML');
+goog.require('ol.format.TopoJSON');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Controls}: Add the controls defined in data/tools.json,
+ * available : Attribution, FullScreen, MousePosition, OverviewMap, Rotate, ScaleLine, Zoom, ZoomSlider, 
+ * ZoomToExtent, CurrentProjection, DragAndDrop (GPX,GeoJSON,IGC,KML,TopoJSON)
+ * @param {array} aControls Controls to set
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Controls = function (aControls) {
+    oVmap.log('nsVmap.nsToolsManager.Controls');
+
+    var this_ = this;
+
+    /**
+     * Controls avaliable
+     * @type {array}
+     */
+    this.aAvaliableControls = [{
+            'id': 'Attribution',
+            'title': 'Attributions',
+            'description': 'Affiche les attributions de la couche'
+        }, {
+            'id': 'MousePosition',
+            'title': 'Position de la souris',
+            'description': 'Affiche la position de la souris'
+        }, {
+            'id': 'CurrentProjection',
+            'title': 'Projection en cours',
+            'description': 'Affiche la projection de la carte en cours'
+        }, {
+            'id': 'MapName',
+            'title': 'Nom de la carte en cours',
+            'description': 'Affiche le nom de la carte en cours'
+        }, {
+            'id': 'OverviewMap',
+            'title': 'Carte de supervision',
+            'description': 'Affiche la carte de supervision'
+        }, {
+            'id': 'Scale',
+            'title': 'Échelle numérique',
+            'description': 'Outil de changement d\'échelle'
+        }, {
+            'id': 'ScaleLine',
+            'title': 'Échelle graphique',
+            'description': 'Affiche la barre d\'échelle'
+        }, {
+            'id': 'Zoom',
+            'title': 'Zoom',
+            'description': 'Affiche les boutons de zoom + et -'
+        }, {
+            'id': 'ZoomSlider',
+            'title': 'Slider de zoom',
+            'description': 'Affiche le slider de zoom'
+        }, {
+            'id': 'RefreshSocket',
+            'title': 'Rafraichissement auto',
+            'description': 'Rafraichit automatiquement les couches lorsque les données sont modifiées'
+        }
+    ];
+
+    /**
+     * @type {ol.Map}
+     * @private
+     */
+    this.map_ = oVmap.getMap().getOLMap();
+
+    this.handleDragOver = function (event) {
+        event.stopPropagation();
+        event.preventDefault();
+        event.dataTransfer.dropEffect = 'copy';
+    };
+
+    this.handleFileSelect = function (event) {
+        event.stopPropagation();
+        event.preventDefault();
+        var files = event.dataTransfer.files;
+
+        // donne la valeur du fichier au bouton 'chercher'
+        document.getElementById('browse-geometry-button').files = files;
+        // ouvre la modale en mode geométrie
+        oVmap.simuleClick('map-manager-button');
+        oVmap.simuleClick('modal-geomerty-modal-button');
+    };
+
+    this.DragAndDrop = false;
+
+    // Mobile
+    var aAvaliableMobileControls = ['MapName', 'Scale', 'ScaleLine', 'Zoom', 'RefreshSocket'];
+    if (oClientProperties['is_mobile']) {
+        for (var i = this.aAvaliableControls.length - 1; i >= 0; i--) {
+            if (aAvaliableMobileControls.indexOf(this.aAvaliableControls[i]['id']) === -1) {
+                this.aAvaliableControls.splice(i, 1);
+            }
+        }
+    }
+};
+// Obligatoire pour instancier dans nsVmap.nsToolsManager.ToolsManager
+goog.exportProperty(nsVmap.nsToolsManager, 'Controls', nsVmap.nsToolsManager.Controls);
+
+/**
+ * Add a control to the ol map
+ * @param {string} control Control to add
+ * @return {boolean} False if the control cannot be added
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Controls.prototype.addControl = function (control) {
+    oVmap.log('nsVmap.nsToolsManager.Controls.prototype.addControl: ' + control);
+
+    switch (control) {
+        case 'Attribution':
+
+            var oControl = new ol.control.Attribution();
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'FullScreen':
+
+            var oControl = new ol.control.FullScreen();
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'MousePosition':
+
+            var oControl = new ol.control.MousePosition({
+                coordinateFormat: function (coordinate) {
+                    return [coordinate[0].toPrecision(8), coordinate[1].toPrecision(8)];
+                }
+            });
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'OverviewMap':
+
+            var oControl = new ol.control.OverviewMap({
+                view: new ol.View({
+                    projection: this.map_.getView().getProjection()
+                })
+            });
+            this.overviewMap_ = oControl;
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'Rotate':
+
+            var oControl = new ol.control.Rotate({
+                autoHide: false
+            });
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'ScaleLine':
+
+            var oControl = new ol.control.ScaleLine({
+                minWidth: 80
+            });
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'Zoom':
+
+            var oControl = new ol.control.Zoom();
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'ZoomSlider':
+
+            var oControl = new ol.control.ZoomSlider();
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+        case 'ZoomToExtent':
+
+            var oControl = new ol.control.ZoomToExtent();
+            oControl.set('type', control);
+            this.map_.addControl(oControl);
+            break;
+//    case 'DragAndDrop':
+//        var mapDiv = document.getElementsByClassName('ol-viewport');
+//        for (var i = 0; i < mapDiv.length; i++) {
+//            mapDiv[i].addEventListener('dragover', this.handleDragOver, false);
+//            mapDiv[i].addEventListener('drop', this.handleFileSelect, false);
+//        }
+//        this.DragAndDrop = true;
+//        break;
+        case 'CurrentProjection':
+
+            $('#olMap').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-current-projection ol-unselectable"><span id="current-projection" class="ol-control"></span></div>');
+
+            $("#current-projection").html(oVmap['oProjections'][oVmap.getMap().getOLMap().getView().getProjection().getCode()]);
+
+            break;
+
+        case 'MapName':
+
+            $('#olMap').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-map-name ol-unselectable"><span id="map-name" class="ol-control"></span></div>');
+            var vMapCatalog = oVmap.getMapManager().getMapCatalog();
+            for (var i = 0; i < vMapCatalog['maps'].length; i++) {
+                if (vMapCatalog['maps'][i]['used'] === true) {
+                    var currentMapName = vMapCatalog['maps'][i]['name'];
+                }
+            }
+            $("#map-name").html(currentMapName);
+            break;
+
+        case 'Scale':
+
+            var tool = '<div class="dropup"> <button class="btn btn-sm btn-default dropdown-toggle padding-sides-10 set-scale-btn" style="width: auto" type="button" onclick="$(\'#scale-list\').toggle()"> <span id="current-scale">' + oVmap.getMap().getScale({
+                "pretty": true
+            }) + '</span> <span class="caret"></span> </button> <ul id="scale-list" style="font-size: 12px" class="dropdown-menu" aria-labelledby="dropdownMenu2"> ' + (oVmap['properties']['is_mobile'] ? '' : '<li><a class="pointer" onclick="$(\'#scale-modal\').modal(\'show\')">Ajouter à la liste</a></li>') + ' <li><a class="pointer" onclick="oVmap.getMap().setScale(1000000)">1:1,000,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(500000)">1:500,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(250000)">1:250,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(100000)">1:100,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(50000)">1:50,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(25000)">1:25,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(10000)">1:10,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(5000)">1:5,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(1000)">1:1,000</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(250)">1:250</a></li> <li><a class="pointer" onclick="oVmap.getMap().setScale(100)">1:100</a></li> </ul> </div>';
+
+            $('#olMap').children().children('.ol-overlaycontainer-stopevent').append('<div id="current-scale-tool" class="ol-current-scale ol-unselectable ol-control"></div>');
+            $("#current-scale-tool").html(tool);
+
+            this.map_.on('click', function () {
+                $('#scale-list').hide();
+            }, this);
+
+            var i = 0;
+            this.map_.on('moveend', function () {
+                i++;
+                var ii = angular.copy(i);
+                setTimeout(function () {
+                    if (i === ii) {
+                        $("#current-scale").html(oVmap.getMap().getScale({
+                            'pretty': true
+                        }));
+                    }
+                }, 100);
+            }, this);
+
+            break;
+        case 'RefreshSocket':
+            oVmap['bRefreshWebsockets'] = true;
+            break;
+        default:
+            console.error("Warning : control (" + control + ") is not available");
+            return false;
+            break;
+    }
+};
+
+/**
+ * Toggle a control to the ol map
+ * @param {string} control Control to toggle
+ * @param {boolean} bActive 
+ * @export
+ */
+nsVmap.nsToolsManager.Controls.prototype.setToolActive = function (control, bActive) {
+    oVmap.log('nsVmap.nsToolsManager.Controls.prototype.setToolActive: ' + control, bActive);
+
+    var oMap = oVmap.getMap().getOLMap();
+    var aControls = oMap.getControls().getArray();
+    bActive = goog.isDef(bActive) ? bActive : true;
+
+    if (bActive === true) {
+        // Ajout du controle
+        this.addControl(control);
+    } else {
+        // Suppression du controls
+        for (var i = 0; i < aControls.length; i++) {
+            if (aControls[i].get('type') === control) {
+                oMap.removeControl(aControls[i]);
+                return 0;
+            }
+        }
+    }
+
+    if (control === 'CurrentProjection') {
+
+        if (bActive === true) {
+            $("#current-projection").show();
+        } else {
+            $("#current-projection").remove();
+        }
+
+    } else if (control === 'Scale') {
+
+        if (bActive === true) {
+            $("#current-scale-tool").show();
+        } else {
+            $("#current-scale-tool").hide();
+        }
+    } else if (control === 'MapName') {
+
+        if (bActive === true) {
+            $("#map-name").show();
+        } else {
+            $("#map-name").remove();
+        }
+
+    } else if (control === 'RefreshSocket') {
+        oVmap['bRefreshWebsockets'] = bActive;
+    }
+};
+
+/**
+ * App-specific directive wrapping the control tools.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Controls.prototype.controlsDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Controls.prototype.controlsDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppControlsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/controls.html'
+    };
+};
+
+/**
+ * Controler that initialise the control tools to use
+ * @ngInject
+ * @constructor
+ */
+nsVmap.nsToolsManager.Controls.prototype.controlsController = function () {
+    oVmap.log("nsVmap.nsToolsManager.Controls.prototype.controlsController");
+
+    /**
+     * The OpenLayers controls
+     * @type {object}
+     * @api stable
+     */
+    this.Controls = this['Controls'] = oVmap.getToolsManager().getBasicTools().getControls();
+
+    /**
+     * Controls avaliable
+     * @type {array}
+     */
+    this['aAvaliableControls'] = this['Controls'].getAvaliableControls();
+
+    /**
+     * Actived controls on array
+     * @type {array}
+     * @private
+     */
+    this.aActiveControls_ = oVmap['properties']['controls']['active_controls'];
+
+    // Vide les controls par défaut
+    var map = oVmap.getMap().getOLMap();
+    var controls = map.getControls().getArray();
+    for (var i = 0; i < controls.length; i++) {
+        map.removeControl(controls[i]);
+    }
+
+    // Ajout des controls
+    for (var i = 0; i < this['aAvaliableControls'].length; i++) {
+        if (this.aActiveControls_.indexOf(this['aAvaliableControls'][i]['id']) !== -1) {
+            this['aAvaliableControls'][i]['active'] = true;
+        } else {
+            this['aAvaliableControls'][i]['active'] = false;
+        }
+        // Ajoute le controle
+        this['Controls'].addControl(this['aAvaliableControls'][i]['id']);
+
+        // Désactive le controle si par défaut il n'est pas actif
+        if (this['aAvaliableControls'][i]['active'] === false)
+            this['Controls'].setToolActive(this['aAvaliableControls'][i]['id'], this['aAvaliableControls'][i]['active']);
+    }
+
+    setTimeout(function () {
+        $('[data-toggle="tooltip"]').tooltip({
+            animation: false
+        });
+    }, 500);
+};
+
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+
+/**
+ * nsVmap.aAvaliableControls getter
+ * @return {array} Controls on the map
+ * @export
+ */
+nsVmap.nsToolsManager.Controls.prototype.getAvaliableControls = function () {
+    return this.aAvaliableControls;
+};
+
+/**
+ * this.overviewMap_ getter
+ * @returns {ol.OverveiwMap}
+ */
+nsVmap.nsToolsManager.Controls.prototype.getOverviewMap = function () {
+    return this.overviewMap_;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appControls', nsVmap.nsToolsManager.Controls.prototype.controlsDirective);
+oVmap.module.controller('AppControlsController', nsVmap.nsToolsManager.Controls.prototype.controlsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/infocontainer.js b/module/javascript/app/vmap/tools/infocontainer.js
new file mode 100644
index 0000000000000000000000000000000000000000..e04b0496471f34d663bfaed78a3dfe88d0e20ac2
--- /dev/null
+++ b/module/javascript/app/vmap/tools/infocontainer.js
@@ -0,0 +1,1253 @@
+/* global goog, nsVmap, oVmap, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.InfoContainer
+ * cette classe permet l'affichage des infos sur la barre du bas
+ */
+goog.provide('nsVmap.nsToolsManager.InfoContainer');
+
+goog.require('oVmap');
+
+goog.require('goog.array');
+goog.require('goog.object');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.InfoContainer}: Add the info container
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer = function () {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer');
+};
+
+
+/**
+ * Show the InfoContainer toggle bar
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.showBar = function () {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.showBar');
+
+    var map = oVmap.getMap().getOLMap();
+    map.once('postcompose', function () {
+        var scope = angular.element($("#infocontainer-info-container")).scope();
+        scope.$evalAsync(function (scope) {
+            scope['ctrl'].showBar();
+        });
+    });
+};
+
+/**
+ * Create and display a tab, if the tab already exist, then the tab is erased
+ * @param {object} opt_options
+ * @param {String} opt_options.tabCode The code of the tab
+ * @param {String} opt_options.tabName The name of the tab
+ * @param {array | undefined} opt_options.columns Array of columns (data keys if undefined)
+ * @param {array | undefined} opt_options.invisibleColumns Array of non visible columns
+ * @param {array<object> | undefined} opt_options.data Data to add ex: [{column1: 'test'}]
+ * @param {ol.Feature | undefined} opt_options.data[i].feature Feature to bind
+ * @param {object | undefined} opt_options.layer layer of the features
+ * @param {array<string> | undefined} opt_options.actions list of the action buttons, avaliable: ["delete", "zoom"]
+ * @returns {string} erorr if something goes wrong
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.addTab = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.addTab');
+
+    if (!goog.isDef(opt_options))
+        return 'opt_options not defined';
+    if (!goog.isDef(opt_options.tabCode))
+        return 'opt_options.tabCode not defined';
+    if (!goog.isDef(opt_options.tabName))
+        return 'opt_options.tabName not defined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        var tab = new nsVmap.nsToolsManager.InfoContainer.Tab(opt_options);
+        scope['ctrl'].addTab(tab);
+    });
+};
+
+/**
+ * Create and display a tab, all the other tabs are removed
+ * @param {object} opt_options
+ * @param {String} opt_options.tabCode The code of the tab
+ * @param {String} opt_options.tabName The name of the tab
+ * @param {array | undefined} opt_options.columns Array of columns (data keys if undefined)
+ * @param {array | undefined} opt_options.invisibleColumns Array of non visible columns
+ * @param {array<object> | undefined} opt_options.data Data to add ex: [{column1: 'test'}]
+ * @param {ol.Feature | undefined} opt_options.data[i].feature Feature to bind
+ * @param {object | undefined} opt_options.layer layer of the features
+ * @param {array<string> | undefined} opt_options.actions list of the action buttons, avaliable: ["delete", "zoom"]
+ * @returns {string} erorr if something goes wrong
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.setTab = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.setTab');
+
+    if (!goog.isDef(opt_options))
+        return 'opt_options not defined';
+    if (!goog.isDef(opt_options.tabCode))
+        return 'opt_options.tabCode not defined';
+    if (!goog.isDef(opt_options.tabName))
+        return 'opt_options.tabName not defined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+
+    // Vide les onglets
+    if (scope['ctrl']['infos'] !== undefined)
+        for (var i = scope['ctrl']['infos'].length - 1; i >= 0; i--) {
+            scope['ctrl']['infos'].splice(i, 1);
+        }
+    ;
+
+    // Ajoute le nouvel onglet
+    scope.$evalAsync(function (scope) {
+        var tab = new nsVmap.nsToolsManager.InfoContainer.Tab(opt_options);
+        scope['ctrl'].addTab(tab);
+    });
+};
+
+/**
+ * Add one row on a tab
+ *
+ * @param {object} row_options
+ * @param {object} row_options.data bootstrap-table data
+ * @param {ol.Feature | undefined} row_options.data[i].feature Feature to bind
+ * @param {object} row_options.columns bootstrap-table columns
+ * @param {array} row_options.invisibleColumns list of the invisible columns
+ *
+ * @param {object} tab_options
+ * @param {string} tab_options.tabCode tab code
+ * @param {integer} tab_options.tabIndex tab index
+ *
+ * @returns {string} error or true if all was executed
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.addRow = function (tab_options, row_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.addRow');
+
+    if (tab_options.tabCode === undefined && tab_options.tabIndex === undefined)
+        return 'bad tab_options';
+    if (row_options.data === undefined)
+        return 'row_options.data undefined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].addRow(tab_options, row_options);
+        scope['ctrl'].refreshTabs();
+    });
+
+    return true;
+};
+
+/**
+ * Add multiple rows on a tab
+ *
+ * @param {object} tab_options
+ * @param {string} tab_options.tabCode tab code
+ * @param {integer} tab_options.tabIndex tab index
+ *
+ * @param {object} row_options
+ * @param {array<object>} row_options.data bootstrap-table data
+ * @param {ol.Feature | undefined} row_options.data[i].feature Feature to bind
+ * @param {object} row_options.columns bootstrap-table columns
+ * @param {array} row_options.invisibleColumns list of the invisible columns
+ *
+ * @returns {string} error or true if all was executed
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.addMultipleRows = function (tab_options, row_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.addMultipleRows');
+
+    if (tab_options.tabCode === undefined && tab_options.tabIndex === undefined)
+        return 'bad tab_options';
+    if (row_options.data === undefined)
+        return 'row_options.data undefined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+
+        var tmpRow = {};
+        for (var i = 0; i < row_options.data.length; i++) {
+            tmpRow = {
+                data: row_options.data[i],
+                columns: row_options.columns,
+                invisibleColumns: row_options.invisibleColumns
+            };
+            scope['ctrl'].addRow(tab_options, tmpRow);
+        }
+        ;
+        scope['ctrl'].refreshTabs();
+    });
+
+    return true;
+};
+
+/**
+ * Refresh the tabs
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.refreshTabs = function () {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.refreshTabs');
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].refreshTabs();
+    });
+
+    return true;
+};
+
+/**
+ * Display the tab by the name
+ * @param {string} tabCode Code of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.displayTabByCode = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.displayTabByCode');
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].displayTabByCode(tabCode);
+    });
+};
+
+/**
+ * Display the tab by the index
+ * @param {integer} index Unique index of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.displayTabByIndex = function (index) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.displayTabByIndex');
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].displayTabByIndex(index);
+    });
+};
+
+/**
+ * Show the InfoContainer
+ * @param {array<object>} infos infos to show:
+ * infos[i]['tabCode'] {string} code of the tab
+ * infos[i]['tabName'] {string} name of the tab
+ * infos[i]['contant'] {string} conent to show before the tab
+ * infos[i]['tableParams'] {object} the params of the bootstrap-table element
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.displayInfos = function (infos) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.displayInfos');
+
+    this.showBar();
+    this.setInfos(infos);
+};
+
+/**
+ * Return the tab
+ * @returns {object} infos of the table
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.getTabByCode = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.getTabByCode');
+
+    var tab = angular.element($("#infocontainer-info-container")).scope()['ctrl'].getTabByCode(tabCode);
+    if (tab !== undefined)
+        return jQuery.extend(true, {}, tab);
+    else
+        return undefined;
+};
+
+/**
+ * Get the tab bootstrap-table element
+ * @param {tab} tab tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.getTabTable = function (tab) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.getTabTable');
+
+    return angular.element($("#infocontainer-info-container")).scope()['ctrl'].getTabTable(tab);
+};
+
+/**
+ * Return the infos of the table
+ * @returns {object} infos of the table
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.getInfos = function () {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.getInfos');
+
+    var aInfos = angular.element($("#infocontainer-info-container")).scope()['ctrl']['infos'];
+    return jQuery.extend(true, [], aInfos);
+};
+
+/**
+ * Set the infos of the table
+ * @param {array<object>} infos infos to show:
+ * infos[i]['tabCode'] {string} code of the tab
+ * infos[i]['contant'] {string} conent to show before the tab
+ * infos[i]['tableParams'] {object} the params of the bootstrap-table element
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.setInfos = function (infos) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.setInfos');
+    oVmap.log(infos);
+
+    //	Remplit this['infos']
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].setInfos(infos);
+    });
+};
+
+/**
+ * Add the infos of a table
+ * @param {array<object>} infos infos to show:
+ * @param {string} infos.i.tabCode code of the tab
+ * @param {string} infos.i.tabName name of the tab
+ * @param {object} infos.i.tableParams the params of the bootstrap-table element
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.addInfos = function (infos) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.addInfos');
+    oVmap.log(infos);
+
+    //	Remplit this['infos']
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].addInfos(infos);
+    });
+};
+
+/**
+ * Delete a tab by tabCode. Warning: this function will not remove the possible features binded on the rows
+ * @param {string} tabCode code of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.removeTabByCode = function (tabCode) {
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    var aInfos = scope['ctrl']['infos'];
+
+    if (tabCode === undefined)
+        return 0;
+    if (aInfos === undefined)
+        return 0;
+
+    for (var i = aInfos.length - 1; i >= 0; i--) {
+        if (aInfos[i]['tabCode'] === tabCode) {
+            aInfos.splice(i, 1);
+        }
+    }
+    ;
+    // Applique la modification à la vue
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].loadTables();
+    });
+};
+
+/**
+ * Delete all the tabs.
+ * Warning: this function will remove the possible features binded on the rows
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.removeAll = function () {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.removeAll');
+
+    // Vide la couche sélection
+    oVmap.getMap().getSelectionOverlayFeatures().clear();
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    var aInfos = scope['ctrl']['infos'];
+
+    if (aInfos === undefined)
+        return 0;
+
+    for (var i = aInfos.length - 1; i >= 0; i--) {
+        aInfos.splice(i, 1);
+    }
+    ;
+    // Applique la modification à la vue
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].loadTables();
+    });
+};
+
+/**
+ * Delete all the rows in the tab.
+ * Warning: this function will remove the possible features binded on the rows
+ * @param {string} tabCode tabCode of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.removeTabRows = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.removeTabRows');
+
+    if (tabCode === undefined)
+        return 0;
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    var tab = this.getTabByCode(tabCode);
+    var tabTable = this.getTabTable(tab);
+
+    for (var i = tab['tableParams']['data'].length - 1; i >= 0; i--) {
+        this.removeRow(tabCode, i);
+    }
+    ;
+};
+
+/**
+ * Delete a row in a tab.
+ * Warning: this function will remove the possible features binded on the rows
+ * @param {string} tabCode tabCode of the tab
+ * @param {integer} rowIndex index of the row
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.removeRow = function (tabCode, rowIndex) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.removeRow');
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    var aInfos = scope['ctrl']['infos'];
+
+    if (tabCode === undefined)
+        return 0;
+    if (aInfos === undefined)
+        return 0;
+    if (rowIndex === undefined)
+        return 0;
+
+    var tab = this.getTabByCode(tabCode);
+    var tabTable = this.getTabTable(tab);
+    var row = tabTable.bootstrapTable('getData')[rowIndex];
+
+    // Supprime si elle existe, la feature correspondante
+    if (goog.isDef(row['feature']))
+        oVmap.getMap().getSelectionOverlay().getSource().removeFeature(row['feature']);
+
+    // Supprime la ligne correspondante
+    for (var i = aInfos.length - 1; i >= 0; i--) {
+        if (aInfos[i]['tabCode'] === tabCode) {
+            aInfos[i]['tableParams']['data'].splice(rowIndex, 1);
+        }
+    }
+    ;
+
+    // Applique la modification à la vue
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].loadTables();
+    });
+};
+
+/**
+ * Zoom on the tab features and pass them on the top of the featureOverlay
+ * @param {string} tabCode code of the tab
+ * @return {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.zoomOnTabFeatures = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.zoomOnTabFeatures');
+
+    if (!goog.isDef(tabCode))
+        return 'tabCode not defined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].zoomOnTabFeatures(tabCode);
+    });
+};
+
+/**
+ * Pass the tab features on the top of the featureOverlay
+ * @param {string} tabCode code of the tab
+ * @return {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.displayTabFeatures = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.displayTabFeatures');
+
+    if (!goog.isDef(tabCode))
+        return 'tabCode not defined';
+
+    var scope = angular.element($("#infocontainer-info-container")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].displayTabFeatures(tabCode);
+    });
+};
+
+/**
+ * Class tab
+ * @param {object} opt_options
+ * @param {String} opt_options.tabCode The code of the tab
+ * @param {String} opt_options.tabName The name of the tab
+ * @param {array | undefined} opt_options.columns Array of columns (data keys if undefined)
+ * @param {array | undefined} opt_options.invisibleColumns Array of non visible columns
+ * @param {array<object> | undefined} opt_options.data Data to add ex: [{column1: 'test'}]
+ * @param {ol.Feature | undefined} opt_options.data[i].feature Feature to bind
+ * @param {array<string> | undefined} opt_options.actions list of the action buttons, avaliable: ["delete", "zoom"]
+ * @returns {integer}
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.Tab = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.Tab');
+
+    if (!goog.isDef(opt_options))
+        return 0;
+    if (!goog.isDef(opt_options.tabCode))
+        return 0;
+    if (!goog.isDef(opt_options.tabName))
+        return 0;
+
+    var columns = [];
+    var htmlContent = [];
+    var actionEvents = {};
+    var className = "";
+
+    opt_options.data = goog.isDef(opt_options.data) ? opt_options.data : [];
+    opt_options.actions = goog.isDef(opt_options.actions) ? opt_options.actions : [];
+
+    // Colones non visibles, vaut "feature" par défaut
+    opt_options.invisibleColumns = goog.isDef(opt_options.invisibleColumns) ?
+            (function () {
+                var tmp = opt_options.invisibleColumns;
+                if (!goog.array.contains(tmp, 'feature'))
+                    tmp.push('feature');
+                return tmp;
+            }()) : ['feature'];
+
+    // Définit les boutons d'action
+    for (var i = 0; i < opt_options.actions.length; i++) {
+
+        if (opt_options.actions[i] === 'delete') {
+            className = 'info-container-' + goog.string.createUniqueString() + '-remove-feature';
+            htmlContent.push('<a class="' + className + '" href="javascript:void(0)" title="Enlever du panier">');
+            htmlContent.push('<i class="glyphicon glyphicon-remove padding-sides-5"></i>');
+            htmlContent.push('</a>');
+
+            actionEvents['click .' + className] = function (e, value, row, index) {
+                oVmap.getToolsManager().getInfoContainer().removeRow(opt_options.tabCode, index);
+            };
+
+        } else if (opt_options.actions[i] === 'zoom') {
+            className = 'info-container-' + goog.string.createUniqueString() + '-zoom-feature';
+            htmlContent.push('<a class="' + className + '" href="javascript:void(0)" title="Zoom sur la géométrie">');
+            htmlContent.push('<i class="glyphicon glyphicon-globe padding-sides-5"></i>');
+            htmlContent.push('</a>');
+            actionEvents['click .' + className] = function (e, value, row, index) {
+                if (!goog.isDef(row['feature'])) {
+                    console.error('Aucune géométrie renseignée dans la colone "feature"');
+                    return 0;
+                }
+                oVmap.getMap().locateFeatures([row['feature']], true, true);
+            };
+        }
+    }
+    ;
+
+    var actionFormatter = function (value, row, index) {
+        return htmlContent.join('');
+    };
+    columns.push({
+        'checkbox': true,
+        'clickToSelect': true,
+        'class': 'info-container-checkbox-column'
+    });
+    columns.push({
+        'formatter': actionFormatter,
+        'class': 'info-container-list-events-column',
+        'events': actionEvents
+    });
+
+    // Si elles ne sont pas renseignées, les colones prennent pour valeur les clés de data
+    opt_options.columns = goog.isDef(opt_options.columns) ? opt_options.columns : (function () {
+        for (var key in opt_options.data[0]) {
+            columns.push({
+                'field': key,
+                'title': key,
+                'sortable': true,
+                'visible': !goog.array.contains(opt_options.invisibleColumns, key)
+            });
+        }
+        return columns;
+    })();
+
+    var tableParams = {
+        'search': true,
+//        'clickToSelect': true,
+        'checkboxHeader': true,
+        'data': opt_options.data,
+        'columns': opt_options.columns
+    };
+
+    this['tabCode'] = opt_options.tabCode;
+    this['tabName'] = opt_options.tabName;
+    this['tableParams'] = tableParams;
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * Directive
+ * @returns {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'infos': '=appInfos'
+        },
+        controller: 'AppInfocontainerController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/infocontainer.html'
+    };
+};
+
+/**
+ * Controller
+ * @ngInject
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController = function ($timeout, $scope) {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController");
+
+    /**
+     * @private
+     */
+    this.$timeout = $timeout;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * Infos to display
+     * @type {array<object>}
+     */
+    this['infos'] = [];
+
+    /**
+     *
+     */
+    this['selectedTabIndex'] = 0;
+
+    this['avaliablePrintReports'] = [];
+
+    // Vide la panier quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        oVmap.getToolsManager().getInfoContainer().removeAll();
+    });
+};
+
+/**
+ * Show the infos container's bar
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.showBar = function () {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.infocontainerController.showBar");
+
+    // Affiche la barre de selection
+    if ($("#opener-bottombar").css("visibility") === "hidden") {
+        $("#opener-bottombar").css("visibility", "visible");
+    }
+    $("#map-container").addClass('minus');
+
+    // Ouvre la barre
+    this.$timeout(function () {
+        if (($("#map-container").hasClass("open") === false) && ($("#map-container").hasClass("open2") === false))
+            oVmap.simuleClick('opener-bottombar-1');
+    });
+};
+
+/**
+ * Display the tab by the index
+ * @param {number} tabIndex index of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.displayTabByIndex = function (tabIndex) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.displayTabByIndex');
+    this['selectedTabIndex'] = tabIndex;
+};
+
+/**
+ * Display the tab by the name
+ * @param {string} tabCode Code of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.displayTabByCode = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.displayTabByCode');
+
+    // Cherche l'onglet
+    for (var i = 0; i < this['infos'].length; i++) {
+        if (this['infos'][i]['tabCode'] === tabCode) {
+            var tabIndex = i;
+        }
+    }
+
+    // Afiche l'onglet
+    this.displayTabByIndex(tabIndex);
+};
+
+/**
+ * Get the tab by the name
+ * @param {string} tabCode Code of the tab
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.getTabByCode = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.getTabByCode');
+
+    // Cherche l'onglet
+    for (var i = 0; i < this['infos'].length; i++) {
+        if (this['infos'][i]['tabCode'] === tabCode) {
+            return this['infos'][i];
+        }
+    }
+    ;
+};
+
+/**
+ * Get the tab bootstrap-table element
+ * @param {tab} tab tab
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.getTabTable = function (tab) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.getTabTable');
+
+    if (tab === undefined)
+        return 0;
+
+    return $("#infocontainer-table-" + tab['index']);
+};
+
+/**
+ * Add a tab on the bar, if the tab already exist, then the tab is erased
+ * @param {array<object>} tab Tab parameters
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.addTab = function (tab) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.addTab');
+
+    // Vérifie si l'onglet existe
+    for (var i = 0; i < this['infos'].length; i++) {
+        if (this['infos'][i]['tabCode'] === tab['tabCode']) {
+            var bTabExists = true;
+            oVmap.log('onglet "' + this['infos'][i]['tabCode'] + '"" déjà présent');
+            this['infos'][i] = tab;
+        }
+    }
+
+    if (bTabExists === undefined)
+        this['infos'].push(tab);
+
+    var infocontainerController = this;
+    // Reload les données des tableaux après avoir mis à jour la vue
+    this.$timeout(function () {
+        // Recharge les tables
+        infocontainerController.loadTables();
+    });
+};
+
+/**
+ * Add a row on a tab
+ *
+ * @param {object} row_options
+ * @param {object} row_options.data bootstrap-table data
+ * @param {object} row_options.columns bootstrap-table columns
+ * @param {array} row_options.invisibleColumns list of the invisible columns
+ *
+ * @param {object} tab_options
+ * @param {string} tab_options.tabCode tab code
+ * @param {integer} tab_options.tabIndex tab index
+ *
+ * @returns {string} error or true if all was executed
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.addRow = function (tab_options, row_options) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.addRow');
+
+    if (tab_options.tabCode === undefined && tab_options.tabIndex === undefined)
+        return 'bad tab_options';
+    if (row_options.data === undefined)
+        return 'row_options.data undefined';
+
+    // Paramétrage des colones non visibles, "feature" par défaut
+    row_options.invisibleColumns = goog.isDef(row_options.invisibleColumns) ?
+            (function () {
+                var tmp = row_options.invisibleColumns;
+                if (!goog.array.contains(tmp, 'feature'))
+                    tmp.push('feature');
+                return tmp;
+            }()) : ['feature'];
+
+    // Paramétrage de l'onglet correspondant
+    var tab = goog.isDef(tab_options.tabCode) ? this.getTabByCode(tab_options.tabCode) : this['infos'][tab_options.tabIndex];
+
+    if (!goog.isDefAndNotNull(tab)) {
+        cosnole.error('impossible de trouver la tab, tab_options:', tab_options);
+        return 0;
+    }
+
+    // Si elles ne sont pas renseignées, les colones prennent pour valeur les clés de data
+    var columns = goog.isDef(row_options.columns) ? row_options.columns : (function () {
+        var columns = [];
+        for (var key in row_options.data) {
+            columns.push({
+                'field': key,
+                'title': key,
+                'sortable': true,
+                'visible': !goog.array.contains(row_options.invisibleColumns, key)
+            });
+        }
+        return columns;
+    })();
+
+    // Test si la ligne existe
+    for (var i = 0; i < tab['tableParams']['data'].length; i++) {
+        bRowExists = true;
+        for (var ii = 0; ii < columns.length; ii++) {
+            if (columns[ii]['field'] !== 'feature')
+                if (goog.object.contains(tab['tableParams']['data'][i], row_options.data[columns[ii]['field']]) === false)
+                    bRowExists = false;
+        }
+        // Si la ligne existe
+        if (bRowExists === true) {
+            oVmap.log('ligne déjà existante');
+            return 'ligne déjà existante';
+        }
+    }
+
+    // Ajoute les nouvelles colonnes si besoin
+    for (var i = 0; i < columns.length; i++) {
+        var bColumnExists = false;
+
+        // Test si la colonnes existe
+        for (var ii = 0; ii < tab['tableParams']['columns'].length; ii++) {
+            if (tab['tableParams']['columns'][ii]['field'] === columns[i]['field'])
+                bColumnExists = true;
+        }
+
+        // Insertion de la colonne
+        if (bColumnExists === false)
+            goog.array.insert(tab['tableParams']['columns'], columns[i]);
+    }
+
+    var aRowData = {};
+    for (var key in row_options.data) {
+        if (goog.isString(row_options.data[key])) {
+//            aRowData[key] = row_options.data[key].replace(/</g, "&lt;").replace(/>/g, "&gt;");
+
+            // Recherche les liens
+            if (oVmap.isLink(row_options.data[key], 'bo_link')) {
+                row_options.data[key] = oVmap.parseLink(row_options.data[key], 'bo_link');
+            }
+
+            // Prévention d'injections XSS
+            aRowData[key] = oVmap['$sanitize'](row_options.data[key]);
+        } else {
+            aRowData[key] = row_options.data[key];
+        }
+    }
+
+    // Insertion de la ligne
+    goog.array.insert(tab['tableParams']['data'], aRowData);
+
+    return true;
+};
+
+/**
+ * Refresh the tabs
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.refreshTabs = function () {
+
+    // Reload les données des tableaux
+    var infocontainerController = this;
+    this.$timeout(function () {
+        // Recharge les tables
+        infocontainerController.loadTables();
+    });
+};
+
+/**
+ * Add the infos of a table
+ * @param {array<object>} infos infos to show:
+ * @param {string} infos.i.tabCode code of the tab
+ * @param {string} infos.i.tabName name of the tab
+ * @param {object} infos.i.tableParams the params of the bootstrap-table element
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.addInfos = function (infos) {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.infocontainerController.addInfos");
+
+    if (infos === undefined)
+        return 0;
+    if (this['infos'].length === 0)
+        return this.setInfos(infos);
+
+    for (var i = 0; i < infos.length; i++) {
+
+        var bTabExists = false;
+        for (var ii = 0; ii < this['infos'].length; ii++) {
+            // Vérifie si l'onglet existe déjà
+            if (this['infos'][ii]['tabCode'] === infos[i]['tabCode']) {
+                bTabExists = true;
+
+                // Ajoute les lignes correspondantes
+                for (var iii = 0; iii < infos[i]['tableParams']['data'].length; iii++) {
+                    goog.array.insert(this['infos'][ii]['tableParams']['data'], infos[i]['tableParams']['data'][iii]);
+                }
+            }
+        }
+
+        if (bTabExists === false)
+            goog.array.insert(this['infos'], infos[i]);
+    }
+
+    var infocontainerController = this;
+
+    // Reload les données des tableaux après avoir mis à jour la vue
+    this.$timeout(function () {
+        // Recharge les tables
+        infocontainerController.loadTables();
+    });
+};
+
+/**
+ * Set the infos
+ * @param {object} infos
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.setInfos = function (infos) {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.infocontainerController.setInfos");
+
+    if (infos === undefined)
+        return 0;
+
+    this['infos'] = infos;
+
+    var infocontainerController = this;
+
+    // Reload les données des tableaux après avoir mis à jour la vue
+    this.$timeout(function () {
+        // Recharge les tables
+        infocontainerController.loadTables();
+    });
+};
+
+/**
+ * Delete all the rows in the tab.
+ * Warning: this function will remove the possible features binded on the rows
+ * @param {string} tabCode tabCode of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.removeTabRows = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.removeTabRows');
+
+    if (tabCode === undefined)
+        return 0;
+
+    $('body').css({"cursor": "wait"});
+    var tab = this.getTabByCode(tabCode);
+    var row = {};
+
+    for (var i = tab['tableParams']['data'].length - 1; i >= 0; i--) {
+        row = tab['tableParams']['data'][i];
+        if (goog.array.contains(oVmap.getMap().getSelectionOverlay().getSource().getFeatures(), row['feature']))
+            oVmap.getMap().getSelectionOverlay().getSource().removeFeature(row['feature']);
+        tab['tableParams']['data'].splice(i, 1);
+    }
+    ;
+    $('body').css({"cursor": ""});
+
+    var infocontainerController = this;
+    // Reload les données des tableaux après avoir mis à jour la vue
+    this.$timeout(function () {
+        // Recharge les tables
+        infocontainerController.loadTables();
+    });
+};
+
+/**
+ * Remove/close the tab
+ * @param {type} oTab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.removeTab = function (oTab) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.removeTab');
+
+    var this_ = this;
+    var tabDisplayed = false;
+    var removedTabDisplayed = false;
+    var iRemovedTabPosition = 0;
+    var iFutureTabPosition = 0;
+    var selectedTabIndex;
+
+    // Récupère la position de l'onglet à supprimer
+    for (var i = 0; i < this['infos'].length; i++) {
+        if (this['infos'][i]['index'] === oTab['index']) {
+            iRemovedTabPosition = angular.copy(i);
+        }
+    }
+
+    // Récupère l'identifiant de l'onglet sélectionné
+    if (goog.isDefAndNotNull(this['selectedTabIndex'])) {
+        if (goog.isDefAndNotNull(this['infos'][this['selectedTabIndex']])) {
+            tabDisplayed = true;
+            selectedTabIndex = angular.copy(this['infos'][this['selectedTabIndex']]['index']);
+        }
+    }
+
+    // Supprime l'onglet
+    this.removeTabByCode(oTab['tabCode']);
+    setTimeout(function () {
+
+        // Re-selectionne l'onglet précédemment selectionné si besoin
+        if (tabDisplayed) {
+            for (var i = 0; i < this_['infos'].length; i++) {
+                if (this_['infos'][i]['index'] === selectedTabIndex) {
+                    iFutureTabPosition = angular.copy(i);
+                    console.log("tab already displayed !");
+                }
+            }
+        }
+
+        // Vérifie si l'onglet qui vient d'être supprimé était celui sélectionné
+        if (goog.isDefAndNotNull(this_['selectedTabIndex'])) {
+            if (goog.isDefAndNotNull(iRemovedTabPosition)) {
+                if (this_['selectedTabIndex'] === iRemovedTabPosition) {
+                    removedTabDisplayed = true;
+                }
+            }
+        }
+
+        // Décide de la future position à selectionner
+        if (removedTabDisplayed) {
+            if (goog.isDefAndNotNull(this_['infos'][iRemovedTabPosition])) {
+                iFutureTabPosition = iRemovedTabPosition;
+            } else if (goog.isDefAndNotNull(this_['infos'][iRemovedTabPosition - 1])) {
+                iFutureTabPosition = iRemovedTabPosition - 1;
+            }
+        }
+
+        // Affiche l'onglet voulu
+        this_.$scope_.$applyAsync(function () {
+            this_.displayTabByIndex(iFutureTabPosition);
+        });
+    });
+};
+
+/**
+ * Delete a tab by tabCode. Warning: this function will not remove the possible features binded on the rows
+ * @param {string} tabCode code of the tab
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.removeTabByCode = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.removeTabByCode');
+
+    var aInfos = this['infos'];
+
+    for (var i = aInfos.length - 1; i >= 0; i--) {
+        if (aInfos[i]['tabCode'] === tabCode) {
+            this.removeTabRows(tabCode);
+            aInfos.splice(i, 1);
+        }
+    }
+    ;
+};
+
+/**
+ * Zoom on the tab features and pass them on the top of the featureOverlay
+ * @param {string} tabCode code of the tab
+ * @return {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.zoomOnTabFeatures = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.zoomOnTabFeatures');
+
+    if (!goog.isDef(tabCode))
+        return 'tabCode not defined';
+
+    var aFeatures = [];
+    var data = this.getTabByCode(tabCode)['tableParams']['data'];
+
+    /**
+     * Stockage des features
+     */
+    for (var i = data.length - 1; i >= 0; i--) {
+        if (goog.isDef(data[i]['feature']))
+            goog.array.insert(aFeatures, data[i]['feature']);
+    }
+
+    oVmap.getMap().selectFeatures(aFeatures, false, true);
+};
+
+/**
+ * Display pass the tab features on the top of the featureOverlay
+ * @param {string} tabCode code of the tab
+ * @return {string} error
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.displayTabFeatures = function (tabCode) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.displayTabFeatures');
+
+    if (!goog.isDef(tabCode))
+        return 'tabCode not defined';
+
+    var features = [];
+    var data = this.getTabByCode(tabCode)['tableParams']['data'];
+
+    /**
+     * Stockage des features
+     */
+    for (var i = data.length - 1; i >= 0; i--) {
+        if (goog.isDef(data[i]['feature']))
+            goog.array.insert(features, data[i]['feature']);
+    }
+
+    if (features.length === 0)
+        return 0;
+
+    /**
+     * Ajoute les features au dessus
+     */
+    for (var i = features.length - 1; i >= 0; i--) {
+        if (goog.array.contains(oVmap.getMap().getSelectionOverlay().getSource().getFeatures(), features[i]))
+            oVmap.getMap().getSelectionOverlay().getSource().removeFeature(features[i]);
+        oVmap.getMap().getSelectionOverlay().getSource().addFeature(features[i]);
+    }
+};
+
+/**
+ * Load the tables
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.loadTables = function () {
+    oVmap.log("nsVmap.nsToolsManager.InfoContainer.infocontainerController.loadTables");
+
+    for (var i = this['infos'].length - 1; i >= 0; i--) {
+
+        $("#infocontainer-table-" + i).bootstrapTable('destroy');
+        $("#infocontainer-table-" + i).bootstrapTable(this['infos'][i]['tableParams']);
+        $("#infocontainer-table-" + i).bootstrapTable('load', this['infos'][i]['tableParams']);
+        $("#infocontainer-table-" + i).bootstrapTable('resetView', this['infos'][i]['tableParams']);
+        $("#infocontainer-table-" + i).bootstrapTable('resetWidth');
+    }
+};
+
+/**
+ * Set the avaliable business objects
+ * @param {string} business_object_id
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.setAvaliablePrintReports = function (business_object_id) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.setReports');
+
+    var this_ = this;
+
+    // Vide le tableau de rapports en cours
+    if (goog.isArray(this['avaliablePrintReports']))
+        this['avaliablePrintReports'].length = 0;
+    else
+        this['avaliablePrintReports'] = [];
+
+    if (!goog.isDefAndNotNull(business_object_id)) {
+        $.notify('Aucun rapport disponible', 'warning');
+        return 0;
+    }
+
+    // Recharge les nouvelles valeurs du tableau de rapports
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/printreports',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'attributs': 'name|printreport_id|business_object_id|business_object_id_field|multiobject',
+            'filter': {
+                "column": "business_object_id",
+                "compare_operator": "=",
+                "value": business_object_id
+            }
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                console.error('response.data undefined: ', response);
+                $('#infocontainer-dropdown-reports').dropdown('toggle');
+                return 0;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                $.notify('Aucun rapport disponible pour ' + business_object_id, 'warning');
+                $('#infocontainer-dropdown-reports').dropdown('toggle');
+                return 0;
+            }
+            this_['avaliablePrintReports'] = response['data']['data'];
+        }
+    });
+};
+
+/**
+ * Generate the report
+ * @param {object} printreport
+ * @param {string} printreport.printreport_id
+ * @param {string} printreport.business_object_id_field
+ * @param {string} tabIndex
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.generatePrintReport = function (printreport, tabIndex) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.generatePrintReport');
+
+    var aSelection = $('#infocontainer-table-' + tabIndex).bootstrapTable('getSelections');
+
+    if (!goog.isArray(aSelection)) {
+        $.notify('Impossible de récupérer la sélection du tableau');
+        return 0;
+    }
+    if (aSelection.length <= 0) {
+        $.notify('Aucun élément sélectionné');
+        return 0;
+    }
+
+    // Construction de aIds
+    var aIds = [];
+    for (var i = 0; i < aSelection.length; i++) {
+        if (goog.isDefAndNotNull(aSelection[i][printreport['business_object_id_field']])) {
+            aIds.push(aSelection[i][printreport['business_object_id_field']]);
+        }
+    }
+
+    if (!aIds.length > 0) {
+        $.notify('Génération du document impossible');
+        console.error('generated aIds is empty');
+        return 0;
+    }
+
+    oVmap.generatePrintReport({
+        'printReportId': printreport['printreport_id'],
+        'ids': aIds
+    });
+};
+
+/**
+ * Export a table into a file
+ * @param {indeger} tabIndex index from the table
+ * @param {string} sFormat (json, xml, csv, txt, sql, excel)
+ * @export
+ */
+nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController.prototype.exportTable = function (tabIndex, sFormat) {
+    oVmap.log('nsVmap.nsToolsManager.InfoContainer.infocontainerController.exportTable');
+
+    $('#infocontainer-table-' + tabIndex)['tableExport']({
+        'type': sFormat,
+        'escape': false,
+        'ignoreColumn': [0, 1]
+    });
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appInfocontainer', nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerDirective);
+oVmap.module.controller('AppInfocontainerController', nsVmap.nsToolsManager.InfoContainer.prototype.infocontainerController);
diff --git a/module/javascript/app/vmap/tools/insert.js b/module/javascript/app/vmap/tools/insert.js
new file mode 100644
index 0000000000000000000000000000000000000000..803d13add3e95a2916e129c4eb60e6db3b981b01
--- /dev/null
+++ b/module/javascript/app/vmap/tools/insert.js
@@ -0,0 +1,1641 @@
+/* global goog, nsVmap, oVmap, ol, angular, scope, bootbox, destructor_form, constructor_form, vitisApp */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Insert
+ * cette classe permet l'insertion de données danns les objets métier
+ */
+goog.provide('nsVmap.nsToolsManager.Insert');
+
+goog.require('oVmap');
+
+goog.require('ol.layer.Vector');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.style.Style');
+goog.require('ol.style.Stroke');
+goog.require('ol.format.WKT');
+goog.require('goog.array');
+goog.require('goog.object');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Insert}: allow insert
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Insert = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert');
+};
+
+/**
+ * App-specific directive wrapping the insert tools.
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Insert.prototype.inserttoolDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppInsertController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'insert_mobile.html' : 'insert.html')
+    };
+};
+
+/**
+ * @ngInject
+ * @constructor
+ * @param {object} $scope
+ * @param {object} $rootScope
+ * @param {object} $q
+ * @returns {nsVmap.nsToolsManager.Insert.prototype.inserttoolController}
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope, $rootScope, $q, $element) {
+    oVmap.log("nsVmap.nsToolsManager.Insert.prototype.inserttoolController");
+
+    /**
+     * The vMap scope
+     */
+    $scope['vmapScope'] = oVmap['scope'];
+
+    /**
+     * Pointer on "this"
+     * @type nsVmap.nsToolsManager.Insert.prototype.inserttoolController
+     */
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$rootScope_ = $rootScope;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * Dummy canceler (use canceler.resolve() for cancel the ajax request)
+     * @private
+     */
+    this.canceler_ = $q.defer();
+
+    /**
+     * @type string
+     * @private
+     */
+    this.sProjection = this['map'].getView().getProjection().getCode();
+
+    /**
+     * @type ol.format.GeoJSON
+     * @private
+     */
+    this.GeoJSON_ = new ol.format.GeoJSON({defaultDataProjection: this.sProjection});
+
+    /**
+     * @type {ol.interaction.Draw}
+     * @private
+     */
+    this.draw_;
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOverlayLayer_ = oVmap.getMap().addVectorLayer();
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOverlayFeatures_ = this.oOverlayLayer_.getSource().getFeaturesCollection();
+
+    /**
+     * Overlay contenant les trous des polygones (invisible)
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOverlayHolesLayer_ = oVmap.getMap().addVectorLayer({
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(0, 0, 0, 0)'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.interaction.Modify}
+     * @private
+     */
+    this.modify_ = new ol.interaction.Modify({
+        features: this.oOverlayFeatures_
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.delete_ = new ol.interaction.Select({
+        layers: [this.oOverlayLayer_]
+    });
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     *
+     */
+    this['addPartGeomType'] = '';
+
+    /**
+     * Booléen représentant l'ouverture du SnapMenu
+     */
+    this['isSnapMenuCollapse'] = false;
+
+    /**
+     * Object contenant les diverses options de snapping
+     */
+    this['snapOptions'] = {
+        'mode': 'segment_edge_node',
+        'tolerance': 15,
+        'limit': 2000,
+        'visible': false
+    };
+    if (goog.isDefAndNotNull(oVmap['properties']['snapping'])) {
+        this['snapOptions']['tolerance'] = oVmap['properties']['snapping']['defaut_tolerance'];
+        this['snapOptions']['mode'] = oVmap['properties']['snapping']['defaut_snapp_mode'];
+        this['snapOptions']['limit'] = oVmap['properties']['snapping']['defaut_limit'];
+        this['snapOptions']['visible'] = oVmap['properties']['snapping']['defaut_visibility'];
+    }
+
+    /**
+     * Object temporaire permettant l'édition des diverses options de snapping
+     */
+    this['tmpSnapOptions'] = angular.copy(this['snapOptions']);
+
+    /**
+     * Définit si l'échélle est dans la tranche allouée par l'objet métier
+     */
+    this['isMaxScaleOk'] = true;
+
+    /**
+     * Définit si l'échélle est dans la tranche allouée par l'objet métier
+     */
+    this['isMinScaleOk'] = true;
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oSnapOverlayLayer_ = new ol.layer.Vector({
+        map: oVmap.getMap().getOLMap(),
+        visible: false,
+        source: new ol.source.Vector({
+            useSpatialIndex: false
+        }),
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(255, 255, 255, 0.2)'
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#1000ff',
+                width: 2
+            }),
+            image: new ol.style.Circle({
+                radius: 3,
+                fill: new ol.style.Fill({
+                    color: '#1000ff'
+                })
+            })
+        }),
+    });
+
+    /**
+     * @type {ol.interaction.Snap}
+     * @private
+     */
+    this.snap_ = new ol.interaction.Snap({
+        vertex: true,
+        edge: (this['snapOptions']['mode'] === 'segment_edge_node' ? true : false),
+        pixelTolerance: this['snapOptions']['tolerance'],
+        source: this.oSnapOverlayLayer_.getSource()
+    });
+
+    /**
+     * The bo selected for insert in
+     */
+    $scope['selectedBoId'];
+
+    /**
+     * Insertable Business Objects
+     */
+    $scope['aInsertableBOs'] = oVmap.getMapManager().getInsertableBusinessObjects();
+
+    /**
+     * Queryable Business Objects
+     */
+    $scope['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+
+    /**
+     * Object to insert
+     * oInsertObject.sFormDefinitionName name of the form (insert, upload, display)
+     * oInsertObject.oResult result to send via http request
+     * oInsertObject.sGeomColumn name of the column witch contains the geom of the business object
+     * oInsertObject.sGeomType type of the sGeomColumn (POINT, MULTIPOINT, GEOMETRYCOLLECTION)
+     * oInsertObject.oFormDefinition Form definition (JSON)
+     * oInsertObject.oFormValues Values of the form
+     * @type {object}
+     */
+    $scope['oInsertObject'] = {
+        'sFormDefinitionName': 'insert',
+        'business_object_id': null,
+        'oResult': {},
+        'sGeomColumn': null,
+        'sGeomType': null,
+        'oFormDefinition': {},
+        'add_form_size': 1,
+        'oFormValues': {
+            'insert': {}
+        }
+    };
+
+    $scope['featuresLength'] = 0;
+
+    // Alimente $scope['aInsertableLayers'] lors des changements de couches
+    oVmap['scope'].$on('layersChanged', function () {
+        this_.loadInsertableBos();
+    });
+    setTimeout(function () {
+        this_.loadInsertableBos();
+    });
+
+    // Supprime la feature lors de la sélection sur l'interaction this.delete_
+    this.delete_.on('select', function () {
+        var aSelectedFeatures = this.delete_.getFeatures().getArray();
+        for (var i = 0; i < aSelectedFeatures.length; i++) {
+            this.oOverlayLayer_.getSource().removeFeature(aSelectedFeatures[i]);
+        }
+        this.delete_.getFeatures().clear();
+    }, this);
+
+    /**
+     * Outil de suppression de trous
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.deleteHole_ = new ol.interaction.Select({
+        layers: [this.oOverlayHolesLayer_]
+    });
+
+    // Supprime du trou de la feature (si il existe) feature lors de la sélection sur l'interaction this.deleteHole_
+    this.deleteHole_.on('select', this.deleteHole, this);
+
+    // Lance updateInsertObjectFeature lors de chaque changement sur this.oOverlayFeatures_
+    // si il n'y a pas eut de changements pendant 500ms
+    var iTmpChanges = 0;
+    this.oOverlayLayer_.getSource().on('change', function () {
+
+        // Retire les anciennes features si on est pas en mode multi
+        var sGeomType = $scope['oInsertObject']['sGeomType'];
+        // Si il ne s'agit pas d'une géométrie multiple
+        if (goog.isDefAndNotNull(sGeomType)) {
+            if (sGeomType.substr(0, 5) !== 'MULTI' && sGeomType !== 'GEOMETRYCOLLECTION') {
+                if (this.oOverlayFeatures_.getLength() > 1) {
+                    while (this.oOverlayFeatures_.getLength() > 1) {
+                        this.oOverlayFeatures_.removeAt(0);
+                    }
+                }
+            }
+        }
+
+        // Si il n'y a pas eut de changements pendant 500ms, lance updateInsertObjectFeature
+        iTmpChanges++;
+        var iTmpChangesCopy = angular.copy(iTmpChanges);
+        setTimeout(function () {
+            if (iTmpChanges === iTmpChangesCopy) {
+                this_.updateInsertObjectFeature();
+            }
+        }, 500);
+    }, this);
+
+    // Scroll en haut du formReader lors de l'affichage de la modale
+    $('#basictools-insert-form-reader-modal').on('shown.bs.modal', function (e) {
+        $('#basictools-insert-form-reader').parent().scrollTop(0);
+    });
+
+    // Vide les information saisies quand on change d'outil
+    oVmap['scope'].$on('toggleOutTools', function () {
+        // Vide oResult et oFormValues
+        $scope['oInsertObject']['oResult'] = {};
+        $scope['oInsertObject']['oFormValues']['insert'] = {};
+        // Vide selected bo_id
+        $scope['selectedBoId'] = null;
+        // Vide les features ayant pu être dessinées
+        this_.oOverlayFeatures_.clear();
+        // Supprime le snapping
+        this_.oSnapOverlayLayer_.getSource().clear();
+        oVmap.getMap().getOLMap().removeInteraction(this_.snap_);
+    });
+
+    this.oOverlayFeatures_.on('change:length', function () {
+        $scope.$applyAsync(function () {
+            $scope['featuresLength'] = this_.oOverlayFeatures_.getLength();
+        });
+    }, this);
+
+    // Au changement d'objet métier en cours d'insertion
+    this.$scope_.$watch('selectedBoId', function () {
+        this_.updateInsertForm();
+        this_.selectCurrentBoForSnapping();
+    });
+
+    // Affiche les modales en plein écran pour la version mobile
+    if (oVmap['properties']['is_mobile']) {
+        $element.find('.modal').on('shown.bs.modal', function () {
+            $('.modal-backdrop.fade.in').hide();
+            $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+        });
+    }
+
+    // Lance la fonction de rechargement à chaque fois qui l'utilisateur finit de bouger la carte
+    oVmap.getMap().getOLMap().on('moveend', function () {
+        this_.checkEditionScale();
+        this_.loadVectorSnappingData();
+    });
+};
+
+/**
+ * Charge la liste des objets métier
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadInsertableBos = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.loadInsertableBos');
+    var this_ = this;
+
+    this.$scope_.$applyAsync(function () {
+        setTimeout(function () {
+            this_.$scope_['aInsertableBOs'] = oVmap.getMapManager().getInsertableBusinessObjects();
+            this_.$scope_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+
+            // Mobile: cache le bouton "Insertion" si aucun bo est insertable
+            if (goog.isDefAndNotNull(this_.$scope_['aInsertableBOs'])) {
+                if (oVmap['properties']['is_mobile']) {
+                    if (this_.$scope_['aInsertableBOs'].length > 0) {
+                        $('#vmap_menu_mobile_menu_insert_button').show();
+                    } else {
+                        $('#vmap_menu_mobile_menu_insert_button').hide();
+                    }
+                }
+            }
+        });
+    });
+
+    this.checkEditionScale();
+};
+
+/**
+ * Charge la liste des objets métier pour le snapping
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.selectCurrentBoForSnapping = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.selectCurrentBoForSnapping');
+    var this_ = this;
+
+    for (var i = 0; i < this_.$scope_['aQueryableBOs'].length; i++) {
+        this_.$scope_['aQueryableBOs'][i]['loadCanceller'] = this_.$q_.defer();
+        this_.$scope_['aQueryableBOs'][i]['isMouseOverSnaoMenuOb'] = false;
+        this_.$scope_['aQueryableBOs'][i]['bo_snapping_loaded'] = null;
+        if (this_.$scope_['aQueryableBOs'][i]['bo_id'] === this_.$scope_['selectedBoId']) {
+            this_.$scope_['aQueryableBOs'][i]['bo_snapping_enabled'] = true;
+        } else
+            this_.$scope_['aQueryableBOs'][i]['bo_snapping_enabled'] = false;
+    }
+
+    this.checkEditionScale();
+};
+
+/**
+ * Vérifie que l'échelle en cours respecte les spécification de l'objet métier
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.checkEditionScale = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.checkEditionScale');
+
+    var oBo;
+    for (var i = 0; i < this.$scope_['aQueryableBOs'].length; i++) {
+        if (this.$scope_['aQueryableBOs'][i]['bo_id'] === this.$scope_['selectedBoId']) {
+            oBo = this.$scope_['aQueryableBOs'][i];
+            break;
+        }
+    }
+
+    if (!goog.isDefAndNotNull(oBo)) {
+        return;
+    }
+
+    var maxScale = oBo['bo_max_edition_scale'];
+    var minScale = oBo['bo_min_edition_scale'];
+
+    this['isMaxScaleOk'] = true;
+    this['isMinScaleOk'] = true;
+
+    if (this['currentAction'].substr(0, 18) === 'basicTools-insert-') {
+        if (goog.isDefAndNotNull(minScale)) {
+            minScale = parseFloat(minScale);
+            if (oVmap.getMap().getScale() < minScale) {
+                oVmap.getMap().getMapTooltip().displayMessage('Échelle minimale de saisie atteinte, dé-zoomez pour continuer');
+                this['isMinScaleOk'] = false;
+                if (this['addPartGeomType'] === 'Point') {
+                    this.draw_.setActive(false);
+                }
+            } else {
+                this['isMinScaleOk'] = true;
+            }
+        }
+        if (goog.isDefAndNotNull(maxScale)) {
+            maxScale = parseFloat(maxScale);
+            if (oVmap.getMap().getScale() > maxScale) {
+                oVmap.getMap().getMapTooltip().displayMessage('Échelle maximale de saisie atteinte, zoomez pour continuer');
+                this['isMaxScaleOk'] = false;
+                if (this['addPartGeomType'] === 'Point') {
+                    this.draw_.setActive(false);
+                }
+            } else {
+                this['isMaxScaleOk'] = true;
+            }
+        }
+        if (this['isMinScaleOk'] && this['isMaxScaleOk']) {
+            if (!this.draw_.getActive()) {
+                this.draw_.setActive(true);
+            }
+            if (this.draw_.getActive()) {
+                oVmap.getMap().getMapTooltip().displayMessage('Cliquez pour commencer à dessiner');
+            }
+        }
+    }
+};
+
+
+
+// Opérations sur les couches
+
+/**
+ * Get the Insertable layers
+ * @returns {Array}
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getInsertableLayers = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.getInsertableLayers');
+    return oVmap.getMapManager().getInsertableLayers();
+};
+
+/**
+ * Reload the layer by his business object ID
+ * @param {string} sBusinessObjectID
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.reloadImpactedLayer = function (sBusinessObjectID) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.reloadImpactedLayer');
+
+    var aLayers = this['map'].getLayers().getArray();
+    var aBos;
+
+    for (var i = 0; i < aLayers.length; i++) {
+        aBos = aLayers[i].get('business_objects');
+        if (goog.isArray(aBos)) {
+            for (var ii = 0; ii < aBos.length; ii++) {
+                if (aBos[ii]['business_object_id'] === sBusinessObjectID) {
+                    aLayers[i].refreshWithTimestamp();
+                }
+            }
+        }
+    }
+};
+
+
+
+
+// Edition des attributs
+
+/**
+ * Display the edit form
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.displayEditFrom = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.displayEditFrom');
+
+    var $scope = this.$scope_;
+
+    oVmap.getToolsManager().getBasicTools().showTool($('#basic-tools-dropdown-insert-btn'));
+    $('#basictools-insert-form-reader-modal').modal('show');
+
+    // Charge les valeurs par défaut, listes etc..
+    var editFormReaderScope = this.getEditFormReaderScope();
+    editFormReaderScope.$evalAsync(function () {
+
+        // Tente de lancer destructor_form
+        try {
+            if (goog.isDef(destructor_form)) {
+                destructor_form();
+            }
+        } catch (e) {
+            oVmap.log("destructor_form does not exist");
+        }
+
+
+        // Chargement des js associés au bo
+        if (goog.isDefAndNotNull($scope['oInsertObject']['oFormDefinition_js'])) {
+            var sUrl = $scope['oInsertObject']['oFormDefinition_js'];
+            oVmap.log("initHtmlForm : javascript assoc. to : " + sUrl);
+            loadExternalJs([sUrl], {
+                "callback": function () {
+                    try {
+                        if (goog.isDef(constructor_form)) {
+                            constructor_form(editFormReaderScope, sUrl);
+                        }
+                    } catch (e) {
+                        oVmap.log("constructor_form does not exist");
+                    }
+                },
+                "async": true,
+                "scriptInBody": true
+            });
+        }
+
+        // Set le formulaire
+        editFormReaderScope['ctrl']['loadForm']();
+    });
+};
+
+/**
+ * Simule a click on the submit button of the formReader to know if the form is html5 valid
+ * and run getBOValuesFromFormValue() to complete $scope['oInsertObject']['oResult']
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.validateForm = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.validateForm');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+
+    $scope.isFormValid_ = false;
+
+    setTimeout(function () {
+//        oVmap.simuleClick("basictools-insert-form-reader-submit-btn");
+        var oFormReaderScope = this_.getEditFormReaderScope();
+        oFormReaderScope['sendForm']();
+        setTimeout(function () {
+            if ($scope.isFormValid_) {
+                // Récupère les valeurs sous un format propice à l'insertion (sans "selectedOption")
+                if (goog.isDefAndNotNull($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']])) {
+                    var EWKTGeometry = angular.copy($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']]);
+                }
+                $scope['oInsertObject']['oResult'] = this_.getBOValuesFromFormValues($scope['oInsertObject']['oFormValues']);
+                if (!goog.isDefAndNotNull($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']])) {
+                    $scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']] = EWKTGeometry;
+                }
+                $('#basictools-insert-form-reader-modal').modal('hide');
+            }
+        });
+    });
+};
+
+/**
+ * Get the values from oFormValues
+ * @param {object} oFormValues
+ * @returns {object}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getBOValuesFromFormValues = function (oFormValues) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.getBOValuesFromFormValues');
+
+    var $scope = this.$scope_;
+    var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]);
+
+    var oFormValuesValues = goog.object.clone(oFormValues);
+
+    var oFormValuesValues = formSrvc['getFormData']('insert', true, {
+        'oFormDefinition': $scope['oInsertObject']['oFormDefinition'],
+        'oFormValues': oFormValuesValues,
+        'aParamsToSave': ['geom']
+    });
+
+    return oFormValuesValues;
+};
+
+/**
+ * Run validateForm() and if the form is correct run submitInsertion()
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.trySubmitInsertion = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.trySubmitInsertion');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+
+    $scope.isFormValid_ = false;
+
+    this.validateForm();
+    setTimeout(function () {
+        if ($scope.isFormValid_) {
+            this_.submitInsertion();
+        }
+    }, 500);
+};
+
+/**
+ * Return true if all the required params defined in oFormDefinition have been completed in oResult
+ * otherwise return an array with the non compleded required params or false in case of error
+ * @param {object} oResult
+ * @param {object} oFormDefinition
+ * @returns {Array|Boolean}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.isResultValid = function (oResult, oFormDefinition) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.isResultValid');
+
+    if (!goog.isDefAndNotNull(oResult)) {
+        console.error('oResult not defined');
+        return false;
+    }
+    if (!goog.isDefAndNotNull(oFormDefinition)) {
+        console.error('oFormDefinition not defined');
+        return false;
+    }
+
+    var aUnregistredFields = [];
+    var rows = oFormDefinition['insert']['rows'];
+
+    for (var i = 0; i < rows.length; i++) {
+        for (var ii = 0; ii < rows[i]['fields'].length; ii++) {
+            if (rows[i]['fields'][ii]['required'] === true) {
+                if (!goog.isDefAndNotNull(oResult[rows[i]['fields'][ii]['name']]) || oResult[rows[i]['fields'][ii]['name']] === "") {
+
+                    // Si le label est renseigné, communique le label, sinon le nom
+                    if (goog.isString(rows[i]['fields'][ii]['label']) && rows[i]['fields'][ii]['label'] !== "")
+                        aUnregistredFields.push(rows[i]['fields'][ii]['label'] + '(' + rows[i]['fields'][ii]['name'] + ')');
+                    else
+                        aUnregistredFields.push(rows[i]['fields'][ii]['name']);
+                }
+            }
+        }
+    }
+
+    if (aUnregistredFields.length === 0)
+        return true;
+    else
+        return aUnregistredFields;
+};
+
+/**
+ * Reload oInsertObject.oFormDefinition and oInsertObject.oFormValues
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateInsertForm = function (sBoId, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.updateInsertForm');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+    var $q = this.$q_;
+
+    var oFormReaderScope = this.getEditFormReaderScope();
+    var boId = goog.isDefAndNotNull(sBoId) ? sBoId : $scope['selectedBoId'];
+
+    if (!goog.isDefAndNotNull(boId)) {
+        return null;
+    }
+
+    // Vide les variables oInsertObject
+    $scope['oInsertObject']['oResult'] = {};
+    $scope['oInsertObject']['sGeomColumn'] = null;
+    $scope['oInsertObject']['sGeomType'] = null;
+    $scope['oInsertObject']['business_object_id'] = null;
+    $scope['oInsertObject']['oFormDefinition'] = {};
+    $scope['oInsertObject']['oFormValues']['insert'] = {};
+
+    // Vide les features ayant pu être dessinées
+    this.oOverlayFeatures_.clear();
+
+    // Rafraichit le formReader
+    if (goog.isDefAndNotNull(oFormReaderScope))
+        oFormReaderScope['ctrl']['refreshForm']();
+
+    var bRequestOk = false;
+    var canceler = $q.defer();
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/businessobjects/' + boId,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'abord': canceler.promise,
+        'success': function (response) {
+
+            bRequestOk = true;
+
+            if (!goog.isDef(response['data'])) {
+                bootbox.alert("response['data'] undefined");
+                $scope['selectedBoId'] = "";
+                return 0;
+            }
+            if (goog.isDef(response['data']['errorMessage'])) {
+                bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+                $scope['selectedBoId'] = "";
+                return 0;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                bootbox.alert('Aucune valeur retournée, impossible de charger le formulaire correspondant à la couche');
+                $scope['selectedBoId'] = "";
+                return 0;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'][0]['json_form'][0])) {
+                bootbox.alert('Impossible de charger le formulaire correspondant à la couche');
+                $scope['selectedBoId'] = "";
+                return 0;
+            }
+
+            // Modifie l'identifiant du formulaire
+            response['data']['data'][0]['json_form'][0]['insert']['name'] = 'basictools-insert-form-reader-form';
+
+            // Formulaire
+            $scope['oInsertObject']['oFormDefinition'] = response['data']['data'][0]['json_form'][0];
+            $scope['oInsertObject']['oFormDefinition_js'] = response['data']['data'][0]['json_form_js'];
+            $scope['oInsertObject']['add_form_size'] = response['data']['data'][0]['add_form_size'];
+
+            // sBusinessObjectID
+            $scope['oInsertObject']['sBusinessObjectID'] = boId;
+
+            // Champs comtenant la géométrie
+            if (goog.isDef(response['data']['data'][0]['geom_column']))
+                $scope['oInsertObject']['sGeomColumn'] = response['data']['data'][0]['geom_column'];
+            if (goog.isDef(response['data']['data'][0]['geom_type']))
+                $scope['oInsertObject']['sGeomType'] = response['data']['data'][0]['geom_type'];
+
+            if ($scope['oInsertObject']['sGeomType'] === 'GEOMETRYCOLLECTION') {
+                this_['addPartGeomType'] = '';
+            } else if ($scope['oInsertObject']['sGeomType'] === 'POLYGON' || $scope['oInsertObject']['sGeomType'] === 'MULTIPOLYGON') {
+                this_['addPartGeomType'] = 'Polygon';
+            } else if ($scope['oInsertObject']['sGeomType'] === 'LINESTRING' || $scope['oInsertObject']['sGeomType'] === 'MULTILINESTRING') {
+                this_['addPartGeomType'] = 'LineString';
+            } else if ($scope['oInsertObject']['sGeomType'] === 'POINT' || $scope['oInsertObject']['sGeomType'] === 'MULTIPOINT') {
+                this_['addPartGeomType'] = 'Point';
+            }
+
+            // Ajout du bouton caché submit
+            $scope['oInsertObject']['oFormDefinition']['insert']['rows'].push({
+                "fields": [{
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [{
+                                "visibleAllTabs": true,
+                                "type": "submit",
+                                "label": "Sauvegarder",
+                                "name": "form_submit",
+                                "class": "btn-primary hidden",
+                                "id": "basictools-insert-form-reader-submit-btn"
+                            }
+                        ]
+                    }
+                ]
+            });
+            $scope['oInsertObject']['oFormDefinition']['insert']['event'] = function () {
+                $scope.isFormValid_ = true;
+            };
+
+            // Rafraichit le formulaire
+            oFormReaderScope['ctrl']['refreshForm']();
+
+            if (goog.isDefAndNotNull(callback)) {
+                callback.call(this_);
+            }
+
+        },
+        'error': function (response) {
+            $scope['selectedBoId'] = "";
+            bootbox.alert(response);
+        }
+    });
+
+    // Montre le message d'annulation de la requete si celle-ci n'est pas terminée apres un timeout
+    var showCancelRequestMessageAfterTimeout = function () {
+        setTimeout(function () {
+            if (bRequestOk === false) {
+                bootbox.confirm('Annuler la requête ?', function (result) {
+                    if (result === true) {
+                        canceler.resolve();
+                        $scope['selectedBoId'] = "";
+                    } else {
+                        showCancelRequestMessageAfterTimeout();
+                    }
+                });
+            }
+        }, 5000);
+    };
+    showCancelRequestMessageAfterTimeout();
+};
+
+/**
+ * Get the Edit Form reader scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getEditFormReaderScope = function () {
+    return angular.element($('#basictools-insert-form-reader').children()).scope();
+};
+
+
+
+// Edition de la géométrie
+
+/**
+ * Set the drawTool
+ * @param {string} type (Point, Line, Rectangle, Polygon, Circle, Edit, Delete)
+ * @param {boolean} isActive true if the selection is already active
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startInsertion = function (type, isActive) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolControlle.startInsertion');
+
+    var this_ = this;
+
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    // Supprime le snapping
+    this.oSnapOverlayLayer_.getSource().clear();
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+
+    if (isActive === true)
+        return 0;
+
+    // inserPoint, insertPolygon, insertLine, insertCircle
+    if (type.substr(0, 6) === 'insert') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez pour commencer à dessiner');
+
+        // Ajoute l'interraction
+        this.startDrawing(type.substr(6));
+
+    } else if (type === 'editFeature') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour le modifier');
+
+        // Ajoute l'interraction
+        oVmap.getMap().setInteraction(this.modify_, 'basicTools-insert-' + type);
+
+    } else if (type === 'deleteFeature') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour le supprimer');
+
+        // Ajoute l'interraction
+        oVmap.getMap().setInteraction(this.delete_, 'basicTools-insert-' + type);
+
+    } else if (type === 'addHole') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Dessinez un polygone à l\'intérieur d\'un autre pour créer un trou');
+
+        // Ajoute l'interraction (reliée à aucune featureCollection)
+        this.draw_ = oVmap.getMap().setDrawInteraction({
+            type: 'Polygon'
+        }, 'basicTools-insert-' + type);
+
+        // Copie les features présentes avant le dessin
+        var aFeatures = goog.array.clone(this.oOverlayFeatures_.getArray());
+        var aFeaturesCopy = [];
+
+        for (var i = 0; i < aFeatures.length; i++) {
+            if (aFeatures[i].getGeometry().getType() === 'Polygon') {
+                aFeaturesCopy.push(aFeatures[i]);
+            } else if (aFeatures[i].getGeometry().getType() === 'MultiPolygon') {
+                var aPolygons = goog.array.clone(aFeatures[i].getGeometry().getPolygons());
+                for (var ii = 0; ii < aPolygons.length; ii++) {
+                    aFeaturesCopy.push(new ol.Feature({
+                        geometry: aPolygons[ii]
+                    }));
+                }
+            }
+        }
+        this.draw_.on('drawend',
+                function (evt) {
+                    // Récupère la feature ajoutée
+                    var feature = evt.feature;
+                    var linearRing = feature.getGeometry().getLinearRing(0);
+                    var bIsContained = false;
+                    for (var i = 0; i < aFeaturesCopy.length; i++) {
+                        // Si le trou est contenu dans une des features
+                        if (aFeaturesCopy[i].getGeometry().containsPolygon(feature.getGeometry())) {
+                            // Troue le polygone
+                            aFeaturesCopy[i].getGeometry().appendLinearRing(linearRing);
+                            bIsContained = true;
+                        }
+                    }
+
+                    if (!bIsContained) {
+                        bootbox.alert('Trou non valide: il doit être contenu dans un polygone dessiné');
+                    } else {
+                        this.oOverlayLayer_.getSource().clear();
+                        this.oOverlayLayer_.getSource().addFeatures(aFeaturesCopy);
+                    }
+
+                }, this);
+
+    } else if (type === 'deleteHole') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage("Cliquez dans un trou pour le supprimer");
+
+        // Ajoute les trous dans la couche oOverlayHolesLayer_
+        this.addHolesIntoHolesLayer();
+
+        // Ajoute l'interraction de suppresion des trous
+        oVmap.getMap().setInteraction(this.deleteHole_, 'basicTools-insert-' + type);
+
+    } else {
+        console.error('startSelection: type (' + type + ') not allowed');
+        return 0;
+    }
+};
+
+/**
+ * This function add the holes contained into oOverlayLayer_ to oOverlayHolesLayer_
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.addHolesIntoHolesLayer = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.addHolesIntoHolesLayer');
+
+    var aFeatures = this.oOverlayFeatures_.getArray();
+
+    this.oOverlayHolesLayer_.getSource().clear();
+
+    for (var i = 0; i < aFeatures.length; i++) {
+        var aLinearRings = aFeatures[i].getGeometry().getLinearRings();
+        if (aLinearRings.length > 1) {
+
+            for (var ii = 1; ii < aLinearRings.length; ii++) {
+
+                var newPolygon = new ol.geom.Polygon();
+                newPolygon.setCoordinates([aLinearRings[ii].getCoordinates()]);
+
+                this.oOverlayHolesLayer_.getSource().addFeature(new ol.Feature({
+                    geometry: newPolygon
+                }));
+            }
+        }
+    }
+};
+
+/**
+ * Delete the selected hole
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.deleteHole = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.deleteHole');
+
+    var this_ = this;
+
+    /**
+     * Holes selected by deleteHole_
+     * @type array
+     */
+    var aSelectedHoles = this.deleteHole_.getFeatures().getArray();
+
+    if (aSelectedHoles.length > 0) {
+        for (var i = 0; i < aSelectedHoles.length; i++) {
+
+            /**
+             * Selected hole
+             * @type ol.geom.polygon
+             */
+            var hole = aSelectedHoles[i].getGeometry();
+
+            var bHoleFounded = false;
+
+            // Compare pour chaque polygone si il a un trou ayant les mêmes coordonnées que hole
+            var aFeatures = this.oOverlayFeatures_.getArray();
+            for (var ii = 0; ii < aFeatures.length; ii++) {
+                var aHolesCoords = aFeatures[ii].getGeometry().getCoordinates();
+                for (var iii = aHolesCoords.length - 1; iii >= 0; iii--) {
+                    if (angular.equals(hole.getCoordinates()[0], aHolesCoords[iii])) {
+                        aHolesCoords.splice(iii, 1);
+                        bHoleFounded = true;
+                    }
+                }
+                aFeatures[ii].getGeometry().setCoordinates(aHolesCoords);
+            }
+            if (bHoleFounded)
+                this.oOverlayHolesLayer_.getSource().removeFeature(aSelectedHoles[i]);
+        }
+
+        this.deleteHole_.getFeatures().clear();
+    }
+};
+
+/**
+ * Start the drawing experience
+ * @param {ol.geom} type geometry type
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startDrawing = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.startDrawing');
+
+    // Lance setDrawInteraction avec this.oOverlayFeatures_ comme cible pour les features
+    this.draw_ = oVmap.getMap().setDrawInteraction({
+        type: type,
+        features: this.oOverlayFeatures_
+    }, 'basicTools-insert-insert' + type);
+
+    var this_ = this;
+    this.draw_.on('drawend',
+            function (evt) {
+                // Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés
+                var feature = evt.feature;
+                feature = this_.updateCircleGeoms(feature);
+            }, this);
+
+
+    // Empèche la saisie si l'échelle n'est pas bonne
+    this.draw_.on('drawstart', function () {
+
+        if (!this_['isMaxScaleOk']) {
+            this_.draw_.removeLastPoint();
+        }
+        if (!this_['isMinScaleOk']) {
+            this_.draw_.removeLastPoint();
+        }
+
+        var iNbPoints = 0;
+        this_.draw_.sketchFeature_.on('change', function (event) {
+            if (goog.isDefAndNotNull(event.target)) {
+                if (goog.isDefAndNotNull(event.target.getGeometry)) {
+                    var oGeom = event.target.getGeometry();
+                    if (goog.isDefAndNotNull(oGeom.getType)) {
+                        switch (oGeom.getType()) {
+                            case 'LineString':
+                            case 'MultiLineString':
+                            case 'Point':
+                            case 'MultiPoint':
+                            case 'Polygon':
+                            case 'MultiPolygon':
+                                if (oGeom.getCoordinates().length > iNbPoints) {
+                                    if (!this_['isMaxScaleOk']) {
+                                        this_.draw_.removeLastPoint();
+                                    }
+                                    if (!this_['isMinScaleOk']) {
+                                        this_.draw_.removeLastPoint();
+                                    }
+                                }
+                                iNbPoints = oGeom.getCoordinates().length;
+                                break;
+                            default:
+
+                                break;
+                        }
+                    }
+                }
+            }
+        });
+    });
+
+    // Lance le snapping et vérifie l'échelle de saisie
+    setTimeout(function () {
+        this_.checkEditionScale();
+        this_.loadVectorSnappingData();
+    });
+};
+
+/**
+ * Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés
+ * @param {ol.Feature} feature
+ * @returns {ol.Feature}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateCircleGeoms = function (feature) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.updateCircleGeoms');
+
+    if (feature.getGeometry() instanceof ol.geom.Circle) {
+        var circleGeom = feature.getGeometry();
+        var polygonGeom = new ol.geom.Polygon.fromCircle(circleGeom);
+        feature.setGeometry(polygonGeom);
+    }
+
+    return feature;
+};
+
+/**
+ * Update feature for scope.oInsertObject
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateInsertObjectFeature = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.updateInsertObjectFeature');
+
+    var $scope = this.$scope_;
+    var aOverlayFeatures = goog.array.clone(this.oOverlayFeatures_.getArray());
+    var sGeomType = $scope['oInsertObject']['sGeomType'];
+
+    // Transforme les cercles en polygones de 32 côtés
+    for (var i = 0; i < aOverlayFeatures.length; i++) {
+        if (aOverlayFeatures[i].getGeometry() instanceof ol.geom.Circle) {
+            var circleGeom = aOverlayFeatures[i].getGeometry();
+            var polygonGeom = new ol.geom.Polygon.fromCircle(circleGeom);
+            aOverlayFeatures[i] = new ol.Feature({
+                geometry: polygonGeom
+            });
+        }
+    }
+
+    // Transforme la feature en WKT
+    var WKT = new ol.format.WKT();
+    var WKTGeometry = "";
+
+    if (aOverlayFeatures.length > 0) {
+
+        if (sGeomType === 'MULTIPOINT') {
+
+            var oMultiPoint = new ol.geom.MultiPoint();
+            for (var i = 0; i < aOverlayFeatures.length; i++) {
+                if (aOverlayFeatures[i].getGeometry().getType() === 'Point')
+                    oMultiPoint.appendPoint(aOverlayFeatures[i].getGeometry());
+            }
+            var Feature = new ol.Feature({
+                geometry: oMultiPoint
+            });
+
+        } else if (sGeomType === 'MULTILINESTRING') {
+
+            var oMultiLineString = new ol.geom.MultiLineString();
+            for (var i = 0; i < aOverlayFeatures.length; i++) {
+                if (aOverlayFeatures[i].getGeometry().getType() === 'LineString')
+                    oMultiLineString.appendLineString(aOverlayFeatures[i].getGeometry());
+            }
+            var Feature = new ol.Feature({
+                geometry: oMultiLineString
+            });
+
+        } else if (sGeomType === 'MULTIPOLYGON') {
+
+            var oMultiPolygon = new ol.geom.MultiPolygon();
+            for (var i = 0; i < aOverlayFeatures.length; i++) {
+                if (aOverlayFeatures[i].getGeometry().getType() === 'Polygon')
+                    oMultiPolygon.appendPolygon(aOverlayFeatures[i].getGeometry());
+            }
+            var Feature = new ol.Feature({
+                geometry: oMultiPolygon
+            });
+
+        } else {
+            var Feature = aOverlayFeatures[0];
+        }
+
+        WKTGeometry = WKT.writeFeature(Feature, {
+            dataProjection: this['map'].getView().getProjection().getCode(),
+            featureProjection: this['map'].getView().getProjection().getCode()
+        });
+    }
+
+    if (WKTGeometry === "") {
+        console.error("WKTGeometry is empty");
+        return 0;
+    }
+
+    // Transforme la feature en EWKT
+    var EWKTGeometry = oVmap.getEWKTFromWKT(WKTGeometry, this['map'].getView().getProjection().getCode());
+
+    // Écrit la géométrie WKT
+    $scope['oInsertObject']['oFormValues']['insert'][$scope['oInsertObject']['sGeomColumn']] = EWKTGeometry;
+    $scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']] = EWKTGeometry;
+};
+
+
+
+
+// Submit
+
+/**
+ * Test if all the required params were completed and send the insert http request
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.submitInsertion = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.submitInsertion');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+
+    var oResult = $scope['oInsertObject']['oResult'];
+    var oFormDefinition = $scope['oInsertObject']['oFormDefinition'];
+    var sBusinessObjectID = $scope['oInsertObject']['sBusinessObjectID'];
+
+    var isResultValid = this.isResultValid(oResult, oFormDefinition);
+
+    if (isResultValid === true) {
+
+        this.sendInsertRequest(oResult, sBusinessObjectID);
+
+    } else {
+
+        if (goog.isArray(isResultValid)) {
+            var alertMessage = "Votre requête n'a pas pu aboutir, les attributs suivants sont obligatoires: <br>";
+            for (var i = 0; i < isResultValid.length; i++) {
+                alertMessage = (i === 0 ? alertMessage : alertMessage + ', ');
+                alertMessage += isResultValid[i];
+            }
+        } else {
+            var alertMessage = "Votre requête n'a pas pu aboutir, certains attributs obligatoires n'ont pas étés renseignés";
+        }
+
+        bootbox['dialog']({
+            'message': alertMessage,
+            'buttons': {
+                'cancel': {
+                    'label': "Annuler",
+                    'className': "btn-default"
+                },
+                'editAttr': {
+                    'label': "Éditer les attributs",
+                    'className': "btn-primary",
+                    'callback': function () {
+                        this_.displayEditFrom();
+                    }
+                }
+            }
+        });
+    }
+
+};
+
+/**
+ * Sent the insert http request
+ * @param {object} oResult
+ * @param {string} sBusinessObjectID
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.sendInsertRequest = function (oResult, sBusinessObjectID) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.sendInsertRequest');
+
+    if (!goog.isDefAndNotNull(oResult)) {
+        console.error('oResult not defined');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(sBusinessObjectID)) {
+        console.error('sBusinessObjectID not defined');
+        return 0;
+    }
+
+    var this_ = this;
+    var data = this.getFormDataFromValues(oResult);
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/vmap/querys/' + sBusinessObjectID,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': data,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDef(response['data'])) {
+                bootbox.alert("response['data'] undefined");
+                return 0;
+            }
+            if (response['status'] !== 200) {
+                if (response['status'] === 500) {
+                    $.notify("Erreur interne du serveur", "error");
+                } else {
+                    if (goog.isDefAndNotNull(response['statusText'])) {
+                        $.notify(response['statusText'], "error");
+                    } else {
+                        $.notify("Erreur " + response['status'], "error");
+                    }
+                }
+                return 0;
+            }
+            if (goog.isDef(response['data']['errorMessage'])) {
+                bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+                return 0;
+            }
+
+            if (response['data']['status'] === 1) {
+                $.notify("Opération réalisée avec succès, les couches de la carte se mettent à jour", "info");
+                // Recharge le formulaire
+                this_.updateInsertForm();
+                // Recharge la carte
+                this_.reloadImpactedLayer(sBusinessObjectID);
+                // Enlève l'outil en cours (insertion)
+                oVmap.getToolsManager().getBasicTools().toggleOutTools();
+                oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+            }
+        }
+    });
+};
+
+/**
+ * Creates a FormData object from oValues
+ * @param {object} oValues
+ * @returns {FormData}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getFormDataFromValues = function (oValues) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getFormDataFromValues');
+
+    var oFormData_ = new FormData();
+
+    for (var key in oValues) {
+        // Fichier ?
+        if (goog.isDefAndNotNull(oValues[key])) {
+            if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
+                oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
+                oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
+            } else {
+                oFormData_.append(key, oValues[key]);
+            }
+        }
+    }
+
+    return oFormData_;
+};
+
+
+
+
+// Mobile
+
+/**
+ * Start the mobile insertion procedure
+ * @param {string} sBoId
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.mobileStartInsertion = function (sBoId) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.mobileStartInsertion');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+
+    this.updateInsertForm(sBoId, function () {
+
+        // Récupère le type de géométrie à inserrer: affiche une modale en cas de multiple types
+        this_.getMobileBoGeomType_($scope['oInsertObject']).then(function (sGeomType) {
+
+            // Commence la saisie géométrique
+            oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+            oVmap.getMap().startMobileDraw(sGeomType, function (olFeature) {
+
+                // En cas de feature multiples (multipolygon, multilinestring etc...)
+                if (goog.isArray(olFeature)) {
+                    for (var i = 0; i < olFeature.length; i++) {
+                        olFeature[i] = this_.updateCircleGeoms(olFeature[i]);
+                    }
+                    this_.oOverlayLayer_.getSource().addFeatures(olFeature);
+                } else {
+                    olFeature = this_.updateCircleGeoms(olFeature);
+                    this_.oOverlayLayer_.getSource().addFeature(olFeature);
+                }
+
+                setTimeout(function () {
+                    // Affiche l'outil d'insertion (car la modale est dedans)
+                    oVmap.getToolsManager().getBasicTools().displayAdvancedMobileMenu();
+                    $('#vmap_menu_mobile_menu_insert').removeClass('collapse');
+
+                    // Affiche le formulaire dans la modale
+                    this_.displayEditFrom();
+                });
+            });
+        });
+
+    });
+};
+
+/**
+ * Retourne le type de géométrie à inserrer en demandant à l'utilisateur en cas de multiples types supportés
+ * @param {object} oInsertObject
+ * @returns {defer.promise}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getMobileBoGeomType_ = function (oInsertObject) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.getMobileBoGeomType_');
+
+    var deferred = this.$q_.defer();
+    var sGeomType = angular.copy(oInsertObject['sGeomType']);
+
+    if (sGeomType === 'GEOMETRY' || sGeomType === 'GEOMETRYCOLLECTION') {
+        bootbox.prompt({
+            title: "Type de géométrie à insérer",
+            inputType: 'select',
+            inputOptions: [
+                {
+                    text: 'Point',
+                    value: 'POINT'
+                },
+                {
+                    text: 'Ligne',
+                    value: 'LINESTRING'
+                },
+                {
+                    text: 'Polygone',
+                    value: 'POLYGON'
+                },
+                {
+                    text: 'Cercle',
+                    value: 'CIRCLE'
+                }
+            ],
+            callback: function (result) {
+                deferred.resolve(result);
+            }
+        });
+    } else {
+        setTimeout(function () {
+            deferred.resolve(sGeomType);
+        });
+    }
+
+    return deferred.promise;
+};
+
+
+
+// Snapping
+
+/**
+ * Show the snapping options modal
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.showSnappingOptionsModal = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.showSnappingOptionsModal');
+
+    this['tmpSnapOptions'] = angular.copy(this['snapOptions']);
+    $('#vmap-insert-snap-options-modal').modal('show');
+};
+
+/**
+ * Validate and hide the snapping options modal
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.submitSnappingOptionsModal = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.submitSnappingOptionsModal');
+
+    this['snapOptions'] = angular.copy(this['tmpSnapOptions']);
+
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+    this.snap_ = new ol.interaction.Snap({
+        vertex: true,
+        edge: (this['snapOptions']['mode'] === 'segment_edge_node' ? true : false),
+        pixelTolerance: this['snapOptions']['tolerance'],
+        source: this.oSnapOverlayLayer_.getSource()
+    });
+    oVmap.getMap().getOLMap().addInteraction(this.snap_);
+
+    $('#vmap-insert-snap-options-modal').modal('hide');
+
+    this.checkEditionScale();
+    this.loadVectorSnappingData();
+};
+
+/**
+ * Reset snapping option to default values
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.resetSnapOptions = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.resetSnapOptions');
+
+    if (goog.isDefAndNotNull(oVmap['properties']['snapping'])) {
+        this['tmpSnapOptions']['tolerance'] = oVmap['properties']['snapping']['defaut_tolerance'];
+        this['tmpSnapOptions']['mode'] = oVmap['properties']['snapping']['defaut_snapp_mode'];
+        this['tmpSnapOptions']['limit'] = oVmap['properties']['snapping']['defaut_limit'];
+        this['tmpSnapOptions']['visible'] = oVmap['properties']['snapping']['defaut_visibility'];
+    }
+    this.submitSnappingOptionsModal();
+};
+
+/**
+ * Selector function to only reload object when needed
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadVectorSnappingData = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadVectorSnappingData');
+
+    var this_ = this;
+    var oBo = null;
+    this_.oSnapOverlayLayer_.setVisible(this_['snapOptions']['visible']);
+    this_.oSnapOverlayLayer_.getSource().clear();
+    this_.checkEditionScale();
+    oVmap.getMap().getOLMap().removeInteraction(this_.snap_);
+
+    setTimeout(function () {
+        if (goog.isDefAndNotNull(this_['currentAction'])) {
+            if (this_['currentAction'].substr(0, 18) === 'basicTools-insert-') {
+                if (this_['isMaxScaleOk'] && this_['isMinScaleOk']) {
+
+                    for (var i = 0; i < this_.$scope_['aQueryableBOs'].length; i++) {
+                        oBo = this_.$scope_['aQueryableBOs'][i];
+                        this_.stopLoadingBoVectorSnappingData(oBo);
+                        this_.loadBoVectorSnappingData(oBo);
+                    }
+                    for (var i = 0; i < oBo.length; i++) {
+                        if (oBo[i]['bo_snapping_loaded'] === null) {
+                            oBo[i]['bo_snapping_enabled'] = false;
+                        }
+                    }
+                    oVmap.getMap().getOLMap().addInteraction(this_.snap_);
+                }
+            }
+        }
+    });
+};
+
+/**
+ * Retrieve the object given in parameter with ajaxRequest
+ * @param {type} oBo
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVectorSnappingData = function (oBo) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVectorSnappingData');
+
+    var this_ = this;
+    var bo_id = oBo['bo_id'];
+    var aFeatures = [];
+    var geom = null;
+    var extent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize());
+    var polygonGeom = new ol.geom.Polygon.fromExtent(extent);
+    if (oBo['bo_snapping_enabled'] === true) {
+        oBo['bo_snapping_loaded'] = false;
+        ajaxRequest({
+            'method': 'POST',
+            'url': oVmap['properties']['api_url'] + '/vmap/querys/' + bo_id + '/geometry',
+            'headers': {
+                'X-HTTP-Method-Override': 'GET',
+                'Accept': 'application/x-vm-json'
+            },
+            'data': {
+                'intersect_geom': oVmap.getEWKTFromGeom(polygonGeom),
+                'snapping_limit': this_['snapOptions']['snappingObjectsLimit'],
+                'snapping_mode': this_['snapOptions']['mode']
+            },
+            'ajaxLoader': false,
+            'abord': oBo['loadCanceller'].promise,
+            'scope': this.$scope_,
+            'success': function (response) {
+                if (!goog.isDefAndNotNull(response['data'])) {
+                    oBo['bo_snapping_loaded'] = null;
+                    return 0;
+                }
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    console.error(response['data']['errorMessage']);
+                    oBo['bo_snapping_loaded'] = null;
+                    return 0;
+                }
+                if (response['data'][0]['count'] > this_['snapOptions']['snappingObjectsLimit']) {
+                    oBo['bo_snapping_loaded'] = null;
+                    var text = 'Limit de points atteinte pour object ';
+                    text += oBo['bo_title'];
+                    $.notify(text, "warn");
+                    return 0;
+                }
+                oBo['bo_snapping_loaded'] = true;
+                for (var i = 0; i < response['data'].length; i++) {
+                    if (goog.isDefAndNotNull(response['data'][i]['geom'])) {
+                        geom = response['data'][i]['geom'];
+                        aFeatures.push(new ol.Feature({
+                            geometry: oVmap.getGeomFromEWKT(geom)
+                        }));
+                    }
+                }
+                this_.oSnapOverlayLayer_.getSource().addFeatures(aFeatures);
+            },
+            'error': function (response) {
+                oBo['bo_snapping_loaded'] = null;
+            }
+        });
+    }
+};
+
+/**
+ * Cancel request with a resolve callback
+ * @param {type} oBo
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.stopLoadingBoVectorSnappingData = function (oBo) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.stopLoadingBoVectorSnappingData');
+    var this_ = this;
+    if (goog.isDefAndNotNull(oBo['loadCanceller'])) {
+        oBo['loadCanceller'].resolve();
+        oBo['loadCanceller'] = this_.$q_.defer();
+        oBo['bo_snapping_loaded'] = null;
+    }
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appInsert', nsVmap.nsToolsManager.Insert.prototype.inserttoolDirective);
+oVmap.module.controller('AppInsertController', nsVmap.nsToolsManager.Insert.prototype.inserttoolController);
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
new file mode 100644
index 0000000000000000000000000000000000000000..4cd96440554191c47a0415289ddde0cb77eb6065
--- /dev/null
+++ b/module/javascript/app/vmap/tools/location.js
@@ -0,0 +1,894 @@
+/* global oVmap, goog, nsVmap, ol, bootbox */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Location
+ * cette classe permet l'initialisation des outils de locatlisation
+ */
+goog.provide('nsVmap.nsToolsManager.Location');
+
+goog.require('oVmap');
+
+goog.require('ol.Geolocation');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Location}: Add the location tools defined in data/tools.json
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Location = function () {
+    oVmap.log('nsVmap.nsToolsManager.Location');
+};
+
+/**
+ * App-specific directive wrapping the location tools. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Location.prototype.locationDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'ApplocationController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'location_mobile.html' : 'location.html')
+    };
+};
+
+/**
+ * @ngInject
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController = function ($scope, $q, $timeout) {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController");
+
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$timeout_ = $timeout;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * Dummy canceler (use canceler.resolve() for cancel the ajax request)
+     * @private
+     */
+    this.canceler_ = $q.defer();
+
+    /**
+     * The current map
+     * @type{ol.Map}
+     * @private
+     */
+    this.map_ = this['map'];
+
+    /**
+     * Home position
+     * @type {object}
+     * @private
+     */
+    this.homePosition_ = {
+        center: this.map_.getView().getCenter(),
+        zoom: this.map_.getView().getZoom()
+    };
+
+    /**
+     * @type pbject
+     */
+    this['projections'] = oVmap['oProjections'];
+
+    /**
+     * @type {array}
+     */
+    this['locationResults'] = [];
+
+    /**
+     * @type {string}
+     */
+    this['locationSearch'] = "";
+
+    /**
+     * @type {boolean}
+     */
+    this['searching'] = false;
+
+    /**
+     * @type {string}
+     */
+    this['noResults'] = "";
+
+    /**
+     * @type {string}
+     */
+    this['sSelectedLocationService'] = null;
+
+    /**
+     * @type {array}
+     */
+    this['oBusinessObjects'] = [];
+
+    /**
+     * @type {array}
+     */
+    this['aLocationHistory'] = [{
+		center: this_.map_.getView().getCenter(),
+		zoom: this_.map_.getView().getZoom()
+	}];
+    /**
+     * @type {integer}
+     */
+    this['iHistoryOffset'] = 0;
+    /**
+     * @type {integer}
+     */
+    this['iHistoryOffset_save'] = 0;
+
+
+    /**
+     * @tyle {number}
+     */
+    this['scale'] = Math.round(oVmap.getMap().getScale());
+
+    $scope['goToX'] = '';
+    $scope['goToY'] = '';
+    $scope['goToProj'] = 'EPSG:4326';
+
+    // Récupère les properties de locatisation de l'API
+    this.setBusinessObjectsList();
+
+    // Effectue une recherche lors du changement de ctrl.locationSearch
+    $scope.$watch('ctrl.locationSearch', function () {
+        $scope['ctrl'].searchLocation(this.last);
+    }, true);
+
+    /**
+     * Get the size of an object
+     * @param {type} obj
+     * @returns {Number|Object.keys.ret.length}
+     */
+    $scope['sizeOf'] = function (obj) {
+        return Object.keys(obj).length;
+    };
+
+    // Recharge la liste des services de recherche quand les couches changent
+    oVmap['scope'].$on('layersChanged', function () {
+        this_.$scope_.$applyAsync(function () {
+            // Vide la recherche en cours
+            this_['locationSearch'] = "";
+            // Récupère les properties de locatisation de l'API
+            this_.setBusinessObjectsList();
+            // Définit le service de recherche par défaut
+            setTimeout(function () {
+                this_.$scope_.$applyAsync(function () {
+                    this_['sSelectedLocationService'] = this_.getDefaultlocationService_();
+                });
+            });
+        });
+    });
+
+    // remplissage de l'historique des étendues
+    var fHistoryDelayHandler;
+    this_.map_.on("moveend", function(event){
+    	if(this_['iHistoryOffset'] === this_['iHistoryOffset_save']){
+    		//check wait
+	        if (goog.isDefAndNotNull(fHistoryDelayHandler)){
+	            $timeout.cancel(fHistoryDelayHandler);
+	        }
+
+	        fHistoryDelayHandler = $timeout(function () {
+	        	if(this_['iHistoryOffset'] === 0){
+	        		this_["aLocationHistory"].push({
+		        		center: this_.map_.getView().getCenter(),
+		        		zoom: this_.map_.getView().getZoom()
+		    		});
+	        	} else {
+	        		// splice 
+	        		var iHistoryPosition = this_['aLocationHistory'].length - (this_['iHistoryOffset']);
+	        		this_["aLocationHistory"].splice(iHistoryPosition, this_['iHistoryOffset'], {
+		        		center: this_.map_.getView().getCenter(),
+		        		zoom: this_.map_.getView().getZoom()
+		    		});
+
+		    		this_['iHistoryOffset'] = 0;
+	        	}
+	        }, oVmap['properties']['vmap_history_timer']);
+    	} else {
+    		this_['iHistoryOffset_save'] = this_['iHistoryOffset'];
+    	}
+    });
+
+    // Vide les localisations quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+    	// purge de l'historique des étendues
+    	this_['aLocationHistory'] = [{
+			center: this_.map_.getView().getCenter(),
+			zoom: this_.map_.getView().getZoom()
+		}];
+        if (goog.isDef(this_.locationPopup)) {
+            this_.locationPopup.remove();
+        }
+    });
+
+    $scope['locationServiceType'] = 'geocoder';
+
+    this['locationServices'] = JSON.parse(oVmap['properties']['vmap_geocoders']);
+
+    setTimeout(function () {
+        $scope.$applyAsync(function () {
+            $scope['ctrl']['sSelectedLocationService'] = this_.getDefaultlocationService_();
+        });
+    });
+};
+
+/**
+ * Get the default location service
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.getDefaultlocationService_ = function () {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.getDefaultlocationService_');
+
+    var aBusinessObjects = [];
+    for (var key in this['oBusinessObjects']) {
+        aBusinessObjects.push(this['oBusinessObjects'][key]);
+    }
+
+    if (oVmap['properties']['vmap_default_geocoders'] === 'business_object' && aBusinessObjects.length > 0) {
+        var firstBoIndex = 0;
+        if (!goog.isDefAndNotNull(aBusinessObjects[firstBoIndex]['bo_index'])) {
+            aBusinessObjects[firstBoIndex]['bo_index'] = 1000000;
+        }
+        if (aBusinessObjects.length > 1) {
+            for (var i = 1; i < aBusinessObjects.length; i++) {
+                if (goog.isDefAndNotNull(aBusinessObjects[i]['bo_index']) && goog.isDefAndNotNull(aBusinessObjects[i]['bo_search_field']) && goog.isDefAndNotNull(aBusinessObjects[i]['bo_result_field'])) {
+                    if (aBusinessObjects[i]['bo_index'] < aBusinessObjects[firstBoIndex]['bo_index']) {
+                        firstBoIndex = angular.copy(i);
+                    }
+                }
+            }
+        }
+        if (!(goog.isDefAndNotNull(aBusinessObjects[firstBoIndex]['bo_search_field']) && goog.isDefAndNotNull(aBusinessObjects[firstBoIndex]['bo_result_field']))) {
+            return 'osm';
+        } else {
+            return aBusinessObjects[firstBoIndex]['bo_id'];
+        }
+    } else if (goog.isDefAndNotNull(this['locationServices'][oVmap['properties']['vmap_default_geocoders']])) {
+        return oVmap['properties']['vmap_default_geocoders'];
+    } else {
+        return 'osm';
+    }
+};
+
+/**
+ * Refresh the map layers (witch are refreshables) without caches
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.refreshMap = function () {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.refreshMap');
+    var _this = this;
+    // Création du fichier ".map" du flux wms privée.
+    var oFormData = new FormData();
+    oFormData.append("wmsservice_id", oVmap['properties']['private_wms_service']);
+    oFormData.append("type", "prod");
+    ajaxRequest({
+        "method": "POST",
+        "url": oVmap['properties']["web_server_name"] + "/" + oVmap['properties']["services_alias"] + "/vm4ms/WmsServices/MapFile",
+        "data": oFormData,
+        "success": function (response) {
+            _this['map'].refreshWithTimestamp();
+        },
+        "error": function (response) {
+            _this['map'].refreshWithTimestamp();
+        }
+    });
+};
+
+/**
+ * Add a scale to the scale control
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.addScale = function () {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.addScale');
+
+    var newScale = $('#new-scale-input').val();
+
+    var parseScale = function (scale) {
+        var j = 1;
+        for (var i = scale.length - 1; i > 0; i--) {
+            if (j % 3 === 0)
+                scale = scale.slice(0, i) + ',' + scale.slice(i + Math.abs(0));
+            j++;
+        }
+        return '1:' + scale;
+    };
+
+    $('#scale-list').append('<li><a class="pointer" onclick="oVmap.getMap().setScale(' + newScale + ')">' + parseScale(newScale) + '</a></li>');
+
+
+    $('#scale-modal').modal('hide');
+};
+
+/**
+ * Set the oBusinessObjects value
+ * @returns {String} error
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.setBusinessObjectsList = function () {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.setBusinessObjectsList');
+
+    this['oBusinessObjects'] = oVmap.getMapManager().getQueryableBusinessObjects();
+};
+
+/**
+ * Localise the map on the home position
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.maxExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.maxExtent");
+
+    var view = this['map'].getView();
+    var extent = view.getProjection().getExtent();
+    view.fit(extent);
+};
+
+/**
+ * Localise the map on the home position
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goHome = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.goHome");
+
+    var currentView = oVmap.getMap().getOLMap().getView();
+    var originalPosition = currentView.get('homePosition');
+
+    currentView.setCenter(originalPosition.center);
+    currentView.setResolution(originalPosition.resolution);
+};
+
+
+/**
+ * Go on the previous extent
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.nextHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.nextHistoryExtent");
+
+    if(this['iHistoryOffset'] > 0){
+    	this['iHistoryOffset'] -= 1;
+    	this.selectHistoryExtent();
+    }
+};
+
+/**
+ * Go on the next extent
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.previousHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.previousHistoryExtent");
+
+    if(this['iHistoryOffset'] < this['aLocationHistory'].length - 1){
+    	this['iHistoryOffset'] += 1;
+    	this.selectHistoryExtent();
+    }
+};
+
+/**
+ * Go on the selected extent in history
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.selectHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.selectHistoryExtent");
+
+    var currentView = oVmap.getMap().getOLMap().getView();
+
+    var iHistoryPosition = this['aLocationHistory'].length - ( 1 + this['iHistoryOffset']);
+
+    currentView.setCenter(this['aLocationHistory'][iHistoryPosition].center);
+    currentView.setZoom(this['aLocationHistory'][iHistoryPosition].zoom);
+};
+
+/**
+ * Localise the map on the entry position
+ * @param {string} CoordX html id to the X value
+ * @param {string} CoordY html id to the Y value
+ * @param {string} projectionId html id to the projection value
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goTo = function (CoordX, CoordY, projection) {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.goTo");
+
+    var coordinates = [parseFloat(CoordX), parseFloat(CoordY)];
+    var currentProjeciton = oVmap.getMap().getOLMap().getView().getProjection();
+    var projectedCoordinates = ol.proj.transform(coordinates, projection, currentProjeciton);
+
+    // Affcihe un point sur les coordonnées
+    var point = new ol.Feature(new ol.geom.Point(projectedCoordinates));
+
+    if (isNaN(projectedCoordinates[0]) || isNaN(projectedCoordinates[1])) {
+        bootbox.alert('<h4>Ces coordonnées ne sont pas disponibles dans la projection saisie</h4>');
+        return 0;
+    }
+
+    var message = 'X: ' + coordinates[0];
+    message += '<br>Y: ' + coordinates[1];
+    message += '<br><i>' + oVmap['oProjections'][projection] + '</i>';
+
+    this.locateFeature(point, message);
+
+    // Centre sur les coordonnées
+    this['map'].getView().setCenter(projectedCoordinates);
+};
+
+/**
+ * Localise the map on the geolocation position
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.geolocateMe = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.geolocateMe");
+
+    var this_ = this;
+    if (oVmap['properties']['is_mobile']) {
+        oVmap.getMap().centerGPSPosition();
+    } else {
+        var aGPSPosition = oVmap.getMap().getGPSPosition(oVmap.getMap().getOLMap().getView().getProjection());
+        if (goog.isDefAndNotNull(aGPSPosition)) {
+            // Affcihe un point sur les coordonnées
+            var point = new ol.Feature(new ol.geom.Point(aGPSPosition));
+            this_.locateFeature(point, 'Vous êtes ici');
+        }
+    }
+};
+
+/**
+ * Search a location
+ * @param {string} location
+ * @param {integer} limit
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.searchLocation = function (location, limit) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.searchLocation');
+
+    location = goog.isDef(location) ? location : this['locationSearch'];
+    limit = goog.isDef(limit) ? limit : 4;
+
+    var getFieldValue = function (sField, oObject) {
+        var recursiveGetObjectValue = function (aFields, oObject) {
+            if (aFields.length === 1) {
+                if (goog.isDefAndNotNull(oObject[aFields[0]])) {
+                    return oObject[aFields[0]];
+                } else {
+                    return null;
+                }
+            } else if (aFields.length > 1) {
+                if (goog.isDefAndNotNull(oObject[aFields[0]])) {
+                    oObject = oObject[aFields[0]];
+                    aFields.splice(0, 1);
+                    return recursiveGetObjectValue(aFields, oObject);
+                } else {
+                    return null;
+                }
+            } else {
+                return null;
+            }
+        };
+        return recursiveGetObjectValue(sField.split('.'), oObject);
+    };
+
+    if (location.length === 0)
+        return 0;
+
+    // Annule les requêtes ayant pour timeout canceler_.promise
+    this.canceler_.resolve();
+    // Réinitialise canceler_
+    this.canceler_ = this.$q_.defer();
+
+    oVmap.getToolsManager().getBasicTools().toggleOutTools();
+
+    // Affiche la fenêtre
+    if (location !== "")
+        oVmap.getToolsManager().getBasicTools().showTool('#location-search-form');
+
+    this['searching'] = true;
+    this['noResults'] = '';
+
+    var url = null;
+    var oParams = {};
+
+    // Géocodeur paramétré
+    if (goog.isDefAndNotNull(this['locationServices'][this['sSelectedLocationService']])) {
+
+        this.$scope_['locationServiceType'] = 'geocoder';
+        var oLocationService = this['locationServices'][this['sSelectedLocationService']];
+
+        if (goog.isDefAndNotNull(oLocationService['url'])) {
+            url = oLocationService['url'].replace('[limit]', limit).replace('[search]', location);
+        }
+    }
+    // Objet métier
+    else if (goog.isDefAndNotNull(this['oBusinessObjects'][this['sSelectedLocationService']])) {
+
+        this.$scope_['locationServiceType'] = 'business_object';
+        var service = this['sSelectedLocationService'];
+        var bo_id = this['oBusinessObjects'][service]['bo_id'];
+        var bo_search_field = this['oBusinessObjects'][service]['bo_search_field'];
+        var bo_search_use_strict = this['oBusinessObjects'][service]['bo_search_use_strict'];
+        var filter = '';
+
+        if (bo_search_use_strict === 'true' || bo_search_use_strict === true) {
+            filter = {
+                "column": bo_search_field,
+                "compare_operator": "=",
+                "value": bo_search_use_strict
+            };
+        } else if (bo_search_use_strict === 'left') {
+            filter = {
+                "column": bo_search_field,
+                "compare_operator": "LIKE",
+                "compare_operator_options": {
+                    "case_insensitive": true
+                },
+                "value": location + '%'
+            };
+        } else if (bo_search_use_strict === 'right') {
+            filter = {
+                "column": bo_search_field,
+                "compare_operator": "LIKE",
+                "compare_operator_options": {
+                    "case_insensitive": true
+                },
+                "value": '%' + location
+            };
+        } else {
+            filter = {
+                "column": bo_search_field,
+                "compare_operator": "LIKE",
+                "compare_operator_options": {
+                    "case_insensitive": true
+                },
+                "value": '%' + location + '%'
+            };
+        }
+
+        url = oVmap['properties']['api_url'] + '/vmap/querys/' + bo_id + '/summary';
+        oParams = {
+            'filter': filter,
+            'limit': limit
+        };
+    }
+
+    if (goog.isDefAndNotNull(url)) {
+        var this_ = this;
+        ajaxRequest({
+            'method': 'GET',
+            'url': url,
+            'headers': {
+                'Accept': 'application/x-vm-json'
+            },
+            'params': oParams,
+            'scope': this.$scope_,
+            'timeout': 5000,
+            'abord': this.canceler_.promise,
+            'success': function (response) {
+                // Cache le gif de chargement
+                this_['searching'] = false;
+                this_['locationResults'] = [];
+                this_['noResults'] = '';
+
+                // Vérifie si il y a des données à afficher
+                if (!goog.isDef(response['data']) || goog.isNull(response['data'])) {
+                    this_['noResults'] = 'Aucun résultat';
+                    console.error('Pas de données à afficher');
+                    return 0;
+                }
+
+                // Vérifie si il y a une erreur
+                if (goog.isDef(response['data']['error'])) {
+                    if (goog.isDef(response['data']['error']['errorMessage'])) {
+                        console.error(response['data']['error']['errorMessage']);
+                        this_['noResults'] = response['data'].error.errorMessage;
+                        return response['data']['error'];
+                    }
+                }
+
+                // Objet métier
+                if (goog.isDefAndNotNull(this_['oBusinessObjects'][this_['sSelectedLocationService']])) {
+                    if (goog.isDefAndNotNull(response['data'])) {
+                        if (goog.isDefAndNotNull(response['data']['data'])) {
+                            this_['locationResults'] = response['data']['data'];
+                        }
+                    }
+                }
+
+                // Géocodeur
+                if (goog.isDefAndNotNull(this_['locationServices'][this_['sSelectedLocationService']])) {
+
+                    var oLocationService = this_['locationServices'][this_['sSelectedLocationService']];
+                    var aResponse = getFieldValue(oLocationService['data_field'], response);
+
+                    for (var i = 0; i < aResponse.length; i++) {
+                        var oResult = {};
+                        oResult['title'] = getFieldValue(oLocationService['title_field'], aResponse[i]);
+                        if (goog.isDefAndNotNull(oLocationService['description_field'])) {
+                            oResult['description'] = getFieldValue(oLocationService['description_field'], aResponse[i]);
+                        }
+                        if (goog.isDefAndNotNull(oLocationService['geojson_field'])) {
+                            oResult['geojson'] = getFieldValue(oLocationService['geojson_field'], aResponse[i]);
+                        }
+                        if (goog.isArray(oLocationService['summary_fields'])) {
+                            oResult['summary'] = [];
+                            for (var ii = 0; ii < oLocationService['summary_fields'].length; ii++) {
+                                oResult['summary'].push({
+                                    'label': oLocationService['summary_fields'][ii]['label'],
+                                    'value': getFieldValue(oLocationService['summary_fields'][ii]['key'], aResponse[i])
+                                });
+                            }
+                        }
+                        this_['locationResults'].push(oResult);
+                    }
+                }
+
+                if (!goog.isDef(this_['locationResults']))
+                    return 0;
+
+                // Si aucun résultat n'est disponible
+                if (this_['locationResults'].length === 0) {
+                    this_['noResults'] = 'Aucun résultat';
+                    return 0;
+                }
+            },
+            'error': function () {
+                // Cache le gif de chargement
+                this_['searching'] = false;
+                this_['locationResults'] = [];
+                this_['noResults'] = '';
+                this_['noResults'] = 'Requête en erreur';
+            }
+        });
+    }
+};
+
+/**
+ * Zoom on a place
+ * @param {object} place
+ * @param {object} place.lon longitude
+ * @param {object} place.lat latitude
+ * @param {object} place.geojson geometry
+ * @returns {Number|String} error
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locatePlace = function (place) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locatePlace');
+
+    if (!goog.isDef(place))
+        return 'place not defined';
+
+    if (oVmap['properties']['is_mobile']) {
+        oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    }
+
+    var geojson = place['geojson'];
+    var currentProjeciton = this['map'].getView().getProjection();
+
+    // Centre par rapport aux params lon/lat (au cas où la géométrie soit mal renseingée)
+    if (goog.isDef(place['lon']) && goog.isDef(place['lat'])) {
+
+        var projectedCoordinates = ol.proj.transform([parseFloat(place['lon']), parseFloat(place['lat'])], 'EPSG:4326', currentProjeciton);
+        this['map'].getView().setCenter(projectedCoordinates);
+    }
+
+    // Affiche la géométrie et centre dessus
+    if (!goog.isDef(geojson))
+        return 0;
+
+    this.locateGeom(geojson, 'EPSG:4326', place['title']);
+};
+
+/**
+ * Add to the selection list of nsVmap.nsToolsManager.Select
+ * @param {object} selection object attributes
+ * @param {string} selection.geom GeoJSON geometry
+ * @param {object} service
+ * @param {string} service.idField Unique id field
+ * @param {string} service.title Title of the entity
+ * @param {string} service.bo_type Business object type
+ * @param {string} service.geom_field Name of the geometry column
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.addToSelection = function (selection, service) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.addSelection');
+
+    if (oVmap['properties']['is_mobile']) {
+        oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    }
+
+    var this_ = this;
+    var url = oVmap['properties']['api_url'] + '/vmap/querys/' + selection['bo_type'] + '/summary';
+//    var filter = '"' + selection['bo_id_field'].replace(/\./g, '"."') + '"=\'' + selection['bo_id_value'] + '\'';
+    var proj = this['map'].getView().getProjection().getCode().substring(5);
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': url,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'filter': {
+                "column": selection['bo_id_field'].replace(/\./g, '"."'),
+                "compare_operator": "=",
+                "value": selection['bo_id_value']
+            },
+            'get_geom': true,
+            'result_srid': proj,
+            'get_image': true,
+            'limit': 200
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // Vérifie si il y a une erreur
+            if (goog.isDef(response['data']['error'])) {
+                if (goog.isDef(response['data']['error']['errorMessage'])) {
+                    console.error(response['data']['error']['errorMessage']);
+                }
+            }
+
+            // Vérifie si il y a des données à afficher
+            if (!goog.isDef(response['data']['data'])) {
+                console.error('Pas de données à afficher');
+            } else {
+                var data = response['data']['data'];
+            }
+
+            // Au cas ou le résultat soit vide
+            if (data.length === 0)
+                return 0;
+
+            var selection = data[0];
+
+            // Cas ou il n'y ait pas de géométrie
+            if (!goog.isDefAndNotNull(selection['bo_intersect_geom'])) {
+                $.notify('Géométrie non disponible');
+                return 0;
+            }
+
+            this_.centerGeom(selection['bo_intersect_geom']);
+
+            var selectScope = angular.element($('#vmap-basicselect-tool')).scope();
+            selectScope.$evalAsync(function () {
+                var this_ = selectScope['ctrl'];
+                var newSelection = goog.array.clone(this_['aSelections']);
+                goog.array.extend(this_.aLastSelections, newSelection);
+                this_.removeSelections();
+                this_.addQueryResult({
+                    data: [selection],
+                    dataType: 'summary',
+                    callback: function () {
+                        this_.closeSelectionPopup(this_.aLastSelections, true);
+                        this_.displaySelectionPopup(this_['aSelections']);
+                    }
+                });
+            });
+        }
+    });
+};
+
+/**
+ * Center the map on the geom center
+ * @param {string} EWKTGeom EWKT geometry
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.centerGeom = function (EWKTGeom) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.centerGeom');
+
+    var geom = oVmap.getGeomFromEWKT(EWKTGeom);
+    var resolution = this['map'].getView().getResolution();
+
+    // Zoom sur la feature
+    if (geom.getType() === 'Point') {
+        this['map'].getView().setCenter(geom.getCoordinates());
+        this['map'].getView().setResolution(resolution);
+    } else if (geom.getType() === 'MultiPoint') {
+        this['map'].getView().fit(geom.getExtent());
+        this['map'].getView().setResolution(resolution);
+    } else {
+        this['map'].getView().fit(geom.getExtent());
+    }
+};
+
+/**
+ * Locate a geom
+ * @param {string|object} geojson geoJSON geometry
+ * @param {string} proj geom projection (ex: EPSG:2154)
+ * @param {string} message message to display on the popup
+ * @returns {String}
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locateGeom = function (geojson, proj, message) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locateGeom');
+
+    if (!goog.isDef(geojson))
+        return 'geom not defined';
+
+    if (typeof geojson === 'string')
+        geojson = JSON.parse(geojson);
+
+    var currentProjeciton = this['map'].getView().getProjection();
+
+    // Affiche la nouvelle feature
+    var GeoJSON = new ol.format.GeoJSON({
+        defaultDataProjection: currentProjeciton
+    });
+    var geom = GeoJSON.readGeometry(geojson, {
+        dataProjection: proj,
+        featureProjection: currentProjeciton
+    });
+    var feature = new ol.Feature({
+        geometry: geom
+    });
+
+    this.locateFeature(feature, message);
+
+};
+
+/**
+ * Locate a feature and display a popup
+ * @param {olFeature} feature
+ * @param {string|undefined|null} message
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locateFeature = function (feature, message) {
+    oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.locateFeature');
+
+    var extent = feature.getGeometry().getExtent();
+    var resolution = this['map'].getView().getResolution();
+
+    // Zoom sur la feature
+    if (feature.getGeometry().getType() === 'Point') {
+        this['map'].getView().setCenter(feature.getGeometry().getCoordinates());
+    } else if (feature.getGeometry().getType() === 'MultiPoint') {
+        this['map'].getView().fit(extent);
+        this['map'].getView().setZoom(resolution);
+    } else {
+        this['map'].getView().fit(extent);
+    }
+
+    if (goog.isDef(this.locationPopup)) {
+        this.locationPopup.remove();
+    }
+
+    if (goog.isDefAndNotNull(message)) {
+        this.locationPopup = new nsVmap.Map.MapPopup(feature);
+        this.locationPopup.displayMessage(message);
+    }
+};
+
+/**
+ * Remove the location and hide the panel
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.removeLocation = function () {
+    oVmap.getToolsManager().getBasicTools().hideTool('#location-search-form');
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appLocation', nsVmap.nsToolsManager.Location.prototype.locationDirective);
+oVmap.module.controller('ApplocationController', nsVmap.nsToolsManager.Location.prototype.locationController);
diff --git a/module/javascript/app/vmap/tools/measure.js b/module/javascript/app/vmap/tools/measure.js
new file mode 100755
index 0000000000000000000000000000000000000000..ba56969063fd78c335aa9cc27883aca7701e9072
--- /dev/null
+++ b/module/javascript/app/vmap/tools/measure.js
@@ -0,0 +1,1131 @@
+/* global oVmap, ol, nsVmap, goog */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Measure
+ * cette classe permet l'initialisation des outils de measure
+ */
+goog.provide('nsVmap.nsToolsManager.Measure');
+
+goog.require('oVmap');
+
+goog.require('ol.interaction.Draw');
+goog.require('ol.style.Style');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Circle');
+goog.require('ol.Sphere');
+goog.require('ol.source.Vector');
+goog.require('ol.layer.Vector');
+goog.require('ol.Collection');
+goog.require('ol.interaction.Modify');
+goog.require('ol.interaction.Select');
+goog.require('ol.Overlay');
+goog.require('ol.interaction.Draw');
+goog.require('ol.geom.LineString');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Measure}: Add the measure tools defined in data/tools.json
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Measure = function () {
+    oVmap.log('nsVmap.nsToolsManager.Measure');
+};
+goog.exportProperty(nsVmap.nsToolsManager, 'Measure', nsVmap.nsToolsManager.Measure);
+
+/**
+ * App-specific directive wrapping the measure tools. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppmeasureController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'measure_mobile.html' : 'measure.html')
+    };
+};
+
+/**
+ * @ngInject
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController");
+
+    var this_ = this;
+
+    /**
+     * @type {ol.Sphere}
+     * @private
+     */
+    this.wgs84Sphere_ = new ol.Sphere(6378137);
+
+    /**
+     * @type {ol.map}
+     * @private
+     */
+    this.map_ = oVmap.getMap().getOLMap();
+
+    /**
+     * @type {ol.style.Style}
+     */
+    var style = new ol.style.Style({
+        fill: new ol.style.Fill({
+            color: 'rgba(255, 255, 255, 0.2)'
+        }),
+        stroke: new ol.style.Stroke({
+            color: '#ffcc33',
+            width: 2
+        }),
+        image: new ol.style.Circle({
+            radius: 7,
+            fill: new ol.style.Fill({
+                color: '#ffcc33'
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#FFFFFF'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersMeasureOverlay_ = oVmap.getMap().addVectorLayer({style: style});
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersMeasureOverlayFeatures_ = this.oOpenLayersMeasureOverlay_.getSource().getFeaturesCollection();
+
+    /**
+     * Currently drawn feature.
+     * @type {ol.Feature}
+     * @private
+     */
+    this.sketch_;
+
+    /**
+     * The measure measure-tooltip element.
+     * @type {Element}
+     * @private
+     */
+    this.measureTooltipElement_;
+
+    /**
+     * The measure measure-tooltip element that is hided on changing action.
+     * @type {Element}
+     * @private
+     */
+    this.measureTooltipElementTemp_;
+
+    /**
+     * Overlay to show the measurement.
+     * @type {ol.Overlay}
+     * @private
+     */
+    this.measureTooltip_;
+
+    /**
+     * Overlay to show the measurement that is hided on changing action..
+     * @type {ol.Overlay}
+     * @private
+     */
+    this.measureTooltipTemp_;
+
+    /**
+     * Map tooltip
+     * @type {object}
+     * @private
+     */
+    this.helpTooltip_ = new nsVmap.Map.MapTooltip({id: 'measure-tooltip'});
+
+    /**
+     * Message to show when the user is drawing a polygon.
+     * @type {string}
+     * @private
+     */
+    this.continuePolygonMsg_ = 'Doublecliquer pour terminer le polygone';
+
+    /**
+     * Message to show when the user is drawing a line.
+     * @type {string}
+     * @private
+     */
+    this.continueLineMsg_ = 'Doublecliquer pour terminer la ligne';
+
+    /**
+     * Message to show when the user is drawing a circle.
+     * @type {string}
+     * @private
+     */
+    this.continueCircleMsg_ = 'Cliquer pour terminer le cercle';
+
+    /**
+     * Message to show when the user is drawing a point.
+     * @type {string}
+     * @private
+     */
+    this.continuePointMsg_ = 'Cliquer pour terminer le point';
+
+    /**
+     * @type {ol.interaction.Draw}
+     * @private
+     */
+    this.draw_;
+
+    /**
+     * @type {ol.interaction.Modify}
+     * @private
+     */
+    this.modify_ = new ol.interaction.Modify({
+        features: this.oOpenLayersMeasureOverlayFeatures_
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.selectHover_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersMeasureOverlay_],
+        condition: ol.events.condition.pointerMove
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.delete_ = new ol.interaction.Select({
+        layers: [this.oOpenLayersMeasureOverlay_]
+    });
+
+    /**
+     * Current projection
+     * @private
+     */
+    this['projection'] = this['map'].getView().getProjection().getCode();
+
+    /**
+     * List of the avaliable projections with their names
+     * @private
+     */
+    this['oProjections'] = oVmap['oProjections'];
+
+    this['transform'] = ol.proj.transform;
+
+    this['map'].on('change:view', function () {
+        this_['projection'] = this_['map'].getView().getProjection().getCode();
+    });
+
+    this.delete_.on('select', function () {
+        var aSelectedFeatures = this.delete_.getFeatures().getArray();
+        var aOverlays = [];
+        var aMeasuresToDelete = [];
+
+        // Supprime les features du featureOverlay et leurs annotations
+        for (var i = aSelectedFeatures.length - 1; i >= 0; i--) {
+            // remove the overlays measures
+            aOverlays = oVmap.getMap().getOLMap().getOverlays().getArray();
+            aMeasuresToDelete = [];
+            for (var ii = aOverlays.length - 1; ii >= 0; ii--) {
+                if (aOverlays[ii].get('feature') === aSelectedFeatures[i] || aOverlays[ii].get('feature') === 'info') {
+                    aMeasuresToDelete.push(aOverlays[ii]);
+                }
+            }
+
+            for (var ii = aMeasuresToDelete.length - 1; ii >= 0; ii--) {
+                oVmap.getMap().getOLMap().getOverlays().remove(aMeasuresToDelete[ii]);
+            }
+
+            this.oOpenLayersMeasureOverlayFeatures_.remove(aSelectedFeatures[i]);
+        }
+
+        // Supprime les features de la selection
+        this.delete_.getFeatures().clear();
+        // Supprime les features de la selectionHover
+        this.selectHover_.getFeatures().clear();
+        // enlève l'outil de suppression
+//		this.removeMeasuresInteractions();
+    }, this);
+
+    this.geodesicCheckbox_ = document.getElementById('geodesic');
+};
+
+/**
+ * Creates a new measure measure-tooltip
+ * @param {ol.Feature} oFeature Feature to create the tooltip
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.createMeasureTooltip = function (oFeature) {
+    if (this.measureTooltipElement_) {
+        this.measureTooltipElement_.parentNode.removeChild(this.measureTooltipElement_);
+    }
+    this.measureTooltipElement_ = document.createElement('div');
+    this.measureTooltipElement_.className = 'measure-tooltip measure-tooltip-measure';
+    this.measureTooltip_ = new ol.Overlay({
+        element: this.measureTooltipElement_,
+        offset: [0, -15],
+        positioning: 'bottom-center'
+    });
+    this.measureTooltip_.set('type', 'measure');
+
+    if (oFeature !== undefined)
+        this.measureTooltip_.set('feature', oFeature);
+
+//    oVmap.getMap().addOverlay(this.measureTooltip_);
+    this.map_.addOverlay(this.measureTooltip_);
+};
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.createMeasureTooltip2 = function (oFeature) {
+    if (this.measureTooltipElementTemp_) {
+        this.measureTooltipElementTemp_.parentNode.removeChild(this.measureTooltipElementTemp_);
+    }
+    this.measureTooltipElementTemp_ = document.createElement('div');
+    this.measureTooltipElementTemp_.className = 'measure-tooltip measure-tooltip-measure';
+    this.measureTooltipTemp_ = new ol.Overlay({
+        element: this.measureTooltipElementTemp_,
+        offset: [0, -15],
+        positioning: 'bottom-center'
+    });
+    this.measureTooltipTemp_.set('type', 'measure');
+
+    if (oFeature !== undefined)
+        this.measureTooltipTemp_.set('feature', oFeature);
+
+    oVmap.getMap().addOverlay(this.measureTooltipTemp_);
+//    this.map_.addOverlay(this.measureTooltip_);
+};
+
+/**
+ * Add an OpenLayers interaction on the map
+ * @param {string} type Intreaction type
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.addInteraction = function (type) {
+    oVmap.log('addInteraction');
+
+    var this_ = this;
+
+    this.draw_ = oVmap.getMap().setDrawInteraction({type: type, features: this.oOpenLayersMeasureOverlayFeatures_}, 'basicTools-measure' + type);
+
+    this.createMeasureTooltip('info');
+
+    this.draw_.on('drawstart', function (evt) {
+        this.createMeasureTooltip2(evt.feature);
+        // set this.sketch_
+        this.sketch_ = evt.feature;
+
+        /** @type {ol.Coordinate|undefined} */
+        var tooltipCoord = evt.coordinate;
+
+
+        this_.listener = this.sketch_.getGeometry().on('change', function (evt) {
+
+            var geom = evt.target;
+            var output;
+
+            if (geom instanceof ol.geom.Polygon) {
+                output = this_.formatArea(geom);
+                tooltipCoord = geom.getInteriorPoint().getCoordinates();
+            } else if (geom instanceof ol.geom.LineString) {
+                output = this_.formatLength(geom);
+                tooltipCoord = geom.getLastCoordinate();
+            } else if (geom instanceof ol.geom.Circle) {
+                output = this_.formatRadius(geom);
+                tooltipCoord = geom.getLastCoordinate();
+            }
+
+            this_.measureTooltipElementTemp_.innerHTML = output;
+            this_.measureTooltipTemp_.setPosition(tooltipCoord);
+        });
+
+    }, this);
+    this.draw_.on('drawend',
+            function (evt) {
+
+                // Affiche la mesure avec la tooltip etc..
+                this.createMeasure(evt.feature);
+
+                // Fonctions appelées après modification de la feature
+                evt.feature.on('change', function () {
+                    this.updateTooltip(evt.feature);
+                }, this);
+
+                ol.Observable.unByKey(this_.listener);
+
+            }, this);
+};
+
+/**
+ * Create the tooltip etc..
+ * @param {type} olFeature
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.createMeasure = function (olFeature) {
+    oVmap.log('nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.createMeasure');
+
+    this.createMeasureTooltip(olFeature);
+    this.setInfosToFeature(olFeature);
+
+    if (goog.isDefAndNotNull(this.measureTooltipElementTemp_)) {
+        
+        this.measureTooltipElement_.innerHTML = this.measureTooltipElementTemp_.innerHTML;
+        this.measureTooltipElementTemp_.style.display = 'none';
+        
+    } else {
+        this.measureTooltipElement_.innerHTML = '';
+
+        var output;
+        var geom = olFeature.getGeom;
+
+        if (geom instanceof ol.geom.Polygon) {
+            output = this.formatArea(geom);
+            tooltipCoord = geom.getInteriorPoint().getCoordinates();
+        } else if (geom instanceof ol.geom.LineString) {
+            output = this.formatLength(geom);
+            tooltipCoord = geom.getLastCoordinate();
+        } else if (geom instanceof ol.geom.Circle) {
+            output = this.formatRadius(geom);
+            tooltipCoord = geom.getLastCoordinate();
+        }
+    }
+
+    this.measureTooltipElement_.className = 'measure-tooltip measure-tooltip-static';
+    this.measureTooltip_.setOffset([0.8, -13]);
+    this.measureTooltip_.setPosition(this.getTooltipPosition(olFeature.getGeometry()));
+    // unset this.sketch_
+    this.sketch_ = null;
+    // unset measure-tooltip so that a new one can be created
+    this.measureTooltipElement_ = null;
+    this.showHideAnotations();
+    this.updateTooltip(olFeature);
+
+    if (this.measureTooltipElement_) {
+        this.measureTooltipElement_.className = 'measure-tooltip measure-tooltip-static';
+        this.measureTooltipElement_.remove();
+        this.measureTooltip_.setOffset([0, -7]);
+        // unset this.sketch_
+        this.sketch_ = null;
+        // unset measure-tooltip so that a new one can be created
+        this.measureTooltipElement_ = null;
+    }
+};
+
+/**
+ * Update the tooltip of a feature
+ * @param {ol.Feature} olFeature
+ * @param {boolean|undefined} bReloadInos true if you want to reload the feature infos. Default is true
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.updateTooltip = function (olFeature, bReloadInos) {
+    oVmap.log('nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.updateTooltip');
+
+    var reload = goog.isDef(bReloadInos) ? bReloadInos : true;
+
+    // Met à jour les infos de la feature
+    if (reload)
+        this.setInfosToFeature(olFeature);
+
+    // Met à jour l'étiquette
+    var aOverlays = oVmap.getMap().getOLMap().getOverlays();
+    for (var i = aOverlays.getArray().length - 1; i >= 0; i--) {
+        if (aOverlays.getArray()[i].get('feature') === olFeature) {
+            aOverlays.getArray()[i].setPosition(this.getTooltipPosition(olFeature.getGeometry()));
+            if (olFeature.get('Type') === 'Ligne') {
+                aOverlays.getArray()[i].getElement().innerHTML = olFeature.get('Longueur');
+            } else if (olFeature.get('Type') === 'Polygone') {
+                aOverlays.getArray()[i].getElement().innerHTML = olFeature.get('Superficie');
+            } else if (olFeature.get('Type') === 'Cercle') {
+                aOverlays.getArray()[i].getElement().innerHTML = "Périmètre: " + olFeature.get('Perimètre');
+            } else if (olFeature.get('Type') === 'Point') {
+
+                var coords = ol.proj.transform(olFeature.get('Coordonnées'), this['projection'], olFeature.get('Projection'));
+                var option;
+                var htmlSelect = document.createElement('select');
+
+                for (var code in this['oProjections']) {
+                    option = document.createElement('option');
+                    option.value = code;
+                    option.innerHTML = oVmap['oProjections'][code];
+                    htmlSelect.appendChild(option);
+                }
+
+                htmlSelect.value = olFeature.get('Projection');
+
+                var htmlInfos = document.createElement('div');
+                htmlInfos.innerHTML = 'X = ' + parseFloat(coords[0]).toPrecision(9);
+                htmlInfos.innerHTML += '<br>';
+                htmlInfos.innerHTML += 'Y = ' + parseFloat(coords[1]).toPrecision(9);
+
+                var this_ = this;
+                htmlSelect.onchange = function () {
+                    var newProjection = this.value;
+                    olFeature.set('Projection', newProjection);
+                    this_.updateTooltip(olFeature, false);
+                };
+
+                $(aOverlays.getArray()[i].getElement()).empty();
+                aOverlays.getArray()[i].getElement().appendChild(htmlSelect);
+                aOverlays.getArray()[i].getElement().appendChild(htmlInfos);
+
+            }
+        }
+    }
+};
+
+/**
+ * Put the infos in to the feature
+ * @param {ol.Feature} olFeature Feature to put the infos in
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.setInfosToFeature = function (olFeature) {
+
+    if (olFeature.getGeometry() instanceof ol.geom.Point) {
+        // Type
+        olFeature.set('Type', 'Point');
+        // Coordonnées
+        olFeature.set('Coordonnées', this.formatCoordinate(olFeature.getGeometry()));
+        // Projection
+        olFeature.set('Projection', this['map'].getView().getProjection().getCode());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.LineString) {
+        // Type
+        olFeature.set('Type', 'Ligne');
+        // Longueur
+        olFeature.set('Longueur', this.formatLength(olFeature.getGeometry()));
+        // Projection
+        olFeature.set('Projection', this['map'].getView().getProjection().getCode());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.Polygon) {
+        // Type
+        olFeature.set('Type', 'Polygone');
+        // Perimetre
+        olFeature.set('Perimètre', this.formatPerimeter(olFeature.getGeometry()));
+        // Superficie
+        olFeature.set('Superficie', this.formatArea(olFeature.getGeometry()));
+        // Projection
+        olFeature.set('Projection', this['map'].getView().getProjection().getCode());
+
+    } else if (olFeature.getGeometry() instanceof ol.geom.Circle) {
+
+        var radius = parseFloat(this.formatRadius(olFeature.getGeometry()));
+        var unit = this.formatRadius(olFeature.getGeometry()).replace(radius, '');
+        var diameter = radius * 2;
+        var perimeter = Math.PI * radius * 2;
+        var area = Math.PI * Math.pow(radius, 2);
+        // Type
+        olFeature.set('Type', 'Cercle');
+        // Rayon
+        olFeature.set('Rayon', radius + unit);
+        // Diamètre
+        olFeature.set('Diamètre', diameter.toFixed(4) + unit);
+        // Perimetre
+        olFeature.set('Perimètre', perimeter.toFixed(4) + unit);
+        // Superficie
+        olFeature.set('Superficie', area.toFixed(4) + unit + "²");
+        // Centre
+        olFeature.set('Centre', [olFeature.getGeometry().getCenter()[0].toFixed(4), olFeature.getGeometry().getCenter()[1].toFixed(4)]);
+        // Projection
+        olFeature.set('Projection', this['map'].getView().getProjection().getCode());
+
+    } else {
+        // Type
+        olFeature.set('Type', 'undefined');
+    }
+
+    // Id
+    var id = this.oOpenLayersMeasureOverlayFeatures_.getLength() - 1;
+    olFeature.set('Id', id);
+
+    // Keys
+    olFeature.set('Keys', olFeature.getKeys());
+};
+
+/**
+ * Set the tooltip position
+ * @param {ol.geom.Geometry} geom The feature to place the tooltip in
+ * return {ol.Coordinate} The coordinates where place the tooltip
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.getTooltipPosition = function (geom) {
+
+    if (geom.getType() === 'Polygon') {
+
+        var position = geom.getInteriorPoint().getLastCoordinate();
+
+    } else if (geom.getType() === 'LineString') {
+
+        var position = geom.getLastCoordinate();
+
+    } else if (geom.getType() === 'Circle') {
+
+        var position = geom.getCenter();
+
+    } else if (geom.getType() === 'Point') {
+
+        var position = geom.getLastCoordinate();
+
+    } else {
+        return geom.getLastCoordinate();
+    }
+
+    return position;
+};
+
+/**
+ * format length output
+ * @param {ol.geom.LineString} line
+ * @return {string}
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.formatLength = function (line) {
+    var length;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() === 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() === 'EPSG:4326') {
+        var coordinates = line.getCoordinates();
+        length = this.calcDistance(coordinates);
+    } else {
+        length = line.getLength();
+    }
+    var output;
+    if (length > 1000) {
+        output = (Math.round(length / 1000 * 100) / 100) +
+                ' ' + 'km';
+    } else {
+        output = (Math.round(length * 100) / 100) +
+                ' ' + 'm';
+    }
+    return output;
+};
+
+/**
+ * Calculate the distance between points with the haversine method
+ * @param {array<ol.Coordinate>} coordinates Coordinates
+ * @return {number} Distance between the two points
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.calcDistance = function (coordinates) {
+    length = 0;
+    var sourceProj = this.map_.getView().getProjection();
+    for (var i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+        var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
+        var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
+        length += this.wgs84Sphere_.haversineDistance(c1, c2);
+    }
+
+    return length;
+};
+
+/**
+ * format length output
+ * @param {ol.geom.Point} point
+ * @param {string} proj projection code
+ * @return {string}
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.formatCoordinate = function (point) {
+    var output = [point.getCoordinates()[0].toPrecision(9), point.getCoordinates()[1].toPrecision(9)];
+    return output;
+};
+
+/**
+ * format radius output
+ * @param {ol.geom.Circle} circle
+ * @return {string}
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.formatRadius = function (circle) {
+    var radius;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() === 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() === 'EPSG:4326') {
+        var coordinates = [circle.getFirstCoordinate(), circle.getLastCoordinate()];
+        radius = this.calcDistance(coordinates);
+    } else {
+        radius = Math.round(circle.getRadius() * 100) / 100;
+    }
+    var output;
+    if (radius > 1000) {
+        output = (Math.round(radius / 1000 * 100) / 100) +
+                ' ' + 'km';
+    } else {
+        output = (Math.round(radius * 100) / 100) +
+                ' ' + 'm';
+    }
+    return output;
+};
+
+/**
+ * format perimeter output
+ * @param {ol.geom.Polygon} polygon
+ * @return {string}
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.formatPerimeter = function (polygon) {
+
+    var lineString = new ol.geom.LineString(
+            polygon.getCoordinates()[0],
+            polygon.getLayout()
+            );
+
+    return this.formatLength(lineString);
+};
+
+/**
+ * format area output
+ * @param {ol.geom.Polygon} polygon
+ * @return {string}
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.formatArea = function (polygon) {
+    var area;
+    if (this.geodesicCheckbox_.checked
+            && (this.map_.getView().getProjection().getCode() === 'EPSG:3857')
+            || this.map_.getView().getProjection().getCode() === 'EPSG:4326') {
+        var sourceProj = this.map_.getView().getProjection();
+        var geom = /** @type {ol.geom.Polygon} */(polygon.clone().transform(
+                sourceProj, 'EPSG:4326'));
+        var coordinates = geom.getLinearRing(0).getCoordinates();
+        area = Math.abs(this.wgs84Sphere_.geodesicArea(coordinates));
+    } else {
+        area = polygon.getArea();
+    }
+    var output;
+    if (area > 1000000) {
+        output = (Math.round(area / 1000000 * 100) / 100) +
+                ' ' + 'km²';
+    } else {
+        output = (Math.round(area * 100) / 100) +
+                ' ' + 'm²';
+    }
+    return output;
+};
+
+/**
+ * zoom to the selected feature
+ * @param{ol.Feature}
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.zoomToFeature = function (feature) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.zoomToFeature");
+
+    if (feature.get('Type') === 'Point') {
+        this.map_.getView().setCenter(feature.getGeometry().getCoordinates());
+    } else if (feature.get('Type') === 'Cercle') {
+        this.map_.getView().fit(
+                feature.getGeometry(),
+                {padding: [0, 0, 0, 0]}
+        );
+        this.map_.getView().setCenter(feature.getGeometry().getCenter());
+    } else {
+        this.map_.getView().fit(
+                feature.getGeometry(),
+                {padding: [0, 0, 0, 0]}
+        );
+    }
+};
+
+/**
+ * show/hide anotations
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.showHideAnotations = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.showHideAnotations");
+
+    if (document.getElementById('measure-anotations').checked)
+        $('.measure-tooltip-static').show();
+    else
+        $('.measure-tooltip-static').hide();
+};
+
+/**
+ * Start draw point interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.drawPoint = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.drawPoint");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer pour mesurer l\'emplacement d\'un point');
+        this.addInteraction('Point');
+    }
+};
+
+/**
+ * Start measure line interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.measureLine = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.measureLine");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer pour commencer à mesurer');
+        this.addInteraction('LineString');
+    }
+};
+
+/**
+ * Start measure polygon interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.measurePolygon = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.measurePolygon");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer pour commencer à mesurer');
+        this.addInteraction('Polygon');
+    }
+};
+
+/**
+ * Start measure circle interaction
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.measureCircle = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.measureCircle");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer pour commencer à mesurer');
+        this.addInteraction('Circle');
+    }
+};
+
+/**
+ * modify the selected measure feature
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.modifyFeature = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.modifyFeature");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur une mesure pour la modifier');
+        oVmap.getMap().setInteraction(this.modify_, 'basicTools-modifyMeasure');
+    }
+};
+
+/**
+ * remove the selected measure feature
+ * @param {boolean} isActive true if the action is already active
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.deleteFeature = function (isActive) {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.deleteFeature");
+
+    this.removeMeasuresInteractions();
+
+    if (!isActive) {
+//        oVmap.getMap().setInteraction(this.selectHover_, 'basicTools-deleteMeasure');
+//        oVmap.getMap().addInteraction(this.delete_, 'basicTools-deleteMeasure');
+//        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur une mesure pour la supprimer');
+
+        oVmap.getMap().setInteraction(this.delete_, 'basicTools-deleteMeasure');
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquer sur une mesure pour la supprimer');
+    }
+};
+
+/**
+ * remove all the measure features
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.deleteAllFeatures = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.deleteAllFeatures");
+    // remove the draw/measure tool
+    this.removeMeasuresInteractions();
+    // remove the features
+    this.oOpenLayersMeasureOverlayFeatures_.clear();
+    // remove the overlays measures
+    var aOverlays = oVmap.getMap().getOLMap().getOverlays().getArray();
+    var aMeasureOverlays = [];
+    for (var i = aOverlays.length - 1; i >= 0; i--) {
+        if (aOverlays[i].get('type') === 'measure')
+            aMeasureOverlays.push(aOverlays[i]);
+    }
+    for (var i = aMeasureOverlays.length - 1; i >= 0; i--) {
+        oVmap.getMap().getOLMap().getOverlays().remove(aMeasureOverlays[i]);
+    }
+};
+
+/**
+ * remove all the measure interactions
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.removeMeasuresInteractions = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.removeMeasuresInteractions");
+
+    if (this.measureTooltipElement_) {
+        this.measureTooltipElement_.className = 'measure-tooltip measure-tooltip-static';
+        this.measureTooltipElement_.remove();
+        this.measureTooltip_.setOffset([0, -7]);
+        // unset this.sketch_
+        this.sketch_ = null;
+        // unset measure-tooltip so that a new one can be created
+        this.measureTooltipElement_ = null;
+    }
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+    // Désactive les interactions
+    oVmap.getMap().removeActionsOnMap();
+};
+
+/**
+ * display the sketches in a list
+ * @export
+ * @api experimental
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.displayFeatures = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.displayFeatures");
+    this['sketches'] = this.oOpenLayersMeasureOverlayFeatures_.getArray();
+    var allCSV = "";
+    var jsonObject = "";
+    var csv = "";
+
+    // Points correspondants
+    for (var i = 0; i < this['sketches'].length; i++) {
+        this['sketches'][i]['Points'] = this.getPointsInfos(this['sketches'][i]);
+        var featureKeys = this['sketches'][i].getKeys();
+        var featureInfos = {};
+
+        for (var ii = 0; ii < featureKeys.length; ii++) {
+            if (featureKeys[ii] !== 'geometry' && featureKeys[ii] !== 'Keys')
+                featureInfos[featureKeys[ii]] = this['sketches'][i].get(featureKeys[ii]);
+        }
+
+        featureInfos = [featureInfos];
+
+        jsonObject = JSON.stringify(featureInfos);
+        csv = oVmap.JSON2CSV(jsonObject, true, true);
+        allCSV += csv + '\n';
+
+        jsonObject = JSON.stringify(this['sketches'][i]['Points']);
+        csv = oVmap.JSON2CSV(jsonObject, true, true);
+        allCSV += csv + '\n\n';
+    }
+
+    var href = "data:text/csv;charset=utf-8," + encodeURIComponent(allCSV);
+    $("#export-csv-button").attr('href', href);
+};
+
+/**
+ * Get all the points informations
+ * @param {ol.Feature} olFeature OpenLayers Feature
+ * @return {array} Points informations
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.getPointsInfos = function (olFeature) {
+
+    var aPoints = [];
+
+    if (olFeature.get('Type') === 'Ligne' || olFeature.get('Type') === 'Polygone') {
+        aPoints = [];
+
+        // keys
+        aPoints['keys'] = ['Points', 'Coordonnées', 'Longueur-segment', 'Longueur-totale', 'Delta-x', 'Delta-y', 'Angle/Nord'];
+
+        if (olFeature.get('Type') === 'Polygone')
+            var coordinates = olFeature.getGeometry().getCoordinates()[0];
+        else
+            var coordinates = olFeature.getGeometry().getCoordinates();
+
+        var vectorDistance = 0;
+        var totalDistance = 0;
+        var vectorXDistance = 0;
+        var vectorYDistance = 0;
+        var angleValue = 0;
+        var totalCoordinates = [];
+        var lineString = {};
+
+        for (var ii = 0; ii < coordinates.length; ii++) {
+            aPoints[ii] = {};
+            aPoints[ii]['Points'] = ii + 1;
+            aPoints[ii]['Coordonnées'] = coordinates[ii];
+            totalCoordinates.push(coordinates[ii]);
+            if (ii !== 0) {
+
+                // vector distance
+                lineString = new ol.geom.LineString(
+                        [coordinates[ii - 1], coordinates[ii]],
+                        olFeature.getGeometry().getLayout()
+                        );
+                vectorDistance = this.formatLength(lineString);
+
+                // total distance
+                lineString = new ol.geom.LineString(
+                        totalCoordinates,
+                        olFeature.getGeometry().getLayout()
+                        );
+                totalDistance = this.formatLength(lineString);
+
+                // delta x
+                lineString = new ol.geom.LineString(
+                        [[coordinates[ii - 1][0], 0], [coordinates[ii][0], 0]],
+                        olFeature.getGeometry().getLayout()
+                        );
+                vectorXDistance = this.formatLength(lineString);
+                if (coordinates[ii][0] < coordinates[ii - 1][0])
+                    vectorXDistance = "-" + vectorXDistance;
+
+                // delta y
+                lineString = new ol.geom.LineString(
+                        [[0, coordinates[ii - 1][1]], [0, coordinates[ii][1]]],
+                        olFeature.getGeometry().getLayout()
+                        );
+                vectorYDistance = this.formatLength(lineString);
+                if (coordinates[ii][1] < coordinates[ii - 1][1])
+                    vectorYDistance = "-" + vectorYDistance;
+
+                // Angle/nord
+                var x1 = coordinates[ii - 1][0];
+                var x2 = coordinates[ii][0];
+                var y1 = coordinates[ii - 1][1];
+                var y2 = coordinates[ii][1];
+                angleValue = (Math.atan2((y2 - y1), (x2 - x1))) * (180 / Math.PI);
+                angleValue = 90 - angleValue;
+                angleValue < 0 ? (angleValue = 360 - angleValue * (-1)) : angleValue = angleValue;
+                angleValue = angleValue.toFixed(2) + "°";
+
+            }
+
+            aPoints[ii]['Longueur-segment'] = vectorDistance;
+            aPoints[ii]['Longueur-totale'] = totalDistance;
+            aPoints[ii]['Delta-x'] = vectorXDistance;
+            aPoints[ii]['Delta-y'] = vectorYDistance;
+            aPoints[ii]['Angle/Nord'] = angleValue;
+        }
+        ;
+    }
+
+    return aPoints;
+};
+
+
+
+/********************************************
+ *           INTERFACE MOBILE
+ *******************************************/
+
+/**
+ * Runs the point measure procedure
+ * @export
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileMeasurePoint = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.mobileMeasurePoint");
+
+    var this_ = this;
+    oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    oVmap.getMap().startMobileDraw('POINT', function (olFeature) {
+        // Ajoute la feature
+        this_.oOpenLayersMeasureOverlay_.getSource().addFeature(olFeature);
+        // Affiche la mesure avec la tooltip etc..
+        this_.createMeasure(olFeature);
+    });
+};
+
+/**
+ * Runs the line measure procedure
+ * @export
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileMeasureLine = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.mobileMeasureLine");
+
+    var this_ = this;
+    oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    oVmap.getMap().startMobileDraw('LINESTRING', function (olFeature) {
+        // Ajoute la feature
+        this_.oOpenLayersMeasureOverlay_.getSource().addFeature(olFeature);
+        // Affiche la mesure avec la tooltip etc..
+        this_.createMeasure(olFeature);
+    });
+};
+
+/**
+ * Runs the polygon measure procedure
+ * @export
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileMeasurePolygon = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.mobileMeasurePolygon");
+
+    var this_ = this;
+    oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    oVmap.getMap().startMobileDraw('POLYGON', function (olFeature) {
+        // Ajoute la feature
+        this_.oOpenLayersMeasureOverlay_.getSource().addFeature(olFeature);
+        // Affiche la mesure avec la tooltip etc..
+        this_.createMeasure(olFeature);
+    });
+};
+
+/**
+ * Runs the circle measure procedure
+ * @export
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileMeasureCircle = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.mobileMeasureCircle");
+
+    var this_ = this;
+    oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    oVmap.getMap().startMobileDraw('CIRCLE', function (olFeature) {
+        // Ajoute la feature
+        this_.oOpenLayersMeasureOverlay_.getSource().addFeature(olFeature);
+        // Affiche la mesure avec la tooltip etc..
+        this_.createMeasure(olFeature);
+    });
+};
+
+/**
+ * Delete the drawed features
+ * @export
+ */
+nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileDeleteAllFeatures = function () {
+    oVmap.log("nsVmap.nsToolsManager.Measure.prototype.measureController.mobileDeleteAllFeatures");
+
+    oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+    this.deleteAllFeatures();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appMeasure', nsVmap.nsToolsManager.Measure.prototype.measureDirective);
+oVmap.module.controller('AppmeasureController', nsVmap.nsToolsManager.Measure.prototype.measureController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
new file mode 100644
index 0000000000000000000000000000000000000000..8c779787a04216d8ac5ca2ec60d40e2b2bd29a12
--- /dev/null
+++ b/module/javascript/app/vmap/tools/print.js
@@ -0,0 +1,893 @@
+/* global nsVmap, oVmap, goog, ol, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Print
+ * cette classe permet l'initialisation des outils de locatlisation
+ */
+goog.provide('nsVmap.nsToolsManager.Print');
+goog.require('oVmap');
+goog.require('nsVmap.nsToolsManager.PrintBox');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Print}: Add the print tools defined in data/tools.json
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Print = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print');
+};
+goog.exportProperty(nsVmap.nsToolsManager, 'Print', nsVmap.nsToolsManager.Print);
+
+/**
+ * Run the printing process
+ * @param {object} opt_options
+ * @param {object} opt_options.scope
+ * @param {ol.Extent} opt_options.extent
+ * @param {string} opt_options.mapId
+ * @param {string} opt_options.templateId
+ * @param {number} opt_options.resolutionCoeff
+ * @param {array<ol.Feature>} opt_options.features feature to zoom on
+ * @param {number} opt_options.featuresZoom
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.print = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.print');
+
+    var scope = angular.element($("#select-print-format")).scope();
+    scope.$evalAsync(function (scope) {
+        scope['ctrl'].print(opt_options);
+    });
+};
+
+/**
+ * App-specific directive wrapping the print tools. The directive's
+ * controller has a property "map" including a reference to the OpenLayers
+ * map.
+ *
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Print.prototype.printDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Print.prototype.printDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppprintController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/print.html'
+    };
+};
+
+/**
+ * App controler
+ * @export
+ * @constructor
+ * @ngInject
+ */
+nsVmap.nsToolsManager.Print.prototype.printController = function ($timeout, $compile, $scope, $q) {
+    oVmap.log("nsVmap.nsToolsManager.Print.prototype.printController");
+
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$timeout_ = $timeout;
+
+    /**
+     * @private
+     */
+    this.$compile_ = $compile;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * @public
+     */
+    $scope['modelIndex'] = 0;
+
+    /**
+     * @public
+     */
+    $scope['selectedPrintstyleId'] = "";
+
+    /**
+     * Prints models
+     */
+    this['models'];
+
+    /**
+     * Prints styles
+     */
+    this['printStyles'] = [];
+
+    /**
+     * Print selectedModel used
+     */
+    this['selectedModel'];
+
+    /**
+     * Print zone resolution
+     */
+    this['resolution'] = 2;
+
+    /**
+     * dpi selection
+     */
+    this['dpi'] = 1;
+
+    /**
+     * Scale selections
+     */
+    this['scale'] = 'auto';
+
+    /**
+     * The current scale
+     */
+    this['currentScale'] = oVmap.getMap().getScale({
+        'pretty': true
+    });
+
+    /**
+     * Listen the maps moveends to set this.currentScale
+     * @private
+     */
+    this.scaleListener_;
+
+    /**
+     * Html definition of the template
+     * @private
+     */
+    this.template_;
+
+    /**
+     * Size of the printZone
+     * @private
+     */
+    this.printedMapSize_;
+
+    /**
+     * this.printedMapSize_ resize coeff
+     * @private
+     */
+    this.resizeCoeff_;
+
+    /**
+     * The print box object
+     * @private
+     */
+    this.printBox_ = new nsVmap.nsToolsManager.PrintBox();
+
+    // mise à jour de l'échelle dans le forulaire d'impression lors d'un mouvement sur la carte
+    this.listenScaleChanges();
+
+    $('#print-select-btn').click(function () {
+        if ($('#print-select-btn').hasClass('active')) {
+            // Charge les paramètres d'impression
+            this_.loadPrintProperties().then(function () {
+                if (this_['models'].length > 0) {
+                    if (!goog.isDefAndNotNull(this_['models'][$scope['modelIndex']]) || $scope['modelIndex'] === 0) {
+                        $scope['modelIndex'] = "0";
+                    }
+                    this_['printStyles'] = [];
+                    this_.loadModelParmas($scope['modelIndex']);
+                }
+            });
+        }
+    });
+
+    // Supprime la zone d'impression lors d'un toggleOutTools
+    oVmap['scope'].$on('toggleOutTools', function () {
+        if (!$('#print-select-btn').hasClass('active')) {
+            this_.printBox_.hide();
+        }
+    });
+};
+
+/**
+ * Load the print models
+ * @returns {undefined}
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadPrintProperties = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.loadPrintProperties');
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/userprinttemplates',
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'params': {
+            'distinct': true,
+            'attributs': 'format|name|orientation|printstyles|printstyle_id|printtemplate_id|variables'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            this_['models'] = [];
+
+            // Vérifie si le fichier a bien été chargé, donne un modèle par défaut en cas d'erreur
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isArray(response['data']['userprinttemplates'])) {
+                    if (response['data']['userprinttemplates'].length > 0) {
+                        this_['models'] = response['data']['userprinttemplates'];
+                        this_.$scope_['selectedPrintstyleId'] = null;
+                    }
+                }
+            }
+
+            // Recharge la légende pour éviter les erreurs d'association de blob
+            oVmap.getMapManager().getMapLegendTool().loadLegend();
+
+            deferred.resolve();
+        }
+    });
+    return deferred.promise;
+};
+
+/**
+ * Listen for scale changes and update the scale on the print form
+ * @returns {undefined}
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.listenScaleChanges = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.listenScaleChanges');
+
+    // Vérifie si la résolution (niveau de zoom) change
+    var i = 0;
+    var this_ = this;
+    this.scaleListener_ = this['map'].on('moveend', function () {
+        i++;
+        var ii = angular.copy(i);
+        setTimeout(function () {
+            if (i === ii) {
+                if (this_['currentAction'] !== 'print-modifyPrintZone') {
+                    this_['scale'] = 'auto';
+                    this_['currentScale'] = oVmap.getMap().getPrettyScale(oVmap.getMap().getScale() / this_.resizeCoeff_);
+                    this_.$scope_.$apply();
+                }
+            }
+        }, 100);
+    });
+};
+
+/**
+ * Unlisten for scale changes and stop updating the scale on the print form
+ * @returns {undefined}
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.unlistenScaleChanges = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.unlistenScaleChanges');
+    ol.Observable.unByKey(this.scaleListener_);
+};
+
+/**
+ * Charge le template d'un modèle et l'écrase dans this.models
+ *
+ * @param  {string} sPrinttemplateId
+ * @return {promise}
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelTemplate = function (sPrinttemplateId) {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.loadModelTemplate');
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/userprinttemplates/' + sPrinttemplateId,
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['userprinttemplates'])) {
+                    if (goog.isDefAndNotNull(response['data']['userprinttemplates'][0])) {
+                        if (goog.isDefAndNotNull(response['data']['userprinttemplates'][0]['definition']) &&
+                            goog.isDefAndNotNull(response['data']['userprinttemplates'][0]['printtemplate_id'])) {
+                            if (response['data']['userprinttemplates'][0]['printtemplate_id'] === sPrinttemplateId) {
+                                for (var i = 0; i < this_['models'].length; i++) {
+                                    if (this_['models'][i]['printtemplate_id'] === sPrinttemplateId) {
+                                        this_['models'][i]['definition'] = response['data']['userprinttemplates'][0]['definition'];
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            deferred.resolve();
+        }
+    });
+    return deferred.promise;
+}
+
+/**
+ * Load the selectedModel params
+ * @param {number} modelIndex index in models
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas = function (modelIndex) {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.loadModelParmas');
+
+    // Charge le modèle
+    this['selectedModel'] = this['models'][modelIndex];
+
+    // Charge le template
+    this.setTemplate(this['selectedModel'], this.loadModelParmas2);
+
+    // Charge la liste des styles disponibles
+    this['printStyles'] = this['selectedModel']['printstyles'];
+};
+
+/**
+ * Load the selectedModel params 2
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas2 = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.loadModelParmas2');
+
+    // Récupère la taille de la carte this.printedMapSize_ ainsi que le coefficient this.resizeCoeff_
+    this.setPrintedMapSize(this.template_);
+
+    // Pré-rempli le champ "Résolution"
+    this['resolution'] = this.resizeCoeff_;
+
+    // Ajuste l'échelle avec le niveau de détail
+    this['currentScale'] = oVmap.getMap().getPrettyScale(oVmap.getMap().getScale() / this.resizeCoeff_);
+
+    // Dessine un carré d'impression à chaque mouvement de la carte
+    this.printBox_.setSize(this.printedMapSize_);
+    this.printBox_.show();
+
+};
+
+/**
+ * Set the template in this.template_ and run loadModelParmas2
+ * @param {object} oModel
+ * @param {string|undefined} oModel.url template url starting form the vmap folder
+ * @param {function} callback
+ * @returns {undefined}
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.setTemplate = function (oModel, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.setTemplate');
+
+    var this_ = this;
+
+    if (!goog.isDefAndNotNull(oModel['definition']) && !goog.isDefAndNotNull(oModel['url'])) {
+        this.loadModelTemplate(oModel['printtemplate_id']).then(function() {
+            if (!goog.isDefAndNotNull(oModel['definition']) && !goog.isDefAndNotNull(oModel['url'])) {
+                bootbox.alert('<h4>Aucune définition présente dans le modèle d\'impression</h4>');
+            } else {
+                this_.setTemplate(oModel, callback);
+            }
+        });
+    }
+
+    if (goog.isDefAndNotNull(oModel['definition'])) {
+        var template = document.createElement("div");
+        template.innerHTML = oModel['definition'];
+        this_.template_ = template;
+        callback.call(this, [template]);
+    }
+};
+
+/**
+ * Set this.printedMapSize_ and this.resizeCoeff_
+ * @param {object} template
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.setPrintedMapSize = function (template) {
+    oVmap.log('nsVmap.nsToolsManager.Print.printController.setPrintedMapSize');
+
+    var imageDiv = $(template).find('#map_image');
+
+    // Vérifie la présence de '#map_image'
+    if (!goog.isDef(imageDiv.get(0))) {
+        console.error('Aucune balise #map_image trouvée dans le template');
+        return 0;
+    }
+
+    // Ajoute temporairement le template au body de Vmap
+    $(template).addClass('print_template');
+    $('body').append(template);
+
+    var mapHeight = imageDiv.height();
+    var mapWidth = imageDiv.width();
+
+    // Supprime le template du body de Vmap
+    $(template).remove();
+
+    // Vérifie si la taille de la carte est suppérieur à la taille de l'écran
+    this.resizeCoeff_ = 1;
+    var tmpWidth = angular.copy(mapWidth);
+    var tmpHeight = angular.copy(mapHeight);
+    while (mapWidth > ($('#map1').width()) || mapHeight > ($('#map1').height())) {
+        this.resizeCoeff_++;
+        mapWidth = tmpWidth / this.resizeCoeff_;
+        mapHeight = tmpHeight / this.resizeCoeff_;
+    }
+
+    this.printedMapSize_ = [mapWidth, mapHeight];
+};
+
+/**
+ * Change the map scale for the print-zone
+ * @param {number} scale
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.changeScale = function (scale) {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.changeScale');
+
+    if (scale === 'auto')
+        return 0;
+
+    // Positionne la vue en fonction de la printZone
+    if (this['currentAction'] === 'print-modifyPrintZone') {
+        this.printBox_.setScale(scale);
+        this.currentScale = scale;
+        return 0;
+    }
+
+    // Si le cadre d'impression est plus grand que l'écran, alors la taille du cadre est divisée par deux, se qui signifie que l'échelle aussi
+    var viewScale = scale * this.resizeCoeff_;
+
+    // Change la résolution en fonction de l'échelle
+    oVmap.getMap().setScale(viewScale);
+
+};
+
+/**
+ * Detach the printZone from the view and allow to translate it
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.managePrintZone = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.managePrintZone');
+
+    if (this['currentAction'] === 'print-modifyPrintZone') {
+        this.printBox_.unmanagePrintBox();
+    } else {
+        this.printBox_.managePrintBox('print-modifyPrintZone');
+    }
+};
+
+/**
+ * Prepare the print params and launch it
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunchPrint = function () {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunchPrint');
+
+    // Enregistre l'échelle actuelle
+    this.currentScale_ = oVmap.getMap().getScale({
+        'pretty': true
+    });
+
+    // Prépare scope
+    var scope = {};
+    for (var i = 0; i < this['selectedModel']['variables'].length; i++)
+        scope[this['selectedModel']['variables'][i]['name']] = this['selectedModel']['variables'][i]['value'];
+
+    // Prépare extent
+    var extent = this.printBox_.getExtent();
+
+    // templateId
+    var templateId = this['selectedModel']['printtemplate_id'];
+
+    var aLocationOverlayFeatures = oVmap.getMap().getLocationOverlayFeatures().getArray();
+    var aPopupOverlayFeatures = oVmap.getMap().getPopupOverlayFeatures().getArray();
+    var aSelectionOverlayFeatures = oVmap.getMap().getSelectionOverlayFeatures().getArray();
+
+    // Lance l'impression
+    var returnPrint = this.print({
+        scope: scope,
+        extent: extent,
+        templateId: templateId,
+        printStyleId: this.$scope_['selectedPrintstyleId'],
+        resolutionCoeff: this['dpi'],
+        features: goog.array.concat(aLocationOverlayFeatures, aPopupOverlayFeatures, aSelectionOverlayFeatures)
+    });
+
+    if (returnPrint === 1) {
+        // Ferme l'outil d'impression
+        oVmap.getToolsManager().getBasicTools().toggleOutTools();
+    }
+};
+
+/**
+ * Run the printing process
+ * @param {object} opt_options
+ * @param {object|undefined} opt_options.scope
+ * @param {ol.Extent|undefined} opt_options.extent
+ * @param {string|undefined} opt_options.mapId
+ * @param {string} opt_options.templateId
+ * @param {string} opt_options.printStyleId
+ * @param {number|undefined} opt_options.resolutionCoeff
+ * @param {array<ol.Feature>|undefined} opt_options.features feature to zoom on
+ * @param {number|undefined} opt_options.featuresZoom
+ * @returns {number} 1 if all semms good
+ * @export
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.print');
+
+    var this_ = this;
+
+    if (!goog.isDefAndNotNull(opt_options)) {
+        console.error('opt_options.templateId not defined');
+        return 0;
+    }
+
+    // Récupère la date
+    var today = new Date();
+    var dd = today.getDate();
+    var mm = today.getMonth() + 1; //January is 0!
+    var yyyy = today.getFullYear();
+    if (dd < 10) {
+        dd = '0' + dd;
+    }
+    if (mm < 10) {
+        mm = '0' + mm;
+    }
+    today = dd + '/' + mm + '/' + yyyy;
+
+    // Valeurs par défaut
+    var templateId = opt_options.templateId;
+    var printStyleId = opt_options.printStyleId;
+
+    // Set includesJSON
+    var includesJson = JSON.stringify([{
+            'target': '#map_legend',
+            'html': this_.getLegendTemplate()
+        }]);
+
+    // Set scope
+    var oPrintScope = goog.isDefAndNotNull(opt_options.scope) ? opt_options.scope : {};
+    oPrintScope['date'] = goog.isDefAndNotNull(oPrintScope['date']) ? oPrintScope['date'] : today;
+    var sScope = JSON.stringify(oPrintScope);
+
+    // Ouvre la fenêtre d'impression
+    var printWindow = window.open("", '_blank', 'height=400,width=600');
+
+    // Si le navigateur bloque les fenêtres
+    if (!goog.isDefAndNotNull(printWindow)) {
+        $.notify('Fenêtre d\'impression bloquée par le navigateur', 'error');
+        return 0;
+    }
+    printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    // Récupère les infos du template
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/printtemplates/' + templateId,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            var bError = false;
+            if (!goog.isDefAndNotNull(response['data'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['data'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['data'][0])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['data'][0]['definition'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['data'][0]['rt_format_id'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['data'][0]['rt_orientation_id'])) {
+                bError = true;
+            }
+            if (bError) {
+                $.notify('Erreur lors du chargement des données du template ' + templateId, 'error');
+                console.error("response: ", response);
+                return 0;
+            }
+
+            var sFormat = response['data']['data'][0]['rt_format_id'];
+            var sOrientation = response['data']['data'][0]['rt_orientation_id'];
+
+            var template = document.createElement("div");
+            template.innerHTML = response['data']['data'][0]['definition'];
+
+            var mapImageSize = this_.getTemplateTargetSize(template, '#map_image');
+            var overviewSize = this_.getTemplateTargetSize(template, '#map_overview');
+
+            var mapsJson = this_.getMapsJsonDef({
+                mapId: opt_options.mapId,
+                resolutionCoeff: opt_options.resolutionCoeff,
+                extent: opt_options.extent,
+                features: opt_options.features,
+                featuresZoom: opt_options.featuresZoom,
+                mapImageSize: mapImageSize,
+                overviewSize: overviewSize
+            })
+
+            // Récupère les infos de l'utilisateur
+            this_.getUserInfos_().then(function (oUserInfos) {
+
+                // Merge les infos utilisateur
+                var oPrintScope = JSON.parse(sScope);
+                for (var key in oUserInfos) {
+                    if (!goog.isDef(oPrintScope['user_' + key])) {
+                        oPrintScope['user_' + key] = oUserInfos[key];
+                    }
+                }
+                sScope = JSON.stringify(oPrintScope);
+
+                ajaxRequest({
+                    'method': 'POST',
+                    'url': oVmap['properties']['api_url'] + '/vmap/printtemplateservices',
+                    'headers': {
+                        'Accept': 'application/x-vm-json'
+                    },
+                    'data': {
+                        'printtemplate_id': templateId,
+                        'printstyle_id': printStyleId,
+                        'format': sFormat,
+                        'orientation': sOrientation,
+                        'includes_json': includesJson,
+                        'maps_json': mapsJson,
+                        'scope_json': sScope
+                    },
+                    'scope': this_.$scope_,
+                    'timeout': 120000,
+                    'success': function (response) {
+
+                        var bError = false;
+                        if (!goog.isDefAndNotNull(response['data'])) {
+                            bError = true;
+                        } else if (!goog.isDefAndNotNull(response['data']['printtemplateservices'])) {
+                            bError = true;
+                        } else if (!goog.isDefAndNotNull(response['data']['printtemplateservices']['image'])) {
+                            bError = true;
+                        } else if (response['data']['status'] !== 1) {
+                            bError = true;
+                        }
+                        if (bError) {
+                            $.notify('Une erreur est survenue lors de l\'impression', 'error');
+                            printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Une erreur est survenue lors de l\'impression</div>');
+                            console.error("response: ", response);
+                            return 0;
+                        }
+
+                        $.notify('Impression réussie', 'success');
+                        printWindow.location.href = response['data']['printtemplateservices']['image'];
+                    },
+                    'error': function (response) {
+                        console.error(response);
+                        $.notify('Une erreur est survenue lors de l\'impression', 'error');
+                        printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Une erreur est survenue lors de l\'impression</div>');
+                    }
+                });
+            });
+        },
+        'error': function (response) {
+            console.error(response);
+            $.notify('Une erreur est survenue lors de l\'impression', 'error');
+            printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Une erreur est survenue lors de l\'impression</div>');
+        }
+    });
+    return 1;
+};
+
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef');
+
+    // Resolution
+    var resolutionCoeff = goog.isDefAndNotNull(opt_options.resolutionCoeff) ? opt_options.resolutionCoeff : 1;
+
+    // mapId/mapJson
+    var sMapId;
+    var sMapJSON;
+    if (goog.isDefAndNotNull(opt_options.mapId)) {
+        sMapId = opt_options.mapId;
+    } else {
+        sMapJSON = oVmap.getMapManager().getJSONLayersTree();
+    }
+
+    // Extent
+    var aExtent = goog.isDefAndNotNull(opt_options.extent) ? opt_options.extent : [];
+    var sExtent = '';
+    var aOverviewExtent = [
+        aExtent[0] - (aExtent[2] - aExtent[0]),
+        aExtent[1] - (aExtent[3] - aExtent[1]),
+        aExtent[2] + (aExtent[2] - aExtent[0]),
+        aExtent[3] + (aExtent[3] - aExtent[1])
+    ];
+    var sOverviewExtent = '';
+    for (var i = 0; i < aExtent.length; i++) {
+        if (i > 0) {
+            sExtent += '|';
+            sOverviewExtent += '|';
+        }
+        sExtent += aExtent[i];
+        sOverviewExtent += aOverviewExtent[i];
+    }
+
+    // Features
+    var aFeatures = goog.isDefAndNotNull(opt_options.features) ? opt_options.features : [];
+    var sEWKTFeatures = '';
+    for (var i = 0; i < aFeatures.length; i++) {
+        if (i > 0)
+            sEWKTFeatures += '|';
+        sEWKTFeatures += oVmap.getEWKTFromGeom(aFeatures[i].getGeometry());
+    }
+
+    var sFeaturesZoom = 100;
+    if (goog.isDefAndNotNull(opt_options.featuresZoom)) {
+        sFeaturesZoom = opt_options.featuresZoom;
+    } else if (goog.isDefAndNotNull(oVmap['properties']['print']['features_zoom'])) {
+        sFeaturesZoom = oVmap['properties']['print']['features_zoom'];
+    }
+
+    if (goog.isDefAndNotNull(opt_options.mapImageSize)) {
+        var oMapDef = {
+            'map_id': sMapId,
+            'map_json': sMapJSON,
+            'image_size': (opt_options.mapImageSize[0] * resolutionCoeff) + '|' + (opt_options.mapImageSize[1] * resolutionCoeff),
+            'resolution_coeff': resolutionCoeff,
+            'extent': sExtent,
+            'features': sEWKTFeatures,
+            'features_zoom': sFeaturesZoom
+        };
+    }
+
+    if (goog.isDefAndNotNull(opt_options.overviewSize)) {
+        var oOverviewDef = {
+            'map_id': sMapId,
+            'map_json': sMapJSON,
+            'image_size': (opt_options.overviewSize[0] * resolutionCoeff) + '|' + (opt_options.overviewSize[1] * resolutionCoeff),
+            'resolution_coeff': resolutionCoeff,
+            'extent': sOverviewExtent,
+            'features': sEWKTFeatures,
+            'features_zoom': 400
+        };
+    }
+
+    var oMapsJson = [];
+    if (goog.isDefAndNotNull(oMapDef)) {
+        oMapsJson.push({
+            'target': '#map_image',
+            'map_definition': oMapDef
+        });
+    }
+    if (goog.isDefAndNotNull(oOverviewDef)) {
+        oMapsJson.push({
+            'target': '#map_overview',
+            'map_definition': oOverviewDef
+        });
+    }
+
+    var mapsJson = JSON.stringify(oMapsJson);
+
+    return mapsJson;
+}
+
+/**
+ * Get the size of a target in a template
+ * @param {string} template
+ * @param {string} target
+ * @returns {Array<Number>|undefined}
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getTemplateTargetSize = function (template, target) {
+
+    var targetDiv = $(template).find(target);
+
+    // Vérifie la présence de '#map_image'
+    if (!goog.isDef(targetDiv.get(0))) {
+        oVmap.log('Aucune balise ' + target + ' trouvée dans le template');
+        return undefined;
+    }
+
+    $('body').append(template);
+
+    var targetHeight = targetDiv.height();
+    var targetWidth = targetDiv.width();
+
+    // Supprime le template du body de Vmap
+    $(template).remove();
+
+    return [targetWidth, targetHeight];
+};
+
+/**
+ * Get the html definition of the template with base64 images
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getLegendTemplate = function () {
+
+    var template = $('#maplegend').clone();
+
+    // Transforme les images en base64
+    template.find('img').each(function (index) {
+
+        try {
+
+            var image = this;
+            var imgCanvas = document.createElement("canvas");
+            var imgContext = imgCanvas.getContext("2d");
+
+            imgCanvas.width = image.width;
+            imgCanvas.height = image.height;
+
+            imgContext.drawImage(image, 0, 0, image.width, image.height);
+
+            var base64Img = imgCanvas.toDataURL("image/png");
+
+            $(this).attr('src', base64Img);
+            $(this).removeAttr('ng-src');
+
+        } catch (e) {
+
+        }
+    });
+
+    var sTemplate = template.html();
+
+    sTemplate = sTemplate.replace(/&amp;/g, '&');
+    sTemplate = sTemplate.replace(/"/g, '\\"');
+
+    return sTemplate;
+};
+
+/**
+ * Get the user infos in a promise
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getUserInfos_ = function () {
+    oVmap.log("nsVmap.nsToolsManager.Print.prototype.printController.prototype.getUserInfos_");
+
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vitis/users/' + sessionStorage['user_id'],
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['data'])) {
+                    if (goog.isDefAndNotNull(response['data']['data'][0])) {
+                        deferred.resolve(response['data']['data'][0]);
+                    }
+                }
+            }
+        }
+    });
+    return deferred.promise;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appPrint', nsVmap.nsToolsManager.Print.prototype.printDirective);
+oVmap.module.controller('AppprintController', nsVmap.nsToolsManager.Print.prototype.printController);
diff --git a/module/javascript/app/vmap/tools/printBox.js b/module/javascript/app/vmap/tools/printBox.js
new file mode 100755
index 0000000000000000000000000000000000000000..b359736577fd4fc861e58c471cf2f0aad568d5ae
--- /dev/null
+++ b/module/javascript/app/vmap/tools/printBox.js
@@ -0,0 +1,309 @@
+/* global nsVmap, oVmap, goog, ol, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.PrintBox
+ * cette classe permet l'apparition d'une zone d'impression sur la carte
+ */
+goog.provide('nsVmap.nsToolsManager.PrintBox');
+goog.require('ol.interaction.Translate');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.PrintBox}: Add the print tools defined in data/tools.json
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.PrintBox');
+
+    this.map_ = oVmap.getMap().getOLMap();
+
+    // Valeurs par défaut
+    opt_options = goog.isDefAndNotNull(opt_options) ? opt_options : {};
+
+    /**
+     * The print box feature
+     * @private
+     */
+    this.printBoxFeature_;
+
+    /**
+     * The printBox size
+     * @private
+     */
+    this.printBoxSize_ = opt_options['size'];
+
+    /**
+     * Event to reload the this.printBoxFeature_
+     * @private
+     */
+    this.printBoxEvent_;
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersOverlay_ = oVmap.getMap().addVectorLayer();
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersOverlayFeatures_ = this.oOpenLayersOverlay_.getSource().getFeaturesCollection();
+
+    /**
+     * @private
+     * @type ol.interaction.Translate
+     */
+    this.translateInteraction_ = new ol.interaction.Translate({
+        features: this.oOpenLayersOverlayFeatures_
+    });
+
+};
+goog.exportProperty(nsVmap.nsToolsManager, 'Print', nsVmap.nsToolsManager.Print);
+
+/**
+ * Show the print box on map
+ * @param {boolean} bListenMovements allows to follow the map movements, default is true
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.show = function (bListenMovements) {
+
+    if (!goog.isDefAndNotNull(bListenMovements)) {
+        bListenMovements = true;
+    }
+
+    // Crée la première printBox
+    this.drawPrintBox();
+
+    // Re-dessine une printBox à chaque mouvement de la carte si bListenMovements
+    if (bListenMovements)
+        this.listenMapMovements();
+};
+
+/**
+ * Hide the printbox on map
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.hide = function () {
+
+    // Arrête d'écouter les mouvements de la carte
+    this.unlistenMapMovements();
+
+    // Supprime la print box en cours
+    this.oOpenLayersOverlayFeatures_.clear();
+};
+
+/**
+ * Detach the printZone from the view and allow to translate it
+ * @param {string} sInteractionName name of the interaction
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.managePrintBox = function (sInteractionName) {
+    oVmap.log('nsVmap.nsToolsManager.PrintBox.managePrintBox');
+
+    sInteractionName = goog.isDefAndNotNull(sInteractionName) ? sInteractionName : 'modifyPrintZone';
+
+    // Arrete le mouvement de la printBox en même temps que la carte
+    this.unlistenMapMovements();
+
+    // Ajoute l'interaction de déplacement de la printBox
+    oVmap.getMap().setInteraction(this.translateInteraction_, sInteractionName);
+
+};
+
+/**
+ * Cancel the printZone manage interaction and adapt the view on it
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.unmanagePrintBox = function () {
+    oVmap.log('nsVmap.nsToolsManager.PrintBox.unmanagePrintBox');
+
+    // remove l'action de modification
+    oVmap.getMap().removeActionsAndTooltips();
+
+    this.drawPrintBox();
+    this.listenMapMovements();
+};
+
+/**
+ * Get the print box scale
+ * @returns {Number|String}
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.getScale = function () {
+
+    var this_ = this;
+
+    // Mémorise la position initiale
+    var currentResolution = this.map_.getView().getResolution();
+    var currentCenter = this.map_.getView().getCenter();
+    var printBox = this.getExtent();
+
+
+    // Positionne la vue sur l'étendue de la printBox
+    this.map_.getView().fit(this.getExtent(), {
+        constrainResolution: false,
+        nearest: true
+    });
+
+    var scale = oVmap.getMap().getScale();
+
+    setTimeout(function () {
+        // Retrouve la position initiale
+        this_.map_.getView().setResolution(currentResolution);
+        this_.map_.getView().setCenter(currentCenter);
+    });
+
+    return scale;
+};
+
+/**
+ * Set a new scale to the printbox (warning: this only works when the printBox zone is managed)
+ * @param {number} newScale
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.setScale = function (newScale) {
+    
+    // Échelle courante
+    var currentScale = this.getScale();
+
+    // Calcul du delta entre l'échelle courrante et l'échelle voulue
+    var deltaScale = newScale / currentScale;
+    
+    // Mise sous forme de variables pour une meilleure compréhension
+    var currentExtent = this.getExtent();
+    var xmin = currentExtent[0];
+    var ymin = currentExtent[1];
+    var xmax = currentExtent[2];
+    var ymax = currentExtent[3];
+    var length = xmax - xmin;
+    var height = ymax - ymin;
+
+    // Calcul de la nouvelle hauteur/largeur de la printBox
+    var newLength = length * deltaScale;
+    var newHeight = height * deltaScale;
+    
+    // Calcul des nouvelles coordonnées en fonction du centre et des nouvelles hauteur/largeur
+    var center = this.printBoxFeature_.getGeometry().getInteriorPoint().getCoordinates();
+    var newXmin = center[0] - newLength / 2;
+    var newXmax = center[0] + newLength / 2;
+    var newYmin = center[1] - newHeight / 2;
+    var newYmax = center[1] + newHeight / 2;
+
+    // Dessin de la nouvelle feature
+    var box = ol.geom.Polygon.fromExtent([newXmin, newYmin, newXmax, newYmax]);
+    this.printBoxFeature_ = new ol.Feature({
+        geometry: box
+    });
+    
+    // Supprime l'ancienne feature
+    this.oOpenLayersOverlayFeatures_.clear();
+    
+    // Ajoute la nouvelle feature
+    this.oOpenLayersOverlay_.getSource().addFeature(this.printBoxFeature_);
+};
+
+/**
+ * Get the printBox size (warning: this only works when the printBox zone is managed)
+ * @export
+ * @returns {array<number>}
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.getSize = function () {
+    return this.printBoxSize_;
+};
+
+/**
+ * Set the printBox size
+ * @param {array<number>} printBoxSize
+ * @export
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.setSize = function (printBoxSize) {
+    this.printBoxSize_ = printBoxSize;
+};
+
+/**
+ * Get the printBox extent
+ * @export
+ * @returns {array<number>}
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.getExtent = function () {
+    return this.printBoxFeature_.getGeometry().getExtent();
+};
+
+/**
+ * Draw a new print box on each map precompose
+ * @private
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.listenMapMovements = function () {
+
+    this.printBoxEvent_ = oVmap.getMap().setEventOnMap('precompose', this.drawPrintBox, this);
+};
+
+/**
+ * Stop drawing print boxes on each map precompose
+ * @private
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.unlistenMapMovements = function () {
+
+    ol.Observable.unByKey(this.printBoxEvent_);
+};
+
+/**
+ * Draw the printBox descrived by this.printBoxFeature_
+ * @returns {undefined}
+ * @private
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.drawPrintBox = function () {
+
+    if (!goog.isDefAndNotNull(this.printBoxSize_)) {
+        console.error('Print box size undefined');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(this.printBoxSize_)) {
+        console.error('Print box feature undefined');
+        return 0;
+    }
+
+    // supprime la zone d'impression
+    this.oOpenLayersOverlayFeatures_.clear();
+
+    // dessine la zone d'impression
+    this.printBoxFeature_ = this.createPrintBox(this.printBoxSize_);
+    this.oOpenLayersOverlay_.getSource().addFeature(this.printBoxFeature_);
+};
+
+/**
+ * Create a printBox feature according to this.printedMapSize
+ * @param {array<number>} printBoxSize
+ * @returns {ol.Feature}
+ * @private
+ */
+nsVmap.nsToolsManager.PrintBox.prototype.createPrintBox = function (printBoxSize) {
+
+    var boxWidth = printBoxSize[0];
+    var boxHeight = printBoxSize[1];
+
+    var x1 = $('#map1').width() / 2 - boxWidth / 2;
+    var x2 = $('#map1').width() / 2 + boxWidth / 2;
+    var y1 = $('#map1').height() / 2 - boxHeight / 2;
+    var y2 = $('#map1').height() / 2 + boxHeight / 2;
+
+    var point1 = [x1, y2];
+    var point3 = [x2, y1];
+
+    var coord1 = this.map_.getCoordinateFromPixel(point1);
+    var coord3 = this.map_.getCoordinateFromPixel(point3);
+
+    var box = ol.geom.Polygon.fromExtent([coord1[0], coord3[1], coord3[0], coord1[1]]);
+
+    var boxFeature = new ol.Feature({
+        geometry: box
+    });
+
+    boxFeature.set('pixelExtent', [x1, y1, x2, y2]);
+
+    return boxFeature;
+};
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/select/advancedselect.js b/module/javascript/app/vmap/tools/select/advancedselect.js
new file mode 100644
index 0000000000000000000000000000000000000000..85c43ac9b53b1510174e8165b7d3b609a2f9099a
--- /dev/null
+++ b/module/javascript/app/vmap/tools/select/advancedselect.js
@@ -0,0 +1,2113 @@
+/* global goog, nsVmap, oVmap, ol, angular, scope, bootbox, vitisApp, destructor_form */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.AdvancedSelect
+ * cette classe permet l'interrogation de couches
+ */
+goog.provide('nsVmap.nsToolsManager.AdvancedSelect');
+
+goog.require('oVmap');
+
+goog.require('ol.layer.Vector');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.style.Style');
+goog.require('ol.style.Stroke');
+goog.require('ol.format.WKT');
+goog.require('goog.array');
+goog.require('goog.object');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.AdvancedSelect}: allow select
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect = function () {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect');
+};
+
+/**
+ * App-specific directive wrapping the select tools.
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppAdvancedselectController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'advancedselect_mobile.html' : 'advancedselect.html')
+    };
+};
+
+/**
+ * @ngInject
+ * @constructor
+ * @param {object} $scope
+ * @param {object} $timeout
+ * @param {object} $q
+ * @returns {nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController}
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController = function ($scope, $timeout, $q) {
+    oVmap.log("nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController");
+
+    var this_ = this;
+
+    /**
+     * The vMap scope
+     */
+    $scope['vmapScope'] = oVmap['scope'];
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$timeout_ = $timeout;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * Dummy canceler (use canceler.resolve() for cancel the ajax request)
+     * @private
+     */
+    this.canceler_ = $q.defer();
+
+    /**
+     * Parent element
+     */
+    this.oSelect = oVmap.getToolsManager().getBasicTools().getSelect();
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * Type de géométrie à utiliser
+     */
+    this['selectGeomType'] = "Polygon";
+
+    /**
+     * Maximum popup mode objects
+     * @type integer
+     */
+    this.limitPopup_ = oVmap['properties']["selection"]["limit_popup"];
+
+    /**
+     * Maximum list mode objects
+     * @type integer
+     */
+    this['limitList_'] = oVmap['properties']["selection"]["limit_list"];
+
+    /**
+     * Query buffer in mm on screen (look postgis st_buffer for more information)
+     * @type integer
+     */
+    this.buffer_ = oVmap['properties']["selection"]["buffer"];
+
+    /**
+     * The buffer is calculed with the scale, this parameter is the maximum scale to calculate
+     */
+    this.maxBuffer_ = oVmap['properties']["selection"]["max_buffer"];
+
+    /**
+     * @type {ol.interaction.Draw}
+     * @private
+     */
+    this.draw_;
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOpenLayersOverlay_ = oVmap.getMap().addVectorLayer();
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOpenLayersOverlayFeatures_ = this.oOpenLayersOverlay_.getSource().getFeaturesCollection();
+
+    this.goTablePageWithTimeoutCounter_ = 0;
+
+    /**
+     * @private
+     */
+    this['allQueryables_'] = false;
+
+    /**
+     * contains the current selections
+     * @type {array}
+     */
+    this['aSelections'] = [];
+
+    /**
+     * contains the selection before
+     * @type {array}
+     */
+    this.aLastSelections = [];
+
+    /**
+     * Contains the information used by the table
+     * @type object
+     */
+    this['tableSelection'] = {};
+
+    /**
+     * Contains the information used by the table
+     * @type object
+     */
+    this['tableSelectionMetadata'] = {};
+
+    /**
+     * Queryable business objects
+     */
+    this['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
+
+    /**
+     * Business objects list
+     */
+    this['aBusinessObjectsList'] = [];
+
+    /**
+     * Business objects infos
+     */
+    this['oBusinessObjects'] = {};
+
+    /**
+     * Old values from search forms
+     * @type object
+     */
+    this.tmpSearchValues_ = {};
+
+    /**
+     * the selected bo
+     */
+    this['sSelectedBo'] = null;
+
+    /**
+     * True/false
+     */
+    this['bGTFExport'] = false;
+
+    /**
+     * Attributes used to export via GTF
+     */
+    this['oGTFExportAttibutes'] = null;
+
+    if (goog.isDefAndNotNull(oVmap['properties']['vmap_export'])) {
+        if (goog.isString(oVmap['properties']['vmap_export']['gtf_api_url'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_public_token'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_priority_id'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_email_option_id'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_workspace_id'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_export_formats'])
+                && goog.isString(oVmap['properties']['vmap_export']['gtf_export_coordsys'])) {
+            this['bGTFExport'] = true;
+            this['gtf_export_formats'] = JSON.parse(oVmap['properties']['vmap_export']['gtf_export_formats']);
+            this['gtf_export_coordsys'] = JSON.parse(oVmap['properties']['vmap_export']['gtf_export_coordsys']);
+        }
+    }
+
+    // rempli this.oQueryableBOs
+    oVmap['scope'].$on('layersChanged', function () {
+        this_.$scope_.$applyAsync(function () {
+
+            // rempli this.oQueryableBOs
+            this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
+
+            // rempli this.aBusinessObjectsList
+            goog.array.clear(this_['aBusinessObjectsList']);
+            for (var bo_id in this_['oQueryableBOs']) {
+                this_['aBusinessObjectsList'].push(bo_id);
+            }
+        });
+    });
+
+    // rempli this.aBusinessObjectsList
+    goog.array.clear(this_['aBusinessObjectsList']);
+    for (var bo_id in this_['oQueryableBOs']) {
+        this_['aBusinessObjectsList'].push(bo_id);
+    }
+
+    // Lors du click sur 'echap', annule les requêtes en cours
+    $(document).keydown(function (e) {
+        if (e.keyCode === 27) {
+            this_.canceler_.resolve();
+        }
+    });
+
+    // Vide les selections quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        this_.removeSelections();
+    });
+};
+
+
+// Interrogation par intersection géométrique
+
+/**
+ * Set the drawTool
+ * @param {string} type (Point, Line, Rectangle, Polygon, Circle)
+ * @param {boolean} isActive true if the selection is already active
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.startSelection = function (type, isActive) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.startSelection');
+
+    var tmpMessage = '';
+
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    if (isActive === true)
+        return 0;
+
+    if (type === 'Point') {
+
+        //Ajoute la tooltip
+        tmpMessage = 'Cliquez sur un point pour effectuer la sélection';
+        oVmap.getMap().getMapTooltip().displayMessage(tmpMessage);
+
+        // Ajoute l'interraction
+        this.queryByDrawing(type);
+
+    } else if (type === 'MultiPoint') {
+
+        //Ajoute la tooltip
+        tmpMessage = 'Dessinez un ou plusieurs points pour effectuer la sélection';
+        oVmap.getMap().getMapTooltip().displayMessage(tmpMessage);
+
+        // Ajoute l'interraction
+        this.queryByDrawing(type);
+
+    } else if (type === 'LineString') {
+        //Ajoute la tooltip
+        tmpMessage = 'Dessinez une ligne pour effectuer la sélection';
+        oVmap.getMap().getMapTooltip().displayMessage(tmpMessage);
+
+        // Ajoute l'interraction
+        this.queryByDrawing(type);
+
+    } else if (type === 'Polygon') {
+        //Ajoute la tooltip
+        tmpMessage = 'Dessinez un polygone pour effectuer la sélection';
+        oVmap.getMap().getMapTooltip().displayMessage(tmpMessage);
+
+        // Ajoute l'interraction
+        this.queryByDrawing(type);
+
+    } else if (type === 'Circle') {
+        //Ajoute la tooltip
+        tmpMessage = 'Dessinez un cercle pour effectuer la sélection';
+        oVmap.getMap().getMapTooltip().displayMessage(tmpMessage);
+
+        // Ajoute l'interraction
+        this.queryByDrawing(type);
+
+    } else {
+        console.error('startSelection: type (' + type + ') not allowed');
+        return 0;
+    }
+
+};
+
+/**
+ * Cancel the selection
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.cancelSelection = function () {
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+};
+
+/**
+ * Query layer by the db_table informed in map.layer and shows the popup
+ * @param {ol.geom} type geometry type
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByDrawing = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByDrawing');
+
+    var this_ = this;
+
+    // Réinitialise la projection au cas où elle ait changée entre temps
+    this.sProjection = this['map'].getView().getProjection().getCode();
+    this.GeoJSON_ = new ol.format.GeoJSON({defaultDataProjection: this.sProjection});
+
+    this.draw_ = oVmap.getMap().setDrawInteraction({
+        type: type,
+        features: this.oOpenLayersOverlayFeatures_
+    }, 'basicTools-selectBy' + type);
+    this.draw_.on('drawend',
+    function (evt) {
+        // Cas de multiple géométrie
+        if (type.substr(0, 5) === 'Multi') {
+            bootbox['dialog']({
+                'message': "<h4>Valider la géométrie ?</h4>",
+                'buttons': {
+                    'addPart': {
+                        'label': 'Ajouter une autre partie',
+                        'className': 'btn-primary width-100 margin-10',
+                        'callback': function () {
+
+                        }
+                    },
+                    'confirm': {
+                        'label': 'Oui, terminer',
+                        'className': 'btn-success width-100 margin-10',
+                        'callback': function () {
+                            var aFeatures = this_.oOpenLayersOverlayFeatures_.getArray();
+                            var olFeature = oVmap.getMultiGeomFromSingleFeatures(aFeatures, type);
+                            this_.queryByFeature(olFeature, type);
+                        }
+                    }
+                }
+            });
+        } else {
+            this_.queryByFeature(evt.feature, type);
+        }
+
+    }, this);
+};
+
+/**
+ * Query the business object by a spatial intersection with olFeature
+ * @param {ol.Feature} olFeature
+ * @param {string} sType
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByFeature = function (olFeature, sType) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByFeature');
+
+    var this_ = this;
+
+    // Transforme les cercles en polygones de 32 côtés
+    // car ils ne sont pas acceptés par WKT
+    if (sType === 'Circle') {
+        var circleGeom = olFeature.getGeometry();
+        var polygonGeom = new ol.geom.Polygon.fromCircle(circleGeom);
+        olFeature = new ol.Feature({
+            geometry: polygonGeom
+        });
+    }
+
+    // Transforme la feature en EWKT
+    var EWKTGeometry = oVmap.getEWKTFromGeom(olFeature.getGeometry());
+
+    this.queryByEWKTGeom(EWKTGeometry, true, true);
+
+    // vide l'overlay
+    setTimeout(function () {
+        this_.oOpenLayersOverlay_.getSource().clear();
+    });
+};
+
+/**
+ * Call sendQueryByEWKTGeom_ for the selected layers
+ * @param {string} EWKTGeometry
+ * @param {boolean} useTableFormat true to result in table format, false for popup
+ * @param {boolean} bOnlyChecked true if the query layers have to be the checked layers, false to query all the queryables
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByEWKTGeom = function (EWKTGeometry, useTableFormat, bOnlyChecked) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryByEWKTGeom');
+
+    var this_ = this;
+
+    this.EWKTGeometry = EWKTGeometry;
+
+    // Récupère la liste des bo interrogeables
+    var oQueryableBOs = oVmap.getMapManager().getQueryableBusinessObjects(true);
+
+    // Met le compteur de requêtes en cours au nombre de requêtes à effectuer
+    this.requestCounter_ = Object.keys(oQueryableBOs).length;
+
+    if (this.requestCounter_ > 0)
+        $('body').css({"cursor": "wait"});
+
+    // Garde en mémoire les anciennes selections pour supprimer leurs popup plus tard
+    var newSelection = goog.array.clone(this['aSelections']);
+    goog.array.extend(this.aLastSelections, newSelection);
+
+    // Supprime toutes les anciennes selections
+    this.removeSelections();
+
+    // Annule les anciennes requêtes
+    this.canceler_.resolve();
+
+    // Réinitialise canceler_
+    this.canceler_ = this.$q_.defer();
+
+    // Interroge chacune des couches de le liste
+    var oFilter, sGeomColumn
+    for (var bo_id in oQueryableBOs) {
+
+        sGeomColumn = oQueryableBOs[bo_id]['bo_geom_column'];
+        oFilter = {};
+        oFilter[sGeomColumn] = EWKTGeometry;
+
+        this.updateSelectionTable(bo_id, oFilter, sGeomColumn, {
+            warning: false
+        }).then(function (data) {
+
+            // Décrémente le compteur de requêtes
+            this_.requestCounter_--;
+
+            // Si le compteur de requêtes vaut zéro, alors on remet le curceur normal
+            if (this_.requestCounter_ === 0) {
+                $('body').css({"cursor": ""});
+            }
+
+            // Vide this.tmpSearchValues_
+            this_.tmpSearchValues_ = {};
+
+            if (this_.requestCounter_ === 0) {
+                this_.displaySelectionTable(this_['aSelections']);
+            }
+        });
+    }
+};
+
+
+// Ajout de la sélection
+
+/**
+ * Add the query result to this['aSelections'] removing the duplicate selections
+ * @param {object} opt_options
+ * @param {array<object>} opt_options.data
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {function} opt_options.callback callback to run at the end of the function
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.addQueryResult = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.addQueryResult');
+
+    var aData = goog.isDef(opt_options.data) ? opt_options.data : [];
+    var dataType = goog.isDef(opt_options.dataType) ? opt_options.dataType : null;
+    var callback = goog.isDef(opt_options.callback) ? opt_options.callback : function () {
+        return 0;
+    };
+
+    // Formatage du résultat
+    var aResult = [];
+    for (var i = 0; i < aData.length; i++) {
+        aResult.push(aData[i]);
+        if (goog.isDef(aData[i]['bo_intersect_geom'])) {
+            aResult[i]['olFeature'] = this.oSelect.extractFeatureFromData(aData[i]);
+        }
+    }
+
+    // Ajoute les résultats
+    goog.array.insertArrayAt(this['aSelections'], aResult, -1);
+
+    // supprime les doublons
+    this['aSelections'] = this.oSelect.removeDuplicateSelections(this['aSelections']);
+
+    callback.call();
+};
+
+
+// Fonctions mode popup
+
+/**
+ *
+ * @param {object} selection
+ * @private
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displaySelectionPopup = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displaySelectionPopup');
+
+    var aSelection = [selection];
+    var basicScope = angular.element($('#vmap-basicselect-tool')).scope();
+    this.oSelect.getSummaryInfos(aSelection, function (aSelection) {
+
+        if (!goog.isDefAndNotNull(aSelection[0]['olFeature'])) {
+            $.notify("L'objet n'a pas de géométrie");
+            return 0;
+        }
+        if (!goog.isDefAndNotNull(aSelection[0]['olFeature'].getGeometry())) {
+            $.notify("L'objet n'a pas de géométrie");
+            return 0;
+        }
+
+        // Sauvegarde la géométrie (pour faire re-apparaitre la popup lors de l'édition du formulaire)
+        if (goog.isDefAndNotNull(aSelection[0])) {
+            if (goog.isDefAndNotNull(aSelection[0]['olFeature'])) {
+                var olGeom = aSelection[0]['olFeature'].getGeometry();
+                var EWKTGeometry = oVmap.getEWKTFromGeom(olGeom);
+                basicScope['ctrl'].EWKTGeometry = EWKTGeometry;
+                basicScope['ctrl'].olPoint = olGeom;
+            }
+        }
+
+        oVmap.getToolsManager().getBasicTools().hideMobileMenu();
+
+        basicScope['ctrl'].centerMapOnPopup(aSelection[0]);
+        basicScope['ctrl'].replaceSelectionPopup(aSelection);
+
+        $('#select-list-modal').modal('hide');
+    });
+};
+
+
+// Fonctions mode Table
+
+/**
+ * Get the Search Form reader scope
+ * @param {strinf} bo_type bo id
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getSearchFormReaderScope = function (bo_type) {
+    return angular.element($('#select_search_form_reader_' + bo_type).children()).scope();
+};
+
+/**
+ * Get the Search Form reader scope
+ * @param {strinf} bo_type bo id
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getSearchFormReaderService = function (bo_type) {
+    var searchFormReaderService;
+    var oInjector = angular.element($('#select_search_form_reader_' + bo_type).children()).injector();
+    if (goog.isDefAndNotNull(oInjector)) {
+        searchFormReaderService = oInjector.get(["formReaderService"]);
+    }
+    return searchFormReaderService;
+};
+
+/**
+ * Display the selection on tables
+ * @param {array} aSelection
+ * @param {string|undefined} boId Tab to show
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displaySelectionTable = function (aSelection, boId) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displaySelectionTable');
+
+    var this_ = this;
+
+    this_.setBoInfos(this['aBusinessObjectsList'], function () {
+
+        oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.setBoInfos finished');
+
+        $('.select_modal_table').bootstrapTable('destroy');
+
+        setTimeout(function () {
+
+            // Initialise les formulaires de filtrage
+            for (var i = 0; i < this_['aBusinessObjectsList'].length; i++) {
+                this_.setSearchForm(this_['aBusinessObjectsList'][i]);
+            }
+
+            // Initialise les tables
+            for (var i = 0; i < this_['aBusinessObjectsList'].length; i++) {
+                $('#select_table_' + this_['aBusinessObjectsList'][i]).bootstrapTable({
+                    'data': [],
+                    'onSort': angular.bind(this_, function (bo_id, name, order) {
+                        var oFilter = this_['tableSelectionMetadata'][bo_id]['filter'];
+                        var sGeomColumn = this_['tableSelectionMetadata'][bo_id]['geom_column'];
+                        var iPage = this_['tableSelectionMetadata'][bo_id]['current_page'];
+                        if (goog.isDefAndNotNull(oFilter)) {
+                            if (goog.isDefAndNotNull(sGeomColumn)) {
+                                this.updateSelectionTable(bo_id, oFilter, sGeomColumn, {
+                                    offsetPage: goog.isDefAndNotNull(iPage) ? iPage : 1,
+                                    orderBy: name,
+                                    sortOrder: order
+                                });
+                            } else {
+                                console.error('sGeomColumn not defined');
+                            }
+                        } else {
+                            console.error('oFilter not defined');
+                        }
+                    }, this_['aBusinessObjectsList'][i])
+                });
+                if (oVmap['properties']['is_mobile']) {
+                    var toolHeight = $('#vmap-advancedselect-tool').parent().height();
+                    $('#select_table_' + this_['aBusinessObjectsList'][i]).parent().height(toolHeight - 175);
+
+                } else {
+                    $('#select_table_' + this_['aBusinessObjectsList'][i]).parent().height($('body').height() / 2);
+                }
+            }
+        }, 100);
+
+        // Télécharge (si besoin) des données correcpondantes à la liste puis rempli les tables
+        this_.oSelect.getListInfos(aSelection, function () {
+
+            // Vide l'objet
+            goog.object.clear(this_['tableSelection']);
+
+            // Met les selections dans un format convenable
+            this_['tableSelection'] = this_.formatTableSelection(aSelection);
+
+            oVmap.log("tableSelection: ", this_['tableSelection']);
+
+            setTimeout(function () {
+                for (var bo_type in this_['tableSelection']) {
+                    $('#select_table_' + bo_type).bootstrapTable('load', this_['tableSelection'][bo_type]);
+                }
+            }, 100);
+        });
+
+        // Affiche l'outil (car la modale se trouve dedans)
+        oVmap.getToolsManager().getBasicTools().showTool($('#basic-tools-dropdown-select-btn'));
+
+        setTimeout(function () {
+            // Affiche la modale
+            $('#select-list-modal').modal('show');
+            // Affiche l'onglet correspondant (si besoin)
+            this_.$scope_.$applyAsync(function () {
+                if (goog.isDefAndNotNull(boId)) {
+                    this_['sSelectedBo'] = boId;
+                } else {
+                    this_['sSelectedBo'] = oVmap.getToolsManager().getBasicTools().getSelect().getSelectedBo();
+                }
+            })
+        }, 100);
+    });
+
+};
+
+/**
+ * Complete this.oBusinessObjects
+ * @param {array} aBusinessObjectsList
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.setBoInfos = function (aBusinessObjectsList, callback) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.setBoInfos');
+
+    var this_ = this;
+    var bo_id;
+    var counter = 0;
+
+    aBusinessObjectsList = goog.isDef(aBusinessObjectsList) ? aBusinessObjectsList : [];
+    callback = goog.isDef(callback) ? callback : angular.noop;
+
+    // Supprime les bo dans oBusinessObjects non contenus dansaBusinessObjectsList
+    for (var oBusinessOject in this['oBusinessObjects']) {
+        if (aBusinessObjectsList.indexOf(oBusinessOject) === -1) {
+            delete this['oBusinessObjects'][oBusinessOject];
+        }
+    }
+
+    for (var i = 0; i < aBusinessObjectsList.length; i++) {
+
+        bo_id = aBusinessObjectsList[i];
+
+        if (goog.isDefAndNotNull(this_['oBusinessObjects'][bo_id])) {
+            counter++;
+            if (counter === aBusinessObjectsList.length) {
+                callback.call();
+            }
+            continue;
+        }
+
+        ajaxRequest({
+            'method': 'GET',
+            'url': oVmap['properties']['api_url'] + '/vmap/businessobjects/' + bo_id,
+            'headers': {
+                'Accept': 'application/x-vm-json'
+            },
+            'scope': this.$scope_,
+            'success': function (response) {
+
+                counter++;
+
+                if (!goog.isDef(response['data'])) {
+                    bootbox.alert("response['data'] undefined");
+                    return 0;
+                }
+                if (goog.isDef(response['data']['errorMessage'])) {
+                    bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+                    return 0;
+                }
+                if (!goog.isDefAndNotNull(response['data']['data'])) {
+                    console.error('Aucune valeur retournée');
+                    return 0;
+                }
+
+                var bo_id = response['data']['data'][0]['business_object_id'];
+
+                this_['oBusinessObjects'][bo_id] = response['data']['data'][0];
+
+                if (counter === aBusinessObjectsList.length) {
+                    callback.call();
+                }
+
+            },
+            'error': function (response) {
+                counter++;
+                if (counter === aBusinessObjectsList.length) {
+                    callback.call();
+                }
+                console.error(response);
+            }
+        });
+    }
+};
+
+/**
+ * Return the selection in a appropriate format
+ * @param {array} aSelection
+ * @returns {object}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.formatTableSelection = function (aSelection) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.formatTableSelection');
+
+    if (!goog.isDefAndNotNull(aSelection)) {
+        return {};
+    }
+
+    var oTableSelection = {};
+    var tmp = {};
+
+    for (var i = 0; i < aSelection.length; i++) {
+
+        // Création du type (si besoin)
+        if (!goog.object.containsKey(oTableSelection, aSelection[i]['bo_type'])) {
+            oTableSelection[aSelection[i]['bo_type']] = new Array();
+        }
+
+        if (goog.isDefAndNotNull(aSelection[i]['bo_list']))
+            tmp = goog.object.clone(aSelection[i]['bo_list']);
+
+        // Données cachées
+        tmp['bo_selection_'] = aSelection[i];
+
+        // Données à afficher
+        if (goog.isDefAndNotNull(tmp))
+            oTableSelection[aSelection[i]['bo_type']].push(tmp);
+    }
+
+    // Prévient des injections JavaScript
+    for (var bo_id in oTableSelection) {
+        for (var i = 0; i < oTableSelection[bo_id].length; i++) {
+            for (var key in oTableSelection[bo_id][i]) {
+                if (goog.isString(oTableSelection[bo_id][i][key])) {
+                    //                    oTableSelection[bo_id][i][key] = oTableSelection[bo_id][i][key].replace(/</g, "&lt;").replace(/>/g, "&gt;");
+
+                    // Recherche les liens
+                    if (oVmap.isLink(oTableSelection[bo_id][i][key], 'bo_link')) {
+                        oTableSelection[bo_id][i][key] = oVmap.parseLink(oTableSelection[bo_id][i][key], 'bo_link');
+                    }
+
+                    // Prévention d'injections XSS
+                    oTableSelection[bo_id][i][key] = oVmap['$sanitize'](oTableSelection[bo_id][i][key]);
+                }
+            }
+        }
+    }
+
+    return oTableSelection;
+};
+
+/**
+ * Set the selection table using this.oBusinessObjects and the bo_type passed in parameter
+ * @param {string} bo_type
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.setSearchForm = function (bo_type) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.setSearchForm');
+
+    var this_ = this;
+
+    // Formulaire de recherche par défaut (vide)
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'])) {
+        this['oBusinessObjects'][bo_type]['json_form'] = {};
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0] = {};
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search'] = {
+            'name': 'search-form',
+            'title': bo_type,
+            'input_size': 'xxs',
+            'nb_cols': 12,
+            'javascript': false,
+            'rows': []
+        };
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['name'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['name'] = 'search-form';
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['title'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['title'] = bo_type;
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['input_size'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['title'] = 'xxs';
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['nb_cols'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['title'] = 12;
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['javascript'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['javascript'] = false;
+    }
+    if (!goog.isDefAndNotNull(this['oBusinessObjects'][bo_type]['json_form'][0]['search']['rows'])) {
+        this['oBusinessObjects'][bo_type]['json_form'][0]['search']['rows'] = [];
+    }
+
+    // Rempli chaque formulaire de recherche correspondant
+    var oFormDefinition = this['oBusinessObjects'][bo_type]['json_form'][0];
+    var oFormValues = {
+        'search': {}
+    };
+
+    // Complémente les infos pour avoir la géométrie intersectée
+    var sGeomColumn = this['oBusinessObjects'][bo_type]['geom_column'];
+    sGeomColumn = goog.isDefAndNotNull(sGeomColumn) ? sGeomColumn : 'geom';
+
+    // Si les valeurs d'un formulaire de recherche ont étés mémorisées, elles sont incorporées
+    if (goog.isDefAndNotNull(this.tmpSearchValues_[bo_type])) {
+        oFormValues['search'] = this.tmpSearchValues_[bo_type];
+    } else {
+        oFormValues['search'][sGeomColumn] = this.EWKTGeometry;
+        oFormValues['search']['advanceddselect_use_geom'] = true;
+    }
+
+    // Champ contenant la géométrie
+    if (!oClientProperties['is_mobile']) {
+        var geomField = {
+            "fields": [{
+                    "type": "checkbox",
+                    "name": "advanceddselect_use_geom",
+                    "id": "advanceddselect_use_geom_" + bo_type,
+                    "class": "advanced-select-geom-checkbox",
+                    "nb_cols": 8
+                }, {
+                    "visibleAllTabs": true,
+                    "type": "text",
+                    "name": sGeomColumn,
+                    "label": "Activer / Désactiver la requête spatiale",
+                    "class_label": "advanced-select-geom-field-label",
+                    "disabled": false,
+                    "required": false,
+                    "nb_cols": 4
+                }
+            ]
+        };
+
+        if (!angular.equals(oFormDefinition['search']['rows'][oFormDefinition['search']['rows'].length - 2], geomField))
+            oFormDefinition['search']['rows'].push(geomField);
+
+        // Ajoute les champs dans les onglets
+        if (goog.isDefAndNotNull(oFormDefinition['search']['tabs'])) {
+            if (goog.isDefAndNotNull(oFormDefinition['search']['tabs']['list'])) {
+                for (var i = 0; i < oFormDefinition['search']['tabs']['list'].length; i++) {
+                    if (oFormDefinition['search']['tabs']['list'][i]['elements'].indexOf('advanceddselect_use_geom') === -1) {
+                        oFormDefinition['search']['tabs']['list'][i]['elements'].push('advanceddselect_use_geom');
+                    }
+                    if (oFormDefinition['search']['tabs']['list'][i]['elements'].indexOf(sGeomColumn) === -1) {
+                        oFormDefinition['search']['tabs']['list'][i]['elements'].push(sGeomColumn);
+                    }
+                }
+            }
+        }
+    }
+    // Bouton "Rechercher"
+    var buttonSearch = {
+        "fields": [{
+                "type": "button",
+                "class": "btn-ungroup btn-group-xs",
+                "nb_cols": 12,
+                "buttons": [{
+                        "visibleAllTabs": true,
+                        "id": "select_search_form_reader_" + bo_type + "_submit_buton",
+                        "type": "submit",
+                        "label": "Rechercher",
+                        "name": "form_submit",
+                        "class": "btn-primary right"
+                    }, {
+                        "visibleAllTabs": true,
+                        "id": "select_search_form_reader_" + bo_type + "_empty_buton",
+                        "type": "button",
+                        "label": "Réinitialiser",
+                        "name": "form_reinit",
+                        "class": "btn-primary right margin-sides-10",
+                        "event": function () {
+                            this_.emptySearchForm(bo_type);
+                            this_.emptySelectionTable(bo_type);
+                        }
+                    }
+                ]
+            }
+        ]
+    };
+    if (!angular.equals(oFormDefinition['search']['rows'][oFormDefinition['search']['rows'].length - 1], buttonSearch))
+        oFormDefinition['search']['rows'].push(buttonSearch);
+
+    if (goog.isDefAndNotNull(oFormDefinition['search']['tabs'])) {
+        if (goog.isDefAndNotNull(oFormDefinition['search']['tabs']['list'])) {
+            for (var i = 0; i < oFormDefinition['search']['tabs']['list'].length; i++) {
+                if (oFormDefinition['search']['tabs']['list'][i]['elements'].indexOf('form_submit') === -1) {
+                    oFormDefinition['search']['tabs']['list'][i]['elements'].push('form_submit');
+                }
+                if (oFormDefinition['search']['tabs']['list'][i]['elements'].indexOf('form_reinit') === -1) {
+                    oFormDefinition['search']['tabs']['list'][i]['elements'].push('form_reinit');
+                }
+            }
+        }
+    }
+
+    // Evènement submit
+    oFormDefinition['search']['event'] = function (oFormValuesResulted) {
+        var boValues = this_.oSelect.getFormData(oFormValuesResulted, oFormDefinition, 'search');
+
+        // Active/désactive le champ geom
+        if (goog.isDefAndNotNull(boValues['advanceddselect_use_geom'])) {
+            if (boValues['advanceddselect_use_geom'] === false) {
+                if (goog.isDefAndNotNull(boValues[sGeomColumn])) {
+                    delete boValues[sGeomColumn];
+                }
+            }
+            delete boValues['advanceddselect_use_geom'];
+        }
+
+        this_.updateSelectionTable(angular.copy(bo_type), boValues, angular.copy(sGeomColumn));
+    };
+
+    // Init le formulaire de search
+    setTimeout(function () {
+        var searchFormReaderScope = this_.getSearchFormReaderScope(bo_type);
+        var searchFormReaderService = this_.getSearchFormReaderService(bo_type);
+        if (goog.isDefAndNotNull(searchFormReaderScope)) {
+            searchFormReaderScope.$apply(function () {
+                searchFormReaderScope['ctrl']['setDefinitionName']('search');
+                searchFormReaderScope['ctrl']['setFormValues'](angular.copy(oFormValues));
+                searchFormReaderScope['ctrl']['setFormDefinition'](angular.copy(oFormDefinition));
+                searchFormReaderScope['ctrl']['loadForm']();
+            });
+        }
+
+        // Active/désactive le champ geom en fonction de la checkbox advanceddselect_use_geom
+        if (!oClientProperties['is_mobile']) {
+            searchFormReaderScope.$watch('oFormValues.search.advanceddselect_use_geom', function (newVal, oldVal, scope) {
+                if (newVal == oldVal) {
+                    return null;
+                }
+                var oGeomColumnDef = searchFormReaderService["getFormElementDefinition"](sGeomColumn, 'search', searchFormReaderScope['oFormDefinition']);
+                searchFormReaderScope.$applyAsync(function () {
+                    oGeomColumnDef['disabled'] = !newVal;
+                });
+            });
+        }
+    }, 500);
+};
+
+/**
+ *
+ * @param {string} bo_id
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.sumbitSearchForm = function (bo_id) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.sumbitSearchForm');
+    oVmap.simuleClick("select_search_form_reader_" + bo_id + "_submit_buton");
+};
+
+/**
+ * Put the search form to the initial state
+ * @param {string} bo_id
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.emptySearchForm = function (bo_id) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.emptySearchForm');
+
+    var oFormValues = {
+        'search': {}
+    };
+    var searchFormReaderScope = this.getSearchFormReaderScope(bo_id);
+    if (goog.isDefAndNotNull(searchFormReaderScope)) {
+        searchFormReaderScope.$applyAsync(function () {
+            searchFormReaderScope['ctrl']['setFormValues'](angular.copy(oFormValues));
+            searchFormReaderScope['ctrl']['loadForm']();
+        });
+    }
+};
+
+/**
+ * Put the selection table to the initial state
+ * @param {string} bo_id
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.emptySelectionTable = function (bo_id) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.emptySelectionTable');
+
+    this['tableSelection'][bo_id] = [];
+
+        // Charge les nouvelles données sur les tables
+        $('#select_table_' + bo_id).bootstrapTable('load', this['tableSelection'][bo_id]);
+
+        // Vide la sélection
+        this.removeSelections(bo_id);
+
+    // Ajoute le résultat de la requête dans la sélection
+    this.addQueryResult({
+        data: [],
+        dataType: 'list'
+    });
+
+    this['tableSelectionMetadata'][bo_id] = {
+        'total_row_number': 0,
+        'total_pages': 1,
+        'current_page': 1
+    };
+
+};
+
+/**
+ * Update the rows on the selection lists to filter by the search form
+ * @param {string} bo_id
+ * @param {string} oFilter
+ * @param {string} sGeomColumn
+ * @param {number} opt_options.offsetPage
+ * @param {number} opt_options.orderBy
+ * @param {number} opt_options.sortOrder
+ * @param {number} opt_options.limit
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.updateSelectionTable = function (bo_id, oFilter, sGeomColumn, opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.updateSelectionTable');
+
+    if (!goog.isDefAndNotNull(bo_id)) {
+        console.error('bo_id not defined or null');
+        return 0;
+    }
+
+    opt_options = goog.isDefAndNotNull(opt_options) ? opt_options : {};
+
+    var this_ = this;
+    var $scope = this.$scope_;
+    var $q = this.$q_;
+    var deferred = $q.defer();
+    var promise = deferred.promise;
+
+    var offsetPage = goog.isDefAndNotNull(opt_options.offsetPage) ? opt_options.offsetPage : 1;
+    var orderBy = goog.isDefAndNotNull(opt_options.orderBy) ? opt_options.orderBy : this['oQueryableBOs'][bo_id]['bo_id_field'];
+    var sortOrder = goog.isDefAndNotNull(opt_options.sortOrder) ? opt_options.sortOrder : 'asc';
+    var limit = goog.isDefAndNotNull(opt_options.limit) ? opt_options.limit : this['limitList_'];
+
+    this['tableSelectionMetadata'][bo_id] = {
+        'total_row_number': goog.isDefAndNotNull(this['tableSelectionMetadata'][bo_id]) ? this['tableSelectionMetadata'][bo_id]['total_row_number'] : null,
+        'total_pages': goog.isDefAndNotNull(this['tableSelectionMetadata'][bo_id]) ? this['tableSelectionMetadata'][bo_id]['total_pages'] : null,
+        'current_page': goog.isDefAndNotNull(this['tableSelectionMetadata'][bo_id]) ? this['tableSelectionMetadata'][bo_id]['current_page'] : null,
+        'order_by': goog.isDefAndNotNull(this['tableSelectionMetadata'][bo_id]) ? this['tableSelectionMetadata'][bo_id]['order_by'] : null,
+        'sort_order': goog.isDefAndNotNull(this['tableSelectionMetadata'][bo_id]) ? this['tableSelectionMetadata'][bo_id]['sort_order'] : null,
+        'filter': angular.copy(oFilter),
+        'geom_column': angular.copy(sGeomColumn)
+    };
+
+    // Récupère les données
+    this.queryBusinessObject_(bo_id, oFilter, sGeomColumn, opt_options).then(function (response) {
+
+        if (!goog.isDef(response['data'])) {
+            bootbox.alert("response['data'] undefined");
+            $scope['selectedLayerId'] = "";
+            return 0;
+        }
+        if (goog.isDef(response['data']['errorMessage'])) {
+            bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+            $scope['selectedLayerId'] = "";
+            return 0;
+        }
+        if (!goog.isDefAndNotNull(response['data']['data'])) {
+            if (opt_options.warning !== false) {
+                $.notify("Aucune valeur retournée", "warn");
+            }
+            response['data']['data'] = [];
+        }
+        if (goog.isNumber(parseFloat(response['data']['total_row_number']))) {
+            this_['tableSelectionMetadata'][bo_id] = {
+                'total_row_number': response['data']['total_row_number'],
+                'total_pages': Math.ceil(parseFloat(response['data']['total_row_number']) / parseFloat(this_['limitList_'])),
+                'current_page': offsetPage,
+                'order_by': orderBy,
+                'sort_order': sortOrder,
+                'filter': this_['tableSelectionMetadata'][bo_id]['filter'],
+                'geom_column': this_['tableSelectionMetadata'][bo_id]['geom_column']
+            };
+        }
+        this_['tableSelection'][bo_id] = this_.formatTableSelection(response['data']['data'])[bo_id];
+
+        if (!goog.isDefAndNotNull(this_['tableSelection'][bo_id])) {
+            this_['tableSelection'][bo_id] = [];
+        }
+
+        // Charge les nouvelles données sur les tables
+        for (var bo_id2 in this_['tableSelection']) {
+            $('#select_table_' + bo_id2).bootstrapTable('load', this_['tableSelection'][bo_id2]);
+        }
+
+        // Vide la sélection
+        this_.removeSelections(bo_id);
+
+        // Ajoute le résultat de la requête dans la sélection
+        this_.addQueryResult({
+            data: response['data']['data'],
+            dataType: 'list'
+        });
+
+        if (oVmap['properties']['is_mobile']) {
+            $('#vmap_menu_requeteur_menu_filtre_' + bo_id).removeClass('in');
+            $('#vmap_menu_requeteur_menu_table_' + bo_id).addClass('in');
+        }
+        deferred.resolve(response);
+    });
+    return promise;
+};
+
+/**
+ * Get the infos from the business object with ajax request
+ * @param {string} bo_id
+ * @param {string} oFilter
+ * @param {string} sGeomColumn
+ * @param {number} opt_options.offsetPage
+ * @param {number} opt_options.orderBy
+ * @param {number} opt_options.sortOrder
+ * @param {number} opt_options.limit
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.queryBusinessObject_ = function (bo_id, oFilter, sGeomColumn, opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.queryBusinessObject_');
+
+    if (!goog.isDefAndNotNull(bo_id)) {
+        console.error('bo_id not defined or null');
+        return 0;
+    }
+
+    opt_options = goog.isDefAndNotNull(opt_options) ? opt_options : {};
+
+    var $q = this.$q_;
+    var deferred = $q.defer();
+    var promise = deferred.promise;
+    var offsetPage = goog.isDefAndNotNull(opt_options.offsetPage) ? opt_options.offsetPage : 1;
+    var orderBy = goog.isDefAndNotNull(opt_options.orderBy) ? opt_options.orderBy : this['oQueryableBOs'][bo_id]['bo_id_field'];
+    var sortOrder = goog.isDefAndNotNull(opt_options.sortOrder) ? opt_options.sortOrder : 'asc';
+    var limit = goog.isDefAndNotNull(opt_options.limit) ? opt_options.limit : this['limitList_'];
+
+    oFilter = goog.isDefAndNotNull(oFilter) ? oFilter : {};
+
+    // Filtre à utiliser dans la requête
+    var sFilter = this.getAPIFilterFromObject_(oFilter, bo_id, sGeomColumn);
+
+    // Filtre à mémoriser
+    this.tmpSearchValues_[bo_id] = oFilter;
+
+    // Buffer à utiliser
+    var buffer = this.getAPIBuffer_(bo_id, oFilter[sGeomColumn]);
+
+    var url = oVmap['properties']['api_url'] + '/vmap/querys/' + bo_id + '/list';
+    var proj = this['map'].getView().getProjection().getCode().substring(5);
+
+    // Ajouter get_geom, get_image, intersect_buffer
+    var data = {
+        'filter': sFilter,
+        'intersect_geom': oFilter[sGeomColumn],
+        'result_srid': proj,
+        'get_geom': false,
+        'get_image': false,
+        'intersect_buffer': buffer,
+        'limit': limit,
+        'offset': offsetPage * limit - limit,
+        'order_by': orderBy,
+        'sort_order': sortOrder
+    };
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': url,
+        'headers': {
+            'X-HTTP-Method-Override': 'GET',
+            'Accept': 'application/x-vm-json'
+        },
+        'data': data,
+        'scope': this.$scope_,
+        'timeout': 5000,
+        'success': function (response) {
+            deferred.resolve(response);
+        }
+    });
+    return promise;
+};
+
+/**
+ * Get the API format filter
+ * @param {string} oFilter
+ * @param {string} bo_id
+ * @param {string} sGeomColumn
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getAPIFilterFromObject_ = function (oFilter, bo_id, sGeomColumn) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.getAPIFilterFromObject_');
+
+    var searchFormReaderScope = this.getSearchFormReaderScope(bo_id);
+    var searchFormReaderService = this.getSearchFormReaderService(bo_id);
+
+    var sFilter = "";
+    var i = 0;
+
+    // Crée le filter
+    var filter = {
+        'relation': 'AND',
+        'operators': []
+    };
+    var oElemDef;
+    for (var key in oFilter) {
+        // Ne tient pas compte de geom
+        if (key === sGeomColumn)
+            continue;
+
+        if (oFilter[key] === '')
+            continue;
+
+        if (goog.isDefAndNotNull(searchFormReaderScope)
+                && goog.isDefAndNotNull(searchFormReaderService)) {
+
+            oElemDef = searchFormReaderService["getFormElementDefinition"](key, 'search', searchFormReaderScope['oFormDefinition']);
+
+            if (oElemDef['type'] === 'select' || oElemDef['type'] === 'editable_select') {
+                filter['operators'].push({
+                    'column': key,
+                    'compare_operator': '=',
+                    'value': oFilter[key]
+                });
+            } else if (oElemDef['type'] === 'list') {
+                filter['operators'].push({
+                    'column': key,
+                    'compare_operator': 'IN',
+                    'value': oFilter[key].split('|')
+                });
+            } else {
+                filter['operators'].push({
+                    'column': key,
+                    'compare_operator': 'LIKE',
+                    'value': '%' + oFilter[key] + '%',
+                    'compare_operator_options': {
+                        'case_insensitive': true
+                    }
+                });
+            }
+        } else {
+            filter['operators'].push({
+                'column': key,
+                'compare_operator': 'LIKE',
+                'value': '%' + oFilter[key] + '%',
+                'compare_operator_options': {
+                    'case_insensitive': true
+                }
+            });
+        }
+        i++;
+    }
+    sFilter = JSON.stringify(filter);
+    return sFilter;
+};
+
+/**
+ * Get the query buffer
+ * @param {string} bo_id
+ * @param {string} sEWKTGeom
+ * @returns {Number}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getAPIBuffer_ = function (bo_id, sEWKTGeom) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.getAPIBuffer_');
+
+    if (!goog.isDefAndNotNull(bo_id)) {
+        return null;
+    }
+    if (!goog.isDefAndNotNull(sEWKTGeom)) {
+        return null;
+    }
+
+    var geomType = oVmap.getGeomFromEWKT(sEWKTGeom).getType();
+    var iBoBuffer = this['oQueryableBOs'][bo_id]['bo_selection_buffer'];
+
+    // Calcul du buffer
+    var buffer = this.oSelect.getRealScaleBuffer(iBoBuffer, geomType);
+    return buffer;
+};
+
+/**
+ * Add the selected elements from the table to the card
+ * @param {object} htmlTable html index from the table (ex: #select_table_0)
+ * @param {boolean} bReplace true to empty the card before adding the items
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.tableAddToCard = function (htmlTable, bReplace) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.tableAddToCard');
+
+    var tableSelection = $(htmlTable).bootstrapTable('getSelections');
+    var aSelection = [];
+    var this_ = this;
+
+    // Extrait la sélection
+    for (var i = 0; i < tableSelection.length; i++) {
+        aSelection.push(tableSelection[i]['bo_selection_']);
+    }
+
+    this.oSelect.addToCard(aSelection, bReplace);
+};
+
+/**
+ * Remove the elements selected on the table
+ * @param {object} htmlTable html index from the table (ex: #select_table_0)
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.tableDeleteSelection = function (htmlTable) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.tableDeleteSelection');
+
+    var this_ = this;
+    var tableSelection = $(htmlTable).bootstrapTable('getSelections');
+    var aSelection = [];
+
+    // Chaque élément de la table possède un attribut caché contenant sa sélection
+    for (var i = 0; i < tableSelection.length; i++) {
+        aSelection.push(tableSelection[i]['bo_selection_']);
+    }
+
+    this.oSelect.deleteMultipleObjects(aSelection, function () {
+        // Supprime de la selection en cours
+        for (var i = 0; i < aSelection.length; i++) {
+            this_.removeFromTableSelection(aSelection[i]);
+            if ($('#select-list-modal').hasClass('in')) {
+            }
+        }
+        this_.displaySelectionTable(this_['aSelections']);
+    });
+};
+
+/**
+ * Used for pagination: go to the given page
+ * @param {string} bo_id
+ * @param {number} iPage
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.goTablePage = function (bo_id, iPage) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.goTablePage');
+
+    if (!goog.isDefAndNotNull(bo_id)) {
+        console.error('bo_id not defined');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(iPage)) {
+        console.error('iPage not defined');
+        return null;
+    }
+
+    // Vérification page
+    if (iPage < 1 || iPage > this['tableSelectionMetadata'][bo_id]['total_pages']) {
+        $.notify('Impossible d\'afficher la page ' + angular.copy(iPage), 'error');
+        iPage = 1;
+    }
+
+    var oFilter = this['tableSelectionMetadata'][bo_id]['filter'];
+    var sGeomColumn = this['tableSelectionMetadata'][bo_id]['geom_column'];
+
+    if (goog.isDefAndNotNull(oFilter)) {
+        if (goog.isDefAndNotNull(sGeomColumn)) {
+            this.updateSelectionTable(bo_id, oFilter, sGeomColumn, {
+                offsetPage: iPage,
+                orderBy: this['tableSelectionMetadata'][bo_id]['order_by'],
+                sortOrder: this['tableSelectionMetadata'][bo_id]['sort_order']
+            });
+        } else {
+            console.error('sGeomColumn not defined');
+        }
+    } else {
+        console.error('oFilter not defined');
+    }
+};
+
+/**
+ * Calls goTablePage with timeout
+ * @param {string} bo_id
+ * @param {number} iPage
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.goTablePageWithTimeout = function (bo_id, iPage) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.goTablePageWithTimeout');
+
+    var this_ = this;
+    this.goTablePageWithTimeoutCounter_++;
+    var tmp = angular.copy(this.goTablePageWithTimeoutCounter_);
+    setTimeout(function () {
+        if (tmp === this_.goTablePageWithTimeoutCounter_) {
+            this_.goTablePage(bo_id, iPage);
+        }
+    }, 1000);
+};
+
+/**
+ * Export a table into a file
+ * @param {string} bo_id
+ * @param {object} htmlTable html index from the table (ex: #select_table_0)
+ * @param {string} sFormat (json, xml, csv, txt, sql, excel)
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportTable = function (bo_id, htmlTable, sFormat) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportTable');
+
+    var this_ = this;
+    var totalRowNumber = this['tableSelectionMetadata'][bo_id]['total_row_number'];
+    var aTableSelection = $(htmlTable).bootstrapTable('getSelections');
+    var oButtons = {};
+
+    aTableSelection = angular.copy(aTableSelection);
+
+    // Affichage de la modale en fonction des options
+    if (aTableSelection.length > 0) {
+        oButtons['selected_rows'] = {
+            'label': "Enregistrements sélectionnés (" + aTableSelection.length + ")",
+            'className': 'btn-primary',
+            'callback': function () {
+                if (sFormat !== 'gtf') {
+                    this_.exportSelectionElems(bo_id, aTableSelection, sFormat);
+                } else {
+                    this_.showGtfExportFormModal_({
+                        bo_id: bo_id,
+                        aTableSelection: aTableSelection,
+                        sFormat: sFormat
+                    });
+                }
+            }
+        };
+    }
+    if (totalRowNumber > 0) {
+        oButtons['all_records'] = {
+            'label': "Tous les enregistrements (" + totalRowNumber + ")",
+            'className': 'btn-primary',
+            'callback': function () {
+                if (sFormat !== 'gtf') {
+                    this_.exportAllTableElems(bo_id, sFormat);
+                } else {
+                    this_.showGtfExportFormModal_({
+                        bo_id: bo_id,
+                        oFilter: this_['tableSelectionMetadata'][bo_id]['filter'],
+                        sFormat: sFormat
+                    });
+                }
+            }
+        };
+    }
+    if (!totalRowNumber > 0 && !aTableSelection.length > 0) {
+        $.notify('Aucun enregistrement à exporter', 'error');
+        return null;
+    }
+    bootbox['dialog']({
+        'message': "<h4>Données à exporter</h4>",
+        'buttons': oButtons
+    });
+};
+
+/**
+ * Exports the given selection into the given format file
+ * @param {string} bo_id
+ * @param {array} aSelection
+ * @param {string} sFormat
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportSelectionElems = function (bo_id, aSelection, sFormat) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportSelectionElems');
+
+    if (!goog.isArray(aSelection)) {
+        return null;
+    }
+    if (!aSelection.length > 0) {
+        $.notify('Aucun enregistrement à exporter', 'error');
+    }
+
+    // suppresison de bo_selection_ qui ne sert à rien pour l'export
+    for (var i = 0; i < aSelection.length; i++) {
+        if (goog.isDefAndNotNull(aSelection[i]['bo_selection_'])) {
+            delete aSelection[i]['bo_selection_'];
+        }
+    }
+
+    if (sFormat === 'csv') {
+        alasql("SELECT * INTO CSV(" + "'" + bo_id + "." + sFormat + "'" + " ,{headers:true}) FROM ? ", [aSelection]);
+    }
+    if (sFormat === 'json') {
+        alasql("SELECT * INTO JSON(" + "'" + bo_id + "." + sFormat + "'" + " ,{headers:true}) FROM ? ", [aSelection]);
+    }
+    if (sFormat === 'xlsx') {
+        alasql("SELECT * INTO XLSX(" + "'" + bo_id + "." + sFormat + "'" + " ,{headers:true}) FROM ? ", [aSelection]);
+    }
+};
+
+/**
+ * Make an Ajax request and exports the given result into the given format file
+ * @param {string} bo_id
+ * @param {string} sFormat
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportAllTableElems = function (bo_id, sFormat) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.exportAllTableElems');
+
+    var this_ = this;
+    var oFilter = this['tableSelectionMetadata'][bo_id]['filter'];
+    var sGeomColumn = this['tableSelectionMetadata'][bo_id]['geom_column'];
+
+    if (goog.isDefAndNotNull(oFilter)) {
+        if (goog.isDefAndNotNull(sGeomColumn)) {
+            this.queryBusinessObject_(bo_id, oFilter, sGeomColumn, {
+                limit: ""
+            }).then(function (response) {
+                var aSelection = [];
+                if (goog.isDefAndNotNull(response['data'])) {
+                    if (goog.isDefAndNotNull(response['data']['data'])) {
+                        aSelection = this_.formatTableSelection(response['data']['data'])[bo_id];
+                        this_.exportSelectionElems(bo_id, aSelection, sFormat);
+                    }
+                }
+            });
+        } else {
+            console.error('sGeomColumn not defined');
+        }
+    } else {
+        console.error('oFilter not defined');
+    }
+};
+
+/**
+ * Premare and show the GTF export modal
+ * @param {object} opt_options
+ * @param {string} opt_options.bo_id
+ * @param {array} opt_options.aTableSelection
+ * @param {object} opt_options.oFilter
+ * @returns {unresolved}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.showGtfExportFormModal_ = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.showGtfExportFormModal_');
+
+    var oAPIFilter, sAPIFilter, sIntersectGeom;
+
+    var this_ = this;
+
+    // Vérifications des valeurs d'entrée
+    if (!goog.isDefAndNotNull(opt_options.bo_id)) {
+        console.error('opt_options.bo_id non défini');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(this['oQueryableBOs'][opt_options.bo_id])) {
+        console.error('opt_options.bo_id non défini');
+        return null;
+    }
+
+    // Recherche par filtre
+    var bFilterSelection = goog.isDefAndNotNull(opt_options.oFilter);
+
+    // Recherche par id
+    var bIdSelection = goog.isDefAndNotNull(opt_options.aTableSelection);
+
+    // Colonne gémétrie
+    var sGeomColumn = this['oQueryableBOs'][opt_options.bo_id]['bo_geom_column'];
+
+    // Complète oAPIFilter suivant si il s'agit d'une recherche par id où par filtre
+    if (bIdSelection) {
+        if (goog.isArray(opt_options.aTableSelection)) {
+            if (opt_options.aTableSelection.length > 0) {
+                oAPIFilter = {
+                    'relation': 'AND',
+                    'operators': [{
+                            'column': opt_options.aTableSelection[0]['bo_selection_']['bo_id_field'],
+                            'compare_operator': 'in',
+                            'value': []
+                        }]
+                };
+                for (var i = 0; i < opt_options.aTableSelection.length; i++) {
+                    oAPIFilter['operators'][0]['value'].push(opt_options.aTableSelection[i]['bo_selection_']['bo_id_value']);
+                }
+                sAPIFilter = JSON.stringify(oAPIFilter);
+            }
+        }
+    } else if (bFilterSelection) {
+        sIntersectGeom = opt_options.oFilter[sGeomColumn];
+        sAPIFilter = this.getAPIFilterFromObject_(opt_options.oFilter, opt_options.bo_id, sGeomColumn);
+    } else {
+        console.error('ni opt_options.oFilter ni opt_options.aTableSelection définis');
+        return null;
+    }
+
+    // Ajoute les informations dans this.oGTFExportAttibutes
+    this.$scope_.$applyAsync(function () {
+        this_['oGTFExportAttibutes'] = {
+            'boId': opt_options.bo_id,
+            'format': 'shape',
+            'coordsys': '2154',
+            'mails': '',
+            'filter': '',
+            'intersectGeom': null,
+            'intersectBuffer': null
+        };
+
+        if (bIdSelection) {
+            this_['oGTFExportAttibutes']['filter'] = sAPIFilter;
+        } else if (bFilterSelection) {
+            this_['oGTFExportAttibutes']['filter'] = sAPIFilter;
+            if (goog.isDefAndNotNull(sIntersectGeom)) {
+                this_['oGTFExportAttibutes']['intersectGeom'] = sIntersectGeom;
+                this_['oGTFExportAttibutes']['intersectBuffer'] = this_.getAPIBuffer_(opt_options.bo_id, sIntersectGeom);
+            }
+        }
+
+        $('#vmap-gtf-export-form-modal').modal('show');
+    });
+
+};
+
+/**
+ * Submit the GTF export
+ * @param {object} oGTFExportAttibutes
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.submitGtfExportFormModal = function (oGTFExportAttibutes) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.submitGtfExportFormModal');
+
+    $('#vmap-gtf-export-form-modal').modal('hide');
+
+    // Vérifications arguments
+    var oError = false;
+    if (!goog.isDefAndNotNull(oGTFExportAttibutes['boId'])) {
+        console.error('oGTFExportAttibutes.bo_id non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oGTFExportAttibutes['coordsys'])) {
+        console.error('oGTFExportAttibutes.coordsys non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oGTFExportAttibutes['format'])) {
+        console.error('oGTFExportAttibutes.format non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oGTFExportAttibutes['mails'])) {
+        console.error('oGTFExportAttibutes.mails non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oGTFExportAttibutes['filter'])) {
+        console.error('oGTFExportAttibutes.filter non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['vmap_export']['gtf_api_url'])) {
+        console.error('properties.vmap_export.gtf_api_url non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['vmap_export']['gtf_public_token'])) {
+        console.error('properties.vmap_export.gtf_public_token non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['vmap_export']['gtf_workspace_id'])) {
+        console.error('properties.vmap_export.gtf_workspace_id non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['vmap_export']['gtf_priority_id'])) {
+        console.error('properties.vmap_export.gtf_workspace_id non défini');
+        oError = true;
+    }
+    if (!goog.isDefAndNotNull(oVmap['properties']['vmap_export']['gtf_email_option_id'])) {
+        console.error('properties.vmap_export.gtf_workspace_id non défini');
+        oError = true;
+    }
+    if (oError) {
+        $.notify("Impossible de demander l'export", "error");
+        return null;
+    }
+
+    oGTFExportAttibutes['vmapServerApi'] = oVmap['properties']['api_url'];
+
+    // Génère un nouveau token
+    this.getTokenForGtfExport_().then(function (sToken) {
+
+        oGTFExportAttibutes['vmapUserToken'] = sToken;
+
+        var aWkParams = [];
+        for (var key in oGTFExportAttibutes) {
+            aWkParams.push(key + '=' + oGTFExportAttibutes[key]);
+        }
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': oVmap['properties']['vmap_export']['gtf_api_url'] + '/gtf/userorders',
+            'headers': {
+                'Token': oVmap['properties']['vmap_export']['gtf_public_token']
+            },
+            'data': {
+                'workspace_id': oVmap['properties']['vmap_export']['gtf_workspace_id'],
+                'priority_id': oVmap['properties']['vmap_export']['gtf_priority_id'],
+                'email_option_id': oVmap['properties']['vmap_export']['gtf_email_option_id'],
+                'wk_params': aWkParams.join('|')
+            },
+            'scope': this.$scope_,
+            'timeout': 5000,
+            'sendToken': false,
+            'success': function (response) {
+                if (!goog.isDef(response['data'])) {
+                    console.error("response['data'] undefined");
+                    $.notify("Échec lors de l'envoi de la demande", 'error');
+                    return null;
+                }
+                if (goog.isDef(response['data']['errorMessage'])) {
+                    bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+                    $.notify("Échec lors de l'envoi de la demande", 'error');
+                    return null;
+                }
+                if (goog.isDefAndNotNull(response['data']['order_id'])) {
+                    $.notify("Demande envoyée, le résultat sera renvoyé par email", "success");
+                } else {
+                    $.notify("Échec lors de l'envoi de la demande", 'error');
+                    console.error('Aucune valeur retournée');
+                    return null;
+                }
+            },
+            'error': function (response) {
+                $.notify("Échec lors de l'envoi de la demande", 'error');
+            }
+        });
+    });
+};
+
+/**
+ * Récupère un nouveau token vMap valable 24h
+ * @returns {.$q@call;defer.promise}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getTokenForGtfExport_ = function () {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.getTokenForGtfExport_');
+
+    var $q = this.$q_;
+    var deferred = $q.defer();
+    var promise = deferred.promise;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/vitis/privatetoken',
+        'data': {
+            'duration': 1440
+        },
+        'scope': this.$scope_,
+        'timeout': 5000,
+        'success': function (response) {
+            if (!goog.isDef(response['data'])) {
+                console.error("response['data'] undefined");
+                $.notify("Échec lors de l'envoi de la demande", 'error');
+                return null;
+            }
+            if (goog.isDef(response['data']['errorMessage'])) {
+                bootbox.alert(response['data']['errorType'] + ': ' + response['data']['errorMessage']);
+                $.notify("Échec lors de l'envoi de la demande", 'error');
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data']['token'])) {
+                deferred.resolve(response['data']['token']);
+            } else {
+                console.error("response['token'] undefined");
+                $.notify("Échec lors de l'envoi de la demande", 'error');
+                return null;
+            }
+        },
+        'error': function (response) {
+            $.notify("Échec lors de l'envoi de la demande", 'error');
+        }
+    });
+
+    return promise;
+};
+
+/**
+ * GTF function to encode a string to be usefull in wkparams
+ * @param {string} str
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.encoderFME_ = function (str) {
+
+    if (!goog.isString(str))
+        return str;
+    // table de correspondance
+    var caracInGTF = [" ", "=", "\r\n", "(", ")", "$", "&", "@", "°", "'", ",", "\"", "{", "}", "[", "]", "|", ";", "/", "\\", "é", "à"];
+    var caracForFME = ["<space>", "<GTF_EQUAL>", "<lf>", "<openparen>", "<closeparen>", "<dollar>", "<amp>", "<at>", "<u00b0>", "<apos>", "<comma>", "<quote>", "<opencurly>", "<closecurly>", "<openbracket>", "<closebracket>", "<GTF_PIPE>", "<semicolon>", "<solidus>", "<backslash>", "<u00e9>", "<u00e0>"];
+    //variables parcours de chaine
+    var result = str;
+    var istr = 0;
+    var iresult = 0;
+    // remplacement des <> par parcours de chaine
+    // avec vérification des mots clef
+    // et gestion des caractère unicode
+    while (istr < str.length) {
+        if (str.charAt(istr) === "<") {
+
+            var j = 0;
+            var find = false;
+            while (j < caracForFME.length && !find) {
+                var clipper = result.substr(iresult, caracForFME[j].length);
+                if (clipper === caracForFME[j]) {
+                    istr += caracForFME[j].length;
+                    iresult += caracForFME[j].length;
+                    find = true;
+                }
+                j++;
+            }
+            /*****************************/
+            //GTF_QUOTE et GTF BACKSLASH
+            /* var quote = "<GTF_QUOTE>";
+             var backslash = "<GTF_BACKSLASH>";
+
+             var clipper = result.substr(iresult, quote.length);
+             if (clipper === quote) {
+             istr += quote.length;
+             iresult += quote.length;
+             find = true;
+             }
+
+             clipper = result.substr(iresult, backslash.length);
+             console.error(result,clipper, iresult);
+             if (clipper === backslash) {
+             istr += backslash.length;
+             iresult += backslash.length;
+             find = true;
+             }
+             /*****************************/
+
+            if (!find) {
+                var part1 = result.substr(0, iresult);
+                var part2 = result.substr(iresult + 1, result.length - 1);
+                result = part1 + "<lt>" + part2;
+                iresult += 4;
+                istr += 1;
+            }
+        } else if (str.charAt(istr) === ">") {
+            var part1 = result.substr(0, iresult);
+            var part2 = result.substr(iresult + 1, result.length - 1);
+            result = part1 + "<gt>" + part2;
+            istr += 1;
+            iresult += 4;
+        } else {
+            //unicode
+            var code = str.charCodeAt(istr);
+            if (code > 127) {
+                var part1 = result.substr(0, iresult);
+                var part2 = result.substr(iresult + 1, result.length - 1);
+                var charCode = (+code).toString(16);
+
+                while (charCode.length < 4) {
+                    charCode = "0" + charCode;
+                }
+
+                result = part1 + "<u" + charCode + ">" + part2;
+                istr += 1;
+                iresult += 7;
+            } else {
+                istr += 1;
+                iresult += 1;
+            }
+            /*******************************************/
+        }
+    }
+
+    for (var j = 0; j < caracInGTF.length; j++) {
+        while (result.indexOf(caracInGTF[j]) !== - 1)
+            result = result.replace(caracInGTF[j], caracForFME[j]);
+    }
+
+    return result;
+};
+
+/**
+ *
+ * @param {type} value
+ * @param {type} row
+ * @param {type} index
+ * @returns {Array}
+ * @private
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.selectTableFormatter = function (value, row, index) {
+
+    var have_card_rights = row['bo_selection_']['have_card_rights'];
+    var have_update_rights = row['bo_selection_']['have_update_rights'];
+    var have_delete_rights = row['bo_selection_']['have_delete_rights'];
+
+    // Régule la largeur de la colonne en fonciton des droits de l'utilisateur
+    var width = 20;
+    if (have_card_rights === "true" && !oVmap['properties']['is_mobile'])
+        width += 20;
+    if (have_update_rights === "true" && !oVmap['properties']['is_mobile'])
+        width += 20;
+    if (have_delete_rights === "true" && !oVmap['properties']['is_mobile'])
+        width += 20;
+
+    var aReturn = [
+        '<div style="width: ' + width + 'px">',
+        '<a class="selection-table-popup" href="javascript:void(0)" title="Popup">',
+        '<i class="icon-comment padding-sides-5"></i>',
+        '</a>'
+    ];
+
+    if (have_card_rights === "true" && !oVmap['properties']['is_mobile']) {
+        aReturn.push('<a class="selection-table-card" href="javascript:void(0)" title="Fiche descriptive">');
+        aReturn.push('<i class="glyphicon glyphicon-file padding-sides-5"></i>');
+        aReturn.push('</a>');
+    }
+    if (have_update_rights === "true" && !oVmap['properties']['is_mobile']) {
+        aReturn.push('<a class="selection-table-edit" href="javascript:void(0)" title="Editer">');
+        aReturn.push('<i class="icon-draw padding-sides-5"></i>');
+        aReturn.push('</a>');
+    }
+    if (have_delete_rights === "true" && !oVmap['properties']['is_mobile']) {
+        aReturn.push('<a class="selection-table-delete" href="javascript:void(0)" title="Supprimer">');
+        aReturn.push('<i class="icon-trash padding-sides-5"></i>');
+        aReturn.push('</a>');
+    }
+
+    aReturn.push('</div>');
+
+    return aReturn.join('');
+};
+
+window['selectTableEvents'] = {
+    'click .selection-table-popup': function (e, value, row, index) {
+        var scope = angular.element($('#vmap-advancedselect-tool')).scope();
+        scope.$evalAsync(function () {
+            scope['ctrl'].displaySelectionPopup(row['bo_selection_']);
+        });
+    },
+    'click .selection-table-card': function (e, value, row, index) {
+        var scope = angular.element($('#vmap-advancedselect-tool')).scope();
+        scope.$evalAsync(function () {
+            scope['ctrl'].displayObjectCard(row['bo_selection_']);
+        });
+    },
+    'click .selection-table-edit': function (e, value, row, index) {
+        var scope = angular.element($('#vmap-advancedselect-tool')).scope();
+        scope.$evalAsync(function () {
+            scope['ctrl'].displayEditFrom(row['bo_selection_']);
+        });
+    },
+    'click .selection-table-delete': function (e, value, row, index) {
+        var scope = angular.element($('#vmap-advancedselect-tool')).scope();
+        scope.$evalAsync(function () {
+            scope['ctrl'].deleteObject(row['bo_selection_']);
+        });
+    }
+};
+
+
+// Foncitons Édition/consultation formReader
+
+/**
+ * Display the object card
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displayObjectCard = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displayObjectCard');
+    this.oSelect.displayObjectCard(selection);
+};
+
+/**
+ * Display the edit form
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displayEditFrom = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.displayEditFrom');
+    var this_ = this;
+    this.oSelect.displayEditFrom(selection, function () {
+        // évènement submit
+        setTimeout(function () {
+            $('#select-list-modal').modal('show');
+            this_.sumbitSearchForm(selection['bo_type']);
+        });
+    });
+};
+
+
+// Suppression
+
+/**
+ * Suggest if realy want to delete the object and call submitDeleteObject
+ * @param {object} selection
+ * @param {object} selection.bo_type
+ * @param {object} selection.bo_id_value
+ * @export
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.deleteObject = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.AdvancedSelectController.deleteObject');
+
+    var this_ = this;
+
+    this.oSelect.deleteObject(selection, function () {
+
+        // Supprime de la selection en cours
+        this_.removeFromTableSelection(selection);
+        if ($('#select-list-modal').hasClass('in')) {
+            this_.displaySelectionTable(this_['aSelections']);
+        }
+    });
+
+};
+
+
+// Utilitaires
+
+/**
+ * Remove all the selections from this['aSelections']
+ * @param {string|undefined} bo_id if defined, the function will only remove the selections witch belong the business object
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.removeSelections = function (bo_id) {
+    oVmap.log('nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.removeSelections');
+
+    // Supprime toutes les selections
+    for (var i = this['aSelections'].length - 1; i >= 0; i--) {
+        // Si bo_id est défini, supprime uniquement les selections correspondantes au bo_id
+        if (goog.isDefAndNotNull(bo_id)) {
+            if (this['aSelections'][i]['bo_type'] === bo_id)
+                goog.array.removeAt(this['aSelections'], i);
+        } else {
+            goog.array.removeAt(this['aSelections'], i);
+        }
+    }
+};
+
+/**
+ * Remove an element from this.aSelections
+ * @param {type} selection
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototype.removeFromTableSelection = function (selection) {
+
+    for (var i = this['aSelections'].length - 1; i >= 0; i--) {
+        if (angular.equals(this['aSelections'][i], selection)) {
+            this['aSelections'].splice(i, 1);
+        }
+    }
+};
+
+
+// Définit la directive et le controller
+oVmap.module.directive('appAdvancedselect', nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectDirective);
+oVmap.module.controller('AppAdvancedselectController', nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController);
diff --git a/module/javascript/app/vmap/tools/select/basicselect.js b/module/javascript/app/vmap/tools/select/basicselect.js
new file mode 100755
index 0000000000000000000000000000000000000000..f8d0af3ccdbafe8cc7ba4a165cb54767d5d7e001
--- /dev/null
+++ b/module/javascript/app/vmap/tools/select/basicselect.js
@@ -0,0 +1,897 @@
+/* global goog, nsVmap, oVmap, ol, angular, scope, bootbox, vitisApp, destructor_form */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.BasicSelect
+ * cette classe permet l'interrogation de couches
+ */
+goog.provide('nsVmap.nsToolsManager.BasicSelect');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.BasicSelect}: allow select
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect');
+};
+
+/**
+ * App-specific directive wrapping the select tools.
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppBasicselectController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/basicselect.html'
+    };
+};
+
+/**
+ * @ngInject
+ * @constructor
+ * @param {object} $scope
+ * @param {object} $timeout
+ * @param {object} $q
+ * @returns {nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController}
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController = function ($scope, $timeout, $q) {
+    oVmap.log("nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController");
+
+    var this_ = this;
+
+    /**
+     * The vMap scope
+     */
+    $scope['vmapScope'] = oVmap['scope'];
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$timeout_ = $timeout;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * Dummy canceler (use canceler.resolve() for cancel the ajax request)
+     * @private
+     */
+    this.canceler_ = $q.defer();
+
+    /**
+     * Parent element
+     */
+    this.oSelect = oVmap.getToolsManager().getBasicTools().getSelect();
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * Maximum popup mode objects
+     * @type integer
+     */
+    this.limitPopup_ = oVmap['properties']["selection"]["limit_popup"];
+
+    /**
+     * Maximum list mode objects
+     * @type integer
+     */
+    this['limitList_'] = oVmap['properties']["selection"]["limit_list"];
+
+    /**
+     * @private
+     */
+    this['allQueryables_'] = false;
+
+    /**
+     * contains the current selections
+     * @type {array}
+     */
+    this['aSelections'] = [];
+
+    /**
+     * contains the selection before
+     * @type {array}
+     */
+    this.aLastSelections = [];
+
+    /**
+     * Contains the information used by the table
+     * @type object
+     */
+    this['tableSelection'] = {};
+
+    /**
+     * The selected business object
+     */
+    this['sSelectedBo'] = '';
+
+    /**
+     * Queryable business objects
+     */
+    this['oQueryableBOs'] = {};
+
+    /**
+     * WMS queryable layers
+     */
+    this['aQueryableLayers'] = {};
+
+    /**
+     * WMS GetFeatureInfo tree
+     */
+    this['aGetFeatureInfoTree'] = {};
+
+    /**
+     * Queryable business objects list
+     */
+    this['aBusinessObjectsList'] = [];
+
+    // Rempli les bo disponibles
+    oVmap['scope'].$on('layersChanged', function () {
+        setTimeout(function () {
+            this_.setQueryableObjects();
+        });
+    });
+    setTimeout(function () {
+        this_.setQueryableObjects();
+    });
+
+    // Effectue une sélection lors d'un click sur la carte
+    this['map'].on('click', function (evt) {
+        if (oVmap.getMap().getCurrentAction() === '') {
+
+            // Modale GetFeatureInfo déjà affichée ?
+            var bGFIModalOpened = angular.copy($('#getFeatureInfo-result-window').is(":visible"));
+
+            // Re-crée la géométrie en WKT
+            var olPoint = new ol.geom.Point(evt.coordinate);
+            var EWKTGeometry = oVmap.getEWKTFromGeom(olPoint);
+
+            // Ferme les outils
+            oVmap.getToolsManager().getBasicTools().toggleOutTools();
+
+            // Interroge les couches selectionnées
+            this.queryByEWKTGeom(EWKTGeometry, olPoint);
+
+            // Interroge les couches sélectionnées par GetFeatureInfo
+            if (this['sSelectedBo'] === 'vmap_select_getfeatureinfo') {
+                this.queryGetFeatureInfo(evt.coordinate, bGFIModalOpened)
+            }
+        }
+    }, this);
+
+    // Anulle l'édition quand on change d'outil
+    oVmap['scope'].$on('toggleOutTools', function () {
+        this_.canceler_.resolve();
+    });
+
+    // Lors du click sur 'echap', annule les requêtes en cours
+    $(document).keydown(function (e) {
+        if (e.keyCode === 27) {
+            this_.canceler_.resolve();
+        }
+    });
+
+    // Vide les popups quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        this_.removePopups();
+    });
+
+    // Événement pour dire à l'appli que this_['sSelectedBo'] a changé
+    $scope.$watch('ctrl.sSelectedBo', function (oldVal, newVal) {
+        if (!goog.isString(oldVal) || !goog.isString(newVal)) {
+            return;
+        }
+        if (!oldVal.length > 0 || !newVal.length > 0) {
+            return;
+        }
+        if (oldVal === newVal) {
+            return;
+        }
+        oVmap['scope'].$broadcast('selectedBoChanged');
+    });
+};
+
+
+// Interrogation par intersection géométrique
+
+/**
+ * Call sendQueryByEWKTGeom_ for the selected layers
+ * @param {string} EWKTGeometry
+ * @param {boolean} useTableFormat true to result in table format, false for popup
+ * @param {string|undefined} sQueryBo Business object to query, this.sSelectedBo if undefined
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.queryByEWKTGeom = function (EWKTGeometry, olPoint, sQueryBo) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.queryByEWKTGeom');
+
+    var this_ = this;
+
+    // Stoque les paramètres d'interrogation
+    this.EWKTGeometry = EWKTGeometry;
+    this.olPoint = olPoint;
+
+    $('body').css({"cursor": "wait"});
+
+    // Annule les anciennes requêtes
+    this.canceler_.resolve();
+
+    // Réinitialise canceler_
+    this.canceler_ = this.$q_.defer();
+
+    // Objet métier sur lequel effectuer la selection
+    sQueryBo = goog.isDefAndNotNull(sQueryBo) ? sQueryBo : this['sSelectedBo'];
+
+    // Interroge l'objet métier sélectionné
+    if (goog.isDefAndNotNull(this['oQueryableBOs'][sQueryBo])) {
+
+        // Ajoute les filtres des couches associées
+        var sLayersFilter = this.getBOLayersFilters_(this['oQueryableBOs'][sQueryBo]);
+
+        this.oSelect.queryByEWKTGeom({
+            bo_id: sQueryBo,
+            sFilter: sLayersFilter,
+            EWKTGeometry: EWKTGeometry,
+            canceler: this.canceler_,
+            useTableFormat: false,
+            buffer: this['oQueryableBOs'][sQueryBo]['bo_selection_buffer'],
+            callback: function (data) {
+                $('body').css({"cursor": ""});
+                this_.replaceSelectionPopup(data, olPoint);
+            }
+        });
+    } else {
+        $('body').css({"cursor": ""});
+    }
+};
+
+/**
+ * Get the business object associated layers filter as a API usable string
+ * @param {object} oQueryBo
+ * @returns {String}
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.getBOLayersFilters_ = function (oQueryBo) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototypeBO.getLayersFilters_');
+
+    var oFilterValues = {};
+    var sFilter = "";
+    var filter = {
+        'relation': 'AND',
+        'operators': []
+    };
+
+    var oLayerFilter_;
+    if (goog.isArray(oQueryBo['layers'])) {
+        for (var i = 0; i < oQueryBo['layers'].length; i++) {
+            if (oQueryBo['layers'][i].get('is_bo_filtered')) {
+                oLayerFilter_ = oQueryBo['layers'][i].get('filter_values_cleared');
+                if (goog.isObject(oLayerFilter_)) {
+                    goog.object.extend(oFilterValues, oLayerFilter_);
+                }
+            }
+        }
+    }
+
+    for (var key in oFilterValues) {
+
+        if (oFilterValues[key] === '') {
+            continue;
+        }
+
+        // Tableaux (utilisés pour le IN)
+        if (goog.isArray(oFilterValues[key])) {
+
+            // Supprime les valeurs vides
+            for (var i = oFilterValues[key].length - 1; i >= 0; i--) {
+                if(oFilterValues[key][i] === ""){
+                    oFilterValues[key].splice(i, 1);
+                }
+            }
+
+            // Supprime les tableaux vides
+            if (oFilterValues[key].length === 0) {
+                continue;
+            }
+        }
+
+        filter['operators'].push({
+            'column': key,
+            'compare_operator': goog.isArray(oFilterValues[key]) ? 'IN' : '=',
+            'value': oFilterValues[key]
+        });
+    }
+    sFilter = JSON.stringify(filter);
+
+    return sFilter;
+};
+
+
+// Interrogation GetFeatureInfo
+
+/**
+ * queryGetFeatureInfo function - Lance une requête GetFeatureInfo sur les couches/calcques sélectionnés
+ *
+ * @param  {array} aCoordinate Coordonnées où a été fait le clic
+ * @param  {boolean} bGFIModalOpened Détermine si la modale GetFeatureInfo est déjà ouverte
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.queryGetFeatureInfo = function (aCoordinate, bGFIModalOpened){
+
+    var this_ = this;
+    var requestSendCounter = 0;
+    var requestResultCounter = 0;
+
+    this['aGetFeatureInfoTree'] = this.getGFITree_(aCoordinate);
+
+    for (var i = 0; i < this['aGetFeatureInfoTree'].length; i++) {
+        if (goog.isDefAndNotNull(this['aGetFeatureInfoTree'])) {
+            if (goog.isDefAndNotNull(this['aGetFeatureInfoTree'][i]['aSubLayers'])) {
+                for (var ii = 0; ii < this['aGetFeatureInfoTree'][i]['aSubLayers'].length; ii++) {
+                    if (goog.isDefAndNotNull(this['aGetFeatureInfoTree'][i]['aSubLayers'][ii]['url'])) {
+
+                        // Passe l'état en cours
+                        this['aGetFeatureInfoTree'][i]['aSubLayers'][ii]['state'] = 'loading';
+
+                        // Incrémente le compteur de requêtes parties
+                        requestSendCounter++;
+
+                        // Lance la requête
+                        ajaxRequest({
+                            'method': 'GET',
+                            'url': this['aGetFeatureInfoTree'][i]['aSubLayers'][ii]['url'],
+                            'headers': {
+                                'Accept': 'text/html'
+                            },
+                            'responseType': 'text',
+                            'ajaxLoader': true,
+                            'success': angular.bind(this, function (i, ii, response) {
+
+                                // Incrémente le compteur de requêtes recues
+                                requestResultCounter++;
+
+                                this['aGetFeatureInfoTree'][i]['aSubLayers'][ii]['state'] = 'loaded';
+                                if (goog.isString(response['data'])) {
+                                    if (response['data'].length > 0) {
+                                        this['aGetFeatureInfoTree'][i]['aSubLayers'][ii]['result'] = response['data'];
+                                        this['aGetFeatureInfoTree'][i]['have_results'] = true;
+                                    }
+                                }
+
+                                // Affiche la fenêtre resultante
+                                if (requestSendCounter === requestResultCounter) {
+                                    this.oSelect.showGetFeatureInfoResultWindow(angular.copy(this['aGetFeatureInfoTree']), aCoordinate, bGFIModalOpened);
+                                }
+
+                            }, i, ii),
+                            'error': function(){
+
+                                // Incrémente le compteur de requêtes recues
+                                requestResultCounter++;
+
+                                // Affiche la fenêtre resultante
+                                if (requestSendCounter === requestResultCounter) {
+                                    this.oSelect.showGetFeatureInfoResultWindow(angular.copy(this['aGetFeatureInfoTree']), aCoordinate, bGFIModalOpened);
+                                }
+                            }
+                        });
+                    }
+                }
+            }
+        }
+    }
+}
+
+/**
+ * getGFITree_ function - Retourne un arbre contenant les différents calques/couches avec les URL utilisés pour la sélection GetFeatureInfo
+ *
+ * @param  {array} aCoordinate Coordonnées où a été fait le clic
+ * @return {object}
+ * @private
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.getGFITree_ = function (aCoordinate){
+
+    var iViewResolution = this['map'].getView().getResolution();
+    var sProjection = this['map'].getView().getProjection().getCode();
+    var aGFITree = [];
+    var aSubLayers, oLayerNode;
+
+    for (var i = 0; i < this['aQueryableLayers'].length; i++) {
+        if (goog.isArray(this['aQueryableLayers'][i].get('queryableSublayers'))) {
+            aSubLayers = this['aQueryableLayers'][i].get('queryableSublayers');
+            if (aSubLayers.length > 0) {
+                oLayerNode = {
+                    'name': this['aQueryableLayers'][i].get('name'),
+                    'aSubLayers': []
+                }
+                for (var ii = 0; ii < aSubLayers.length; ii++) {
+                    oLayerNode['aSubLayers'].push({
+                        'name': aSubLayers[ii],
+                        'url': this['aQueryableLayers'][i].getSource().getGetFeatureInfoUrl(aCoordinate, iViewResolution, sProjection, {'INFO_FORMAT': 'text/html', 'QUERY_LAYERS': aSubLayers[ii]})
+                    });
+                }
+                aGFITree.push(oLayerNode);
+            }
+        }
+    }
+
+    return aGFITree;
+}
+
+
+// Ajout de la sélection
+
+/**
+ * Add the query result to this['aSelections'] removing the duplicate selections
+ * @param {object} opt_options
+ * @param {array<object>} opt_options.data
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {function} opt_options.callback callback to run at the end of the function
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.addQueryResult = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.addQueryResult');
+
+    var this_ = this;
+    var aData = goog.isDef(opt_options.data) ? opt_options.data : [];
+    var dataType = goog.isDef(opt_options.dataType) ? opt_options.dataType : null;
+    var callback = goog.isDef(opt_options.callback) ? opt_options.callback : function () {
+        return 0;
+    };
+
+    this.oSelect.addQueryResult({
+        data: aData,
+        selection: this['aSelections'],
+        dataType: dataType,
+        callback: function (aSelections) {
+            this_['aSelections'] = aSelections;
+            callback.call();
+        }
+    });
+};
+
+
+// Fonctions mode popup
+
+/**
+ * Replace the last popup by a new
+ * @param {array} aSelection
+ * @param {ol.geom.Point|undefined} olPoint position where to center the popup
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.replaceSelectionPopup = function (aSelection, olPoint) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.replaceSelectionPopup');
+
+    var this_ = this;
+
+    // Vérifie que la feature soit bien présente
+    for (var i = aSelection.length - 1; i >= 0; i--) {
+
+        var error = false;
+        if (!goog.isDefAndNotNull(aSelection[i]['bo_intersect_geom']) && !goog.isDefAndNotNull(aSelection[i]['olFeature'])) {
+            error = true;
+        }
+        if (goog.isDefAndNotNull(aSelection[i]['olFeature'])) {
+            if (!goog.isDefAndNotNull(aSelection[i]['olFeature'].getGeometry())) {
+                error = true;
+            }
+        }
+        if (error) {
+            $.notify("L'objet sélectionné (" + aSelection[i]['bo_id_field'] + " = " + aSelection[i]['bo_id_value'] + ") n'a pas de géométrie");
+            aSelection.splice(i, 1);
+        }
+    }
+
+    if (aSelection.length === 0) {
+        return;
+    }
+
+    // Garde en mémoire les anciennes selections pour supprimer leurs popup plus tard
+    var newSelection = goog.array.clone(this['aSelections']);
+    goog.array.extend(this.aLastSelections, newSelection);
+
+    // Supprime toutes les anciennes popup
+    this.removePopups();
+
+    // Ajoute le résultat de dans this['aSelections']
+    this_.addQueryResult({
+        data: aSelection,
+        dataType: 'summary',
+        callback: function () {
+            this_.closeSelectionPopup(this_.aLastSelections);
+            this_.displaySelectionPopup(this_['aSelections'], olPoint);
+        }
+    });
+
+};
+
+/**
+ * Display a selection of popups
+ * @param {array} aSelection
+ * @param {ol.geom.Point|undefined} olPoint position where to center the popup
+ * @private
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup = function (aSelection, olPoint) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup');
+
+    var scope = this.$scope_;
+
+    for (var i = 0; i < aSelection.length; i++) {
+
+        // Crée la nouvelle popup
+        if (goog.isDef(aSelection[i]['mapPopup']))
+            aSelection[i]['mapPopup'].remove(false);
+
+        // Si le résultat est un point, alors colle la popup sur le point
+        if (goog.isDefAndNotNull(aSelection[i]['olFeature'].getGeometry().getType)) {
+            if (aSelection[i]['olFeature'].getGeometry().getType() === 'Point') {
+                olPoint = aSelection[i]['olFeature'].getGeometry();
+            }
+        }
+
+        aSelection[i]['mapPopup'] = new nsVmap.Map.MapPopup(aSelection[i]['olFeature'], olPoint);
+
+        // Ajoute au bonton "closse" la fonction qui rend la popup unlocked quand on la ferme
+        aSelection[i]['mapPopup'].HTMLCloser_.selection = aSelection[i];
+        aSelection[i]['mapPopup'].HTMLCloser_.addEventListener('click', function () {
+            this.selection['locked'] = false;
+        }, true);
+
+        // Ajoute le bouton "édition" si have_update_rights est true
+        if (aSelection[i]['have_update_rights'] === "true" || aSelection[i]['have_update_rights'] === true) {
+            aSelection[i]['mapPopup'].HTMLEdit_ = document.createElement('a');
+            aSelection[i]['mapPopup'].HTMLEdit_.href = '#';
+            aSelection[i]['mapPopup'].HTMLEdit_.className = 'ol-popup-edit icon-draw';
+            aSelection[i]['mapPopup'].HTMLButtonsContainer_.appendChild(aSelection[i]['mapPopup'].HTMLEdit_);
+
+            // Ajoute l'interraction sur le bouton "édition"
+            aSelection[i]['mapPopup'].HTMLEdit_.scope = this.$scope_;
+            aSelection[i]['mapPopup'].HTMLEdit_.selection = aSelection[i];
+            aSelection[i]['mapPopup'].HTMLEdit_.addEventListener('click', function () {
+                var selection = this.selection;
+                scope.$apply(function () {
+                    scope['ctrl'].displayEditFrom(selection);
+                });
+            }, true);
+        }
+
+        // Ajoute le bouton "fiche descriptive" si have_card_rights est true
+        if (aSelection[i]['have_card_rights'] === "true" || aSelection[i]['have_card_rights'] === true) {
+            aSelection[i]['mapPopup'].HTMLCard_ = document.createElement('a');
+            aSelection[i]['mapPopup'].HTMLCard_.href = '#';
+            aSelection[i]['mapPopup'].HTMLCard_.className = 'ol-popup-card glyphicon glyphicon-file';
+            aSelection[i]['mapPopup'].HTMLButtonsContainer_.appendChild(aSelection[i]['mapPopup'].HTMLCard_);
+
+            // Ajoute l'interraction sur le bouton "fiche descriptive"
+            aSelection[i]['mapPopup'].HTMLCard_.scope = this.$scope_;
+            aSelection[i]['mapPopup'].HTMLCard_.selection = aSelection[i];
+            aSelection[i]['mapPopup'].HTMLCard_.addEventListener('click', function () {
+                var selection = this.selection;
+                scope.$apply(function () {
+                    scope['ctrl'].displayObjectCard(selection);
+                });
+            }, true);
+        }
+
+        // Ajout du contennu
+        aSelection[i]['mapPopup'].displayMessage('<span class="vmap-popup-title">' + this.oSelect.parseFormTile(aSelection[i]['bo_summarytitle'], aSelection[i]['bo_summary']) + '</span>');
+        aSelection[i]['mapPopup'].addMessageTable(aSelection[i]['bo_summary']);
+        if (goog.isDef(aSelection[i]['bo_image_path']))
+            aSelection[i]['mapPopup'].addPhoto(aSelection[i]['bo_image_path']);
+
+
+        // Ajoute le bouton "Modifier la géométrie" si have_update_rights = true
+        if (aSelection[i]['have_update_rights'] === "true" || aSelection[i]['have_update_rights'] === true) {
+            aSelection[i]['mapPopup'].addAction({
+                'content': '<span class="icon-polygon"></span> Modifier la géométrie',
+                'event': angular.bind(this, function(i){
+                    scope.$apply(function () {
+                        scope['ctrl'].editFeature(scope['ctrl']['aSelections'][i]);
+                    });
+                }, i)
+            });
+        }
+
+        // Ajoute le bouton "Supprimer l'objet" si have_delete_rights = true
+        if (aSelection[i]['have_delete_rights'] === "true" || aSelection[i]['have_delete_rights'] === true) {
+            aSelection[i]['mapPopup'].addAction({
+                'content': '<span class="icon-trash"></span> Supprimer l\'objet',
+                'event': angular.bind(this, function(i){
+                    scope.$apply(function () {
+                        scope['ctrl'].deleteObject(scope['ctrl']['aSelections'][i]);
+                    });
+                }, i)
+            });
+        }
+
+        // Ajoute le bouton "Ajouter au panier"
+        if (!oVmap['properties']['is_mobile']) {
+            aSelection[i]['mapPopup'].addAction({
+                'content': '<span class="icon-shopping_basket"></span> Ajouter au panier',
+                'event': angular.bind(this, function(i){
+                    scope.$apply(function () {
+                        scope['ctrl'].addToCard(scope['ctrl']['aSelections'][i]);
+                    });
+                }, i)
+            });
+        }
+
+        // Google street view
+        if (oVmap['properties']['selection']['street_view'] !== false) {
+            var geometry = aSelection[i]['olFeature'].getGeometry();
+            var pointCoords = geometry.getFirstCoordinate();
+            var proj = this['map'].getView().getProjection().getCode();
+            pointCoords = ol.proj.transform(pointCoords, proj, 'EPSG:4326');
+            var url = 'http://maps.google.com/maps?q=&layer=c&cbll=' + pointCoords[1] + ',' + pointCoords[0] + '';
+            aSelection[i]['mapPopup'].addAction({
+                'content': '<span class="icon-street-view"></span> Google Street View',
+                'event': function () {
+                    var win = window.open(url, '_blank');
+                    win.focus();
+                }
+            });
+        }
+    }
+
+    // Ajoute les résultats
+    goog.array.insertArrayAt(this['aSelections'], aSelection, -1);
+
+    // supprime les doublons
+    this['aSelections'] = this.oSelect.removeDuplicateSelections(this['aSelections']);
+};
+
+/**
+ * Center the map on a popup
+ * @param {object} selection
+ * @param {object} selection.olFeature
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.centerMapOnPopup = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.basicSelectController.centerMapOnPopup');
+
+    if (!goog.isDefAndNotNull(selection['olFeature'])) {
+        console.error("selection['olFeature'] undefined:", selection['olFeature'])
+        return 0;
+    }
+
+    var geom = selection['olFeature'].getGeometry();
+
+    if (!goog.isDefAndNotNull(geom)) {
+        console.error("selection['olFeature'].getGeometry() not defined");
+        return 0;
+    }
+
+    if (geom.getType() === 'Point') {
+        this['map'].getView().setCenter(geom.getCoordinates());
+    } else if (geom.getType() === 'MultiPoint') {
+        if (geom.getPoints().length === 1) {
+            this['map'].getView().setCenter(geom.getPoint(0).getCoordinates());
+        } else {
+            this['map'].getView().fit(geom);
+        }
+    } else {
+        this['map'].getView().fit(geom);
+    }
+
+};
+
+
+// Foncitons Édition/consultation formReader
+
+/**
+ * Display the object card
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displayObjectCard = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displayObjectCard');
+    this.oSelect.displayObjectCard(selection);
+};
+
+/**
+ * Display the edit form
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displayEditFrom = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displayEditFrom');
+    var this_ = this;
+    var sQueryBo = angular.copy(selection['bo_type']);
+    this.oSelect.displayEditFrom(selection, function () {
+        this_.queryByEWKTGeom(this_.EWKTGeometry, this_.olPoint, sQueryBo);
+    });
+};
+
+
+// Édition de la géométrie
+
+
+/**
+ * Start the geometry edition
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.editFeature = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.editFeature');
+
+    // Ferme l'ensemble des popups
+    this.closeSelectionPopup();
+
+    this.oSelect.editFeature(selection);
+};
+
+
+// Suppression
+
+/**
+ * Suggest if realy want to delete the object and call submitDeleteObject
+ * @param {object} selection
+ * @param {object} selection.bo_type
+ * @param {object} selection.bo_id_value
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.deleteObject = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.basicSelectController.deleteObject');
+
+    var this_ = this;
+
+    this.oSelect.deleteObject(selection, function () {
+
+        // Ferme les popup
+        this_.closeSelectionPopup();
+
+        // Supprime de la selection en cours
+        this_.removeFromTableSelection(selection);
+    });
+};
+
+
+// Utilitaires
+
+
+/**
+ * setQueryableBos function - Définit les Calques et objets métiers interrogeables
+ *
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.setQueryableObjects = function () {
+
+    var this_ = this;
+
+    this_.$scope_.$applyAsync(function () {
+
+        // rempli this.oQueryableBOs et aQueryableBOs
+        this_['aQueryableLayers'] = oVmap.getMapManager().getQueryableGetFeatureInfoLayers(true);
+        this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
+        this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+        this_['aBusinessObjectsList'] = Object.keys(this_['oQueryableBOs']);
+
+        // Élément sélectionné par défaut
+        if (!goog.isDefAndNotNull(this_['oQueryableBOs'][this_['sSelectedBo']])) {
+
+            var iSmallestIndex = 1000000;
+            var sFirstBo = '';
+
+            for (var bo in this_['oQueryableBOs']) {
+                if (this_['oQueryableBOs'][bo]['bo_index'] < iSmallestIndex) {
+                    iSmallestIndex = this_['oQueryableBOs'][bo]['bo_index'];
+                    sFirstBo = this_['oQueryableBOs'][bo]['bo_id'];
+                }
+            }
+            this_['sSelectedBo'] = sFirstBo;
+        }
+        if (oVmap['properties']['selection']['enable_getfeatureinfo'] === true) {
+            if (goog.isArray(this_['aQueryableLayers'])) {
+                if (this_['aQueryableLayers'].length > 0) {
+                    this_['sSelectedBo'] = 'vmap_select_getfeatureinfo';
+                }
+            }
+        }
+    });
+}
+
+/**
+ * Remove the popups and empty this['aSelections']
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.removePopups = function () {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.removePopups');
+
+    // Supprime toutes les anciennes popup
+    this.closeSelectionPopup();
+
+    // Supprime toutes les anciennes selections
+    this.removeSelections();
+};
+
+/**
+ * Remove all the selections from this['aSelections']
+ * @param {string|undefined} bo_id if defined, the function will only remove the selections witch belong the business object
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.removeSelections = function (bo_id) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.removeSelections');
+
+    // Supprime toutes les selections
+    for (var i = this['aSelections'].length - 1; i >= 0; i--) {
+
+        // Si bo_id est défini, supprime uniquement les selections correspondantes au bo_id
+        if (goog.isDefAndNotNull(bo_id)) {
+            if (this['aSelections'][i]['bo_type'] === bo_id)
+                goog.array.removeAt(this['aSelections'], i);
+        } else {
+            goog.array.removeAt(this['aSelections'], i);
+        }
+    }
+};
+
+/**
+ * Remove an element from this.aSelections
+ * @param {type} selection
+ * @returns {undefined}
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.removeFromTableSelection = function (selection) {
+
+    for (var i = this['aSelections'].length - 1; i >= 0; i--) {
+        if (angular.equals(this['aSelections'][i], selection)) {
+            this['aSelections'].splice(i, 1);
+        }
+    }
+};
+
+/**
+ * Remove the popups from aSelection or this['aSelections']
+ * @param {array|undefined} aSelection
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.closeSelectionPopup = function (aSelection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.closeSelectionPopup');
+
+    aSelection = goog.isDefAndNotNull(aSelection) ? aSelection : this['aSelections'];
+
+    for (var i = 0; i < aSelection.length; i++) {
+        if (goog.isDef(aSelection[i]['mapPopup']))
+            aSelection[i]['mapPopup'].remove();
+    }
+
+};
+
+/**
+ * Add the selected elements from the table to the card
+ * @param {object} oSelection
+ * @export
+ */
+nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.addToCard = function (oSelection) {
+    oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.tableAddToCard');
+    this.oSelect.addToCard([oSelection]);
+};
+
+
+// Définit la directive et le controller
+oVmap.module.directive('appBasicselect', nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectDirective);
+oVmap.module.controller('AppBasicselectController', nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController);
diff --git a/module/javascript/app/vmap/tools/select/select.js b/module/javascript/app/vmap/tools/select/select.js
new file mode 100755
index 0000000000000000000000000000000000000000..6a7eddf0e1b15822a8732b90e569e4e05093d0fd
--- /dev/null
+++ b/module/javascript/app/vmap/tools/select/select.js
@@ -0,0 +1,2701 @@
+/* global goog, nsVmap, oVmap, ol, angular, scope, bootbox, vitisApp, destructor_form, oUrlParams */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Select
+ * cette classe permet l'interrogation de couches
+ */
+goog.provide('nsVmap.nsToolsManager.Select');
+
+goog.require('oVmap');
+
+goog.require('nsVmap.nsToolsManager.BasicSelect');
+goog.require('nsVmap.nsToolsManager.AdvancedSelect');
+goog.require('ol.interaction.Snap');
+
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.Select}: allow selection
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Select = function () {
+
+    this.oAdvancedSelect_ = new nsVmap.nsToolsManager.AdvancedSelect();
+    this.oBasicSelect_ = new nsVmap.nsToolsManager.BasicSelect();
+};
+
+/**
+ * Query the given BO by a EWKT geometry and run the given callback with the data param
+ * @param {object} opt_options
+ * @param {boolean} opt_options.useTableFormat
+ * @param {string} opt_options.EWKTGeometry
+ * @param {string} opt_options.bo_id
+ * @param {object} opt_options.canceler
+ * @param {function} opt_options.callback
+ */
+nsVmap.nsToolsManager.Select.prototype.queryByEWKTGeom = function (opt_options) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].queryByEWKTGeom(opt_options);
+};
+
+/**
+ * Get the real scale buffer in metters
+ * @param {number} buffer
+ * @param {string} geomType
+ * @returns {Number}
+ */
+nsVmap.nsToolsManager.Select.prototype.getRealScaleBuffer = function (buffer, geomType) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getRealScaleBuffer(buffer, geomType);
+};
+
+/**
+ * Creature and return a new feature based on the geojson geometry property
+ * @param {object} data
+ * @returns {ol.Feature}
+ */
+nsVmap.nsToolsManager.Select.prototype.extractFeatureFromData = function (data) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].extractFeatureFromData(data);
+};
+
+/**
+ * Display the object card
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.displayObjectCard = function (selection) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].displayObjectCard(selection);
+};
+
+/**
+ * Display the edit form
+ * @param {object} selection
+ * @param {function|undefined} onsubmit
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.displayEditFrom = function (selection, onsubmit) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].displayEditFrom(selection, onsubmit);
+};
+
+/**
+ * Remove the duplicate values without taking care of the 'loked' item
+ * @param {array} aSelections
+ * @returns {array}
+ */
+nsVmap.nsToolsManager.Select.prototype.removeDuplicateSelections = function (aSelections) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].removeDuplicateSelections(aSelections);
+};
+
+/**
+ * Add the query result to this['aSelections'] removing the duplicate selections
+ * @param {object} opt_options
+ * @param {array<object>} opt_options.data
+ * @param {array<object>} opt_options.selection
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {function} opt_options.callback callback to run at the end of the function
+ */
+nsVmap.nsToolsManager.Select.prototype.addQueryResult = function (opt_options) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].addQueryResult(opt_options);
+};
+
+/**
+ * Download the summary infos in the selection, if the summary infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.getSummaryInfos = function (aSelection, callback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getSummaryInfos(aSelection, callback);
+};
+
+/**
+ * Download the list infos in the selection, if the list infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.getListInfos = function (aSelection, callback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getListInfos(aSelection, callback);
+};
+
+/**
+ * Download the form infos in the selection, if the form infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.getFormInfos = function (aSelection, callback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getFormInfos(aSelection, callback);
+};
+
+/**
+ * Update on database the BO values
+ * @param {string} bo_type
+ * @param {object} boValues
+ * @param {function} successCallback
+ * @param {function} errorCallback
+ */
+nsVmap.nsToolsManager.Select.prototype.updateBOValues = function (bo_type, boValues, successCallback, errorCallback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].updateBOValues(bo_type, boValues, successCallback, errorCallback);
+};
+
+/**
+ * Get the form values to send
+ * @param {object} oFormValues
+ * @param {object} oFormDefinition
+ * @param {string} sFormDefinitionName
+ * @param {array|undefined} aParamsToSave
+ * @returns {object|null}
+ */
+nsVmap.nsToolsManager.Select.prototype.getFormData = function (oFormValues, oFormDefinition, sFormDefinitionName, aParamsToSave) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getFormData(oFormValues, oFormDefinition, sFormDefinitionName, aParamsToSave);
+};
+
+/**
+ * Creates a FormData object from oValues
+ * @param {object} oValues
+ * @returns {FormData}
+ */
+nsVmap.nsToolsManager.Select.prototype.getFormDataFromValues = function (oValues) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].getFormDataFromValues(oValues);
+};
+
+/**
+ * Get the selected BO
+ * @returns {scopectrl.sSelectedBo}
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.getSelectedBo = function () {
+    var scope = angular.element($('#vmap-basicselect-tool')).scope();
+    return scope['ctrl']['sSelectedBo'];
+};
+
+/**
+ * Suggest if realy want to delete the object and call submitDeleteObject
+ * @param {object} selection
+ * @param {object} selection.bo_type
+ * @param {object} selection.bo_id_value
+ * @param {function} callback
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.deleteObject = function (selection, callback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].deleteObject(selection, callback);
+};
+
+/**
+ * Suggest if realy want to delete the objects and call submitDeleteObject
+ * @param {array<object>} aSelection
+ * @param {function} callback
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.deleteMultipleObjects = function (selection, callback) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].deleteMultipleObjects(selection, callback);
+};
+
+/**
+ * Add the selected elements from the table to the card
+ * @param {array} aSelection
+ * @param {boolean} bReplace true to empty the card before adding items
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.addToCard = function (sSelection, bReplace) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].addToCard(sSelection, bReplace);
+};
+
+/**
+ * Start the geometry edition
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.editFeature = function (selection) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].editFeature(selection);
+};
+
+/**
+ * Parse the geom title and replace the {{ }}
+ * @param {string} sFormTitle
+ * @param {object} oScope
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.parseFormTile = function (sFormTitle, oScope) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].parseFormTile(sFormTitle, oScope);
+};
+
+/**
+ *
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.clearGetFeatureInfoResult = function () {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].clearGetFeatureInfoResult();
+};
+
+/**
+ *
+ * @param {type} aGetFeatureInfoTree
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.showGetFeatureInfoResultWindow = function (aGetFeatureInfoResult, aCoordinate, bModalOpened) {
+    var scope = angular.element($('#vmap-select-tool')).scope();
+    return scope['ctrl'].showGetFeatureInfoResultWindow(aGetFeatureInfoResult, aCoordinate, bModalOpened);
+};
+
+/**
+ * App-specific directive wrapping the select tools.
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Select.prototype.selectDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Select.prototype.selectDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppSelectController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/select.html'
+    };
+};
+
+/**
+ * @ngInject
+ * @constructor
+ * @param {object} $scope
+ * @param {object} $timeout
+ * @param {object} $q
+ * @returns {nsVmap.nsToolsManager.Select.prototype.selectController}
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController = function ($scope, $timeout, $q, $element, $translate, $sce) {
+    oVmap.log("nsVmap.nsToolsManager.Select.prototype.selectController");
+
+    var this_ = this;
+
+    /**
+     * @private
+     */
+    this.$scope_ = $scope;
+
+    /**
+     * @private
+     */
+    this.$timeout_ = $timeout;
+
+    /**
+     * @private
+     */
+    this.$q_ = $q;
+
+    /**
+     * Dummy canceler (use canceler.resolve() for cancel the ajax request)
+     * @private
+     */
+    this.canceler_ = $q.defer();
+
+    /**
+     * @private
+     */
+    this.$translate_ = $translate;
+
+    /**
+     * @private
+     */
+    this.$sce_ = $sce;
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * Type de géométrie à utiliser
+     */
+    this['addPartGeomType'] = "";
+
+    /**
+     * Définit si l'échélle est dans la tranche allouée par l'objet métier
+     */
+    this['isMaxScaleOk'] = true;
+
+    /**
+     * Définit si l'échélle est dans la tranche allouée par l'objet métier
+     */
+    this['isMinScaleOk'] = true;
+
+    /**
+     * Booléen représentant l'ouverture du SnapMenu
+     */
+    this['isSnapMenuCollapse'] = false;
+
+    /**
+     * Object contenant les diverses options de snapping
+     */
+    this['snapOptions'] = {
+        'mode': 'segment_edge_node',
+        'tolerance': 15,
+        'limit': 2000,
+        'visible': false
+    };
+    if (goog.isDefAndNotNull(oVmap['properties']['snapping'])) {
+        this['snapOptions']['tolerance'] = oVmap['properties']['snapping']['defaut_tolerance'];
+        this['snapOptions']['mode'] = oVmap['properties']['snapping']['defaut_snapp_mode'];
+        this['snapOptions']['limit'] = oVmap['properties']['snapping']['defaut_limit'];
+        this['snapOptions']['visible'] = oVmap['properties']['snapping']['defaut_visibility'];
+    }
+
+    /**
+     * Object temporaire permettant l'édition des diverses options de snapping
+     */
+    this['tmpSnapOptions'] = angular.copy(this['snapOptions']);
+
+    /**
+     * Tree resulting the various GetFeatureInfo requests
+     */
+    this['aGetFeatureInfoResult'] = [];
+
+    /**
+     * The selected layer index
+     */
+    this['aGetFeatureInfoSelectedLayer'] = 0;
+
+    /**
+     * The selected sublayer index
+     */
+    this['aGetFeatureInfoSelectedSubLayer'] = 0;
+
+    /**
+     * The number of layers witch have results on GetCapabilities
+     */
+    this['iGetFeatureInfoWithResultLayers'] = 0;
+
+    /**
+     * The number of layers witch not have results on GetCapabilities
+     */
+    this['iGetFeatureInfoWithoutResultLayers'] = 0;
+
+    /**
+     * Maximum popup mode objects
+     * @type integer
+     */
+    this.limitPopup_ = oVmap['properties']["selection"]["limit_popup"];
+
+    /**
+     * Maximum list mode objects
+     * @type integer
+     */
+    this.limitList_ = oVmap['properties']["selection"]["limit_list"];
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOverlayLayer_ = oVmap.getMap().addVectorLayer({
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(255, 255, 255, 0.6)'
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#319FD3',
+                width: 2
+            }),
+            image: new ol.style.Circle({
+                radius: 7,
+                fill: new ol.style.Fill({
+                    color: '#319FD3'
+                })
+            })
+        })
+    });
+
+    /**
+     * @type {ol.Collection}
+     * @private
+     */
+    this.oOverlayFeatures_ = this.oOverlayLayer_.getSource().getFeaturesCollection();
+
+    /**
+     * Overlay contenant les trous des polygones (invisible)
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oOverlayHolesLayer_ = oVmap.getMap().addVectorLayer({
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(0, 0, 0, 0.2)'
+            })
+        })
+    });
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oSnapOverlayLayer_ = new ol.layer.Vector({
+        map: oVmap.getMap().getOLMap(),
+        visible: false,
+        source: new ol.source.Vector({
+            useSpatialIndex: false
+        }),
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(255, 255, 255, 0.2)'
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#1000ff',
+                width: 2
+            }),
+            image: new ol.style.Circle({
+                radius: 3,
+                fill: new ol.style.Fill({
+                    color: '#1000ff'
+                })
+            })
+        }),
+    });
+
+    /**
+     * @type {ol.interaction.Snap}
+     * @private
+     */
+    this.snap_ = new ol.interaction.Snap({
+        vertex: true,
+        edge: (this['snapOptions']['mode'] === 'segment_edge_node' ? true : false),
+        pixelTolerance: this['snapOptions']['tolerance'],
+        source: this.oSnapOverlayLayer_.getSource()
+    });
+
+    /**
+     * @type {ol.layer.Vector}
+     * @private
+     */
+    this.oGetFeatureInfoOverlay_ = new ol.layer.Vector({
+        map: oVmap.getMap().getOLMap(),
+        source: new ol.source.Vector({
+            useSpatialIndex: false
+        }),
+        style: new ol.style.Style({
+            fill: new ol.style.Fill({
+                color: 'rgba(255, 255, 255, 0.2)'
+            }),
+            stroke: new ol.style.Stroke({
+                color: '#1000ff',
+                width: 2
+            }),
+            image: new ol.style.Circle({
+                radius: 5,
+                fill: new ol.style.Fill({
+                    color: '#1000ff'
+                })
+            })
+        }),
+    });
+
+    /**
+     * @type {ol.interaction.Modify}
+     * @private
+     */
+    this.modify_ = new ol.interaction.Modify({
+        features: this.oOverlayFeatures_
+    });
+
+    this.modify_.on('modifyend', function () {
+        setTimeout(function () {
+            this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
+        });
+    });
+
+    /**
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.delete_ = new ol.interaction.Select({
+        layers: [this.oOverlayLayer_]
+    });
+
+    // Supprime la feature lors de la sélection sur l'interaction this.delete_
+    this.delete_.on('select', function () {
+        var aSelectedFeatures = this.delete_.getFeatures().getArray();
+        for (var i = 0; i < aSelectedFeatures.length; i++) {
+            this.oOverlayLayer_.getSource().removeFeature(aSelectedFeatures[i]);
+        }
+        this.delete_.getFeatures().clear();
+        setTimeout(function () {
+            this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
+        });
+    }, this);
+
+    /**
+     * Outil de suppression de trous
+     * @type {ol.interaction.Select}
+     * @private
+     */
+    this.deleteHole_ = new ol.interaction.Select({
+        layers: [this.oOverlayHolesLayer_]
+    });
+
+    // Supprime du trou de la feature (si il existe) feature lors de la sélection sur l'interaction this.deleteHole_
+    this.deleteHole_.on('select', this.deleteHole, this);
+
+    // Anulle l'édition quand on change d'outil
+    oVmap['scope'].$on('toggleOutTools', function () {
+        this_.clearOverlays();
+        this_.canceler_.resolve();
+    });
+
+    // Zoom sur les objets passés dans l'url
+    if (goog.isString(oUrlParams['bo_id']) && goog.isString(oUrlParams['ids'])) {
+        if (oUrlParams['bo_id'].length > 0 && oUrlParams['ids'].length > 0) {
+            setTimeout(function () {
+
+                var oBusinessObjects = oVmap.getMapManager().getQueryableBusinessObjects();
+
+                if (goog.isDefAndNotNull(oBusinessObjects[oUrlParams['bo_id']])) {
+
+                    var aSelection = [];
+                    var aIds = oUrlParams['ids'].split('|');
+
+                    for (var i = 0; i < aIds.length; i++) {
+                        aSelection.push({
+                            'bo_type': oUrlParams['bo_id'],
+                            'bo_id_value': aIds[i],
+                            'bo_id_field': oBusinessObjects[oUrlParams['bo_id']]['bo_id_field'],
+                            'bo_title': oBusinessObjects[oUrlParams['bo_id']]['bo_title']
+                        });
+                    }
+
+                    if (aSelection.length > 0) {
+                        this_.addToCard(aSelection, true);
+                    }
+                }
+            });
+        }
+    }
+
+    // Á chaque fois qui l'utilisateur finit de bouger la carte
+    oVmap.getMap().getOLMap().on('moveend', function () {
+        // Vérifie si l'échelle d'édition est bonne
+        this_.checkEditionScale();
+        // Lance la fonction de rechargement
+        this_.loadVectorSnappingData();
+    });
+
+    // Rempli les bo disponibles
+    oVmap['scope'].$on('layersChanged', function () {
+        this_.checkEditionScale();
+        this_.loadQueryableBos();
+        this_.closeGetFeatureInfoResultWindow();
+    });
+    oVmap['scope'].$on('selectedBoChanged', function () {
+        this_.checkEditionScale();
+        this_.loadQueryableBos();
+    });
+    setTimeout(function () {
+        this_.loadQueryableBos();
+    });
+
+    // Affiche les modales en plein écran pour la version mobile
+    if (oVmap['properties']['is_mobile']) {
+        $element.find('.modal').on('shown.bs.modal', function () {
+            $('.modal-backdrop.fade.in').hide();
+            $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+        });
+    }
+
+    // Permet de savoir si on est en modification (clic soutenu)
+    this.isModifying_ = false;
+    this.modify_.on('modifyend', function () {
+        this_.isModifying_ = false;
+        this_.checkEditionScale();
+    });
+    this.modify_.on('modifystart', function () {
+        this_.isModifying_ = true;
+    });
+
+    // Fornction permettant de trier la liste des couches d'un calque dans le fenêtre oGetFeatureInfo
+    $scope['sortGetFeatureInfoSubLayers'] = function(oSubLayer) {
+        if (oSubLayer['index'] === this_['aGetFeatureInfoSelectedSubLayer'] && $scope['collapseSublayersTabs'] === true) {
+            return -1;
+        }
+        return oSubLayer['index'];
+    }
+};
+
+/**
+ * Charge la liste des objets métier
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadQueryableBos = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.selectController.loadQueryableBos');
+    var this_ = this;
+
+    this_.$scope_.$applyAsync(function () {
+        setTimeout(function () {
+            this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+
+            // Snapping
+            for (var i = 0; i < this_['aQueryableBOs'].length; i++) {
+                this_['aQueryableBOs'][i]['loadCanceller'] = this_.$q_.defer();
+                this_['aQueryableBOs'][i]['isMouseOverSnaoMenuOb'] = false;
+                this_['aQueryableBOs'][i]['bo_snapping_loaded'] = null;
+                if (this_['aQueryableBOs'][i]['bo_id'] === oVmap.getToolsManager().getBasicTools().getSelect().getSelectedBo()) {
+                    this_['aQueryableBOs'][i]['bo_snapping_enabled'] = true;
+                } else {
+                    this_['aQueryableBOs'][i]['bo_snapping_enabled'] = false;
+                }
+            }
+
+            // Mobile: cache le bouton "Insertion" si aucun bo est insertable
+            if (goog.isDefAndNotNull(this_['aQueryableBOs'])) {
+                if (oVmap['properties']['is_mobile']) {
+                    if (this_['aQueryableBOs'].length > 0) {
+                        $('#vmap_menu_mobile_menu_requeteur_button').show();
+                    } else {
+                        $('#vmap_menu_mobile_menu_requeteur_button').hide();
+                    }
+
+                    //Modifie la taille de la liste des objets métiers pour ne pas qu'elle soit trop large
+                    angular.element("#select-bo-select")[0].style["width"] = "23vw";
+                }
+            }
+        });
+    });
+};
+
+/**
+ * Vérifie que l'échelle en cours respecte les spécification de l'objet métier
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.checkEditionScale = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.selectController.checkEditionScale');
+
+    if (!goog.isDefAndNotNull(this['aQueryableBOs'])) {
+        return;
+    }
+
+    var oBo;
+    for (var i = 0; i < this['aQueryableBOs'].length; i++) {
+        if (this['aQueryableBOs'][i]['bo_id'] === oVmap.getToolsManager().getBasicTools().getSelect().getSelectedBo()) {
+            oBo = this['aQueryableBOs'][i];
+            break;
+        }
+    }
+
+    if (!goog.isDefAndNotNull(oBo)) {
+        return;
+    }
+
+    var maxScale = oBo['bo_max_edition_scale'];
+    var minScale = oBo['bo_min_edition_scale'];
+
+    if (this['currentAction'] === 'basicTools-select-editFeature') {
+        if (goog.isDefAndNotNull(minScale)) {
+            minScale = parseFloat(minScale);
+            if (oVmap.getMap().getScale() < minScale && !this.isModifying_) {
+                oVmap.getMap().getMapTooltip().displayMessage('Échelle minimale de saisie atteinte, dé-zoomez pour continuer l\'édition');
+                this['isMinScaleOk'] = false;
+                this.modify_.setActive(false);
+            } else {
+                this['isMinScaleOk'] = true;
+            }
+        }
+        if (goog.isDefAndNotNull(maxScale)) {
+            maxScale = parseFloat(maxScale);
+            if (oVmap.getMap().getScale() > maxScale && !this.isModifying_) {
+                oVmap.getMap().getMapTooltip().displayMessage('Échelle maximale de saisie atteinte, zoomez pour continuer l\'édition');
+                this['isMaxScaleOk'] = false;
+                this.modify_.setActive(false);
+            } else {
+                this['isMaxScaleOk'] = true;
+            }
+        }
+        if (this['isMinScaleOk'] && this['isMaxScaleOk']) {
+            if (!this.modify_.getActive()) {
+                this.modify_.setActive(true);
+            }
+            if (this.modify_.getActive()) {
+                oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur la géométrie pour la modifier');
+            }
+        }
+    }
+};
+
+/**
+ * Query the given BO by a EWKT geometry and run the given callback with the data param
+ * @param {object} opt_options
+ * @param {boolean} opt_options.useTableFormat
+ * @param {string} opt_options.EWKTGeometry
+ * @param {string} opt_options.sFilter
+ * @param {string} opt_options.bo_id
+ * @param {object} opt_options.canceler
+ * @param {function} opt_options.callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.queryByEWKTGeom = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.queryByEWKTGeom');
+
+    var this_ = this;
+
+    if (!goog.isDefAndNotNull(opt_options)) {
+        return;
+    }
+    if (!goog.isDefAndNotNull(opt_options.useTableFormat)) {
+        console.error('opt_options.useTableFormat not defined');
+        return;
+    }
+    if (!goog.isDefAndNotNull(opt_options.EWKTGeometry)) {
+        console.error('opt_options.EWKTGeometry not defined');
+        return;
+    }
+    if (!goog.isDefAndNotNull(opt_options.bo_id)) {
+        console.error('opt_options.bo_id not defined');
+        return;
+    }
+    if (!goog.isDefAndNotNull(opt_options.canceler)) {
+        console.error('opt_options.canceler not defined');
+        return;
+    }
+    if (!goog.isDefAndNotNull(opt_options.callback)) {
+        console.error('opt_options.callback not defined');
+        return;
+    }
+
+    // Si on est en mode tableFormat, alors on ne demande pas la géométrie
+    var get_geom = !opt_options.useTableFormat;
+
+    // Type de résultat: list ou summary
+    var formType = opt_options.useTableFormat === true ? 'list' : 'summary';
+
+    // Projection en cours
+    var srid = this['map'].getView().getProjection().getCode().substring(5);
+
+    // Récupère le type de géométrie
+    var geomType = oVmap.getGeomFromEWKT(opt_options.EWKTGeometry).getType();
+
+    // Calcul du buffer
+    var buffer = this.getRealScaleBuffer(opt_options.buffer, geomType);
+
+    // Limite de features
+    if (opt_options.useTableFormat === true)
+        var limit = this.limitList_;
+    else
+        var limit = this.limitPopup_;
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/vmap/querys/' + opt_options.bo_id + '/' + formType,
+        'headers': {
+            'X-HTTP-Method-Override': 'GET',
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'filter': opt_options.sFilter,
+            'intersect_geom': opt_options.EWKTGeometry,
+            'intersect_buffer': buffer,
+            'get_geom': get_geom,
+            'get_image': get_geom,
+            'result_srid': srid,
+            'limit': limit,
+            'd': Date.now()
+        },
+        'scope': this.$scope_,
+        'abord': opt_options.canceler.promise,
+        'success': function (response) {
+
+            // Si le opt_options.canceler à été resolved (on a appuillé sur echap ou on à lancé une autre requête)
+            if (opt_options.canceler.promise['$$state'].status === 1)
+                return 0;
+
+            // Résultat vide par défaut, il faut passer par addQueryResult même en cas de résultat vide
+            var data = [];
+
+            // Vérifie si il y a des données à afficher et les ajoute
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['data'])) {
+                    data = response['data']['data'];
+                } else {
+                    oVmap.log('Pas de données à afficher');
+                }
+            } else {
+                oVmap.log('Pas de données à afficher');
+            }
+
+            if (data.length === this_.limitList_)
+                $.notify("Limite d'objets à afficher atteinte", "warn");
+
+            opt_options.callback.call(this, data);
+        }
+    });
+};
+
+/**
+ * Get the real scale buffer in metters
+ * @param {number} buffer
+ * @param {string} geomType
+ * @returns {Number}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getRealScaleBuffer = function (buffer, geomType) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getRealScaleBuffer');
+
+    if (!goog.isDefAndNotNull(buffer)) {
+        return null;
+    }
+    if (!goog.isDefAndNotNull(geomType)) {
+        return null;
+    }
+
+    var iAPIBuffer = null;
+    if (geomType === 'Point' || geomType === 'MultiPoint') {
+        if (goog.isDefAndNotNull(buffer)) {
+            var scale = oVmap.getMap().getScale();
+            iAPIBuffer = (buffer * scale) / 1000;
+        }
+    }
+    return iAPIBuffer;
+};
+
+/**
+ * Creature and return a new feature based on the geojson geometry property
+ * @param {object} data
+ * @returns {ol.Feature}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.extractFeatureFromData = function (data) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.extractFeatureFromData');
+
+    // Récupère la géométrie
+    var geom = oVmap.getGeomFromEWKT(data['bo_intersect_geom']);
+    var feature = new ol.Feature({
+        geometry: geom
+    });
+
+    return feature;
+};
+
+/**
+ * Get the BasicSelect scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getBasicSelectScope = function () {
+    return angular.element($('#vmap-basicselect-tool')).scope();
+};
+
+/**
+ * Get the AdvancedSelect scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getAdvancedSelectScope = function () {
+    return angular.element($('#vmap-advancedselect-tool')).scope();
+};
+
+/**
+ * Get the Display Form reader scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getDisplayFormReaderScope = function () {
+    return angular.element($('#select_display_form_reader').children()).scope();
+};
+
+/**
+ * Get the Edit Form reader scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getEditFormReaderScope = function () {
+    return angular.element($('#select_edit_form_reader').children()).scope();
+};
+
+/**
+ * Display the object card
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.displayObjectCard = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.displayObjectCard');
+
+    var this_ = this;
+
+    if (selection['bo_title'].length === 0)
+        return 0;
+
+    this['editSelection'] = selection;
+
+    // Récupere les informations du formuaire
+    this_.getFormInfos([selection], function (data) {
+
+        selection = data[0];
+
+        var oFormDefinition = selection['bo_json_form'];
+
+        var oFormValues = {
+            "update": goog.object.clone(selection['bo_form']),
+            "display": goog.object.clone(selection['bo_form'])
+        };
+
+        oVmap.log('oFormValues: ', oFormValues);
+        oVmap.log('oFormDefinition: ', oFormDefinition);
+
+        var displayFormReaderScope = this_.getDisplayFormReaderScope();
+        displayFormReaderScope.$evalAsync(function () {
+
+            var loadForm = function () {
+                // Set le formulaire
+                displayFormReaderScope['ctrl']['setDefinitionName']('display');
+                displayFormReaderScope['ctrl']['setFormValues'](oFormValues);
+                displayFormReaderScope['ctrl']['setFormDefinition'](oFormDefinition);
+
+                displayFormReaderScope.$applyAsync(function () {
+                    displayFormReaderScope['ctrl']['loadForm']();
+                    $('#select-card-modal').modal('show');
+                });
+            };
+
+            // Tente de lancer destructor_form
+            try {
+                if (goog.isDef(destructor_form)) {
+                    destructor_form();
+                }
+            } catch (e) {
+                oVmap.log("destructor_form does not exist");
+            }
+
+            // Chargement des js associés au bo
+            if (goog.isDefAndNotNull(selection['bo_json_form_js'])) {
+                var sUrl = selection['bo_json_form_js'];
+                oVmap.log("initHtmlForm : javascript assoc. to : " + sUrl);
+                loadExternalJs([sUrl], {
+                    "callback": function () {
+                        loadForm();
+                        try {
+                            if (goog.isDef(constructor_form)) {
+                                constructor_form(displayFormReaderScope, sUrl);
+                            }
+                        } catch (e) {
+                            oVmap.log("constructor_form does not exist");
+                        }
+                    },
+                    "async": true,
+                    "scriptInBody": true
+                });
+            } else {
+                loadForm();
+            }
+        });
+    });
+};
+
+/**
+ * Display the edit form
+ * @param {object} selection
+ * @param {function|undefined} onsubmit
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.displayEditFrom = function (selection, onsubmit) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.displayEditFrom');
+
+    var this_ = this;
+
+    if (selection['bo_title'].length === 0)
+        return 0;
+
+    this['editSelection'] = selection;
+
+    // Récupere les informations du formuaire
+    this_.getSummaryInfos([selection], function (aSelection) {
+        this_.getFormInfos(aSelection, function (aSelection) {
+
+            selection = aSelection[0];
+
+            var oFormDefinition = selection['bo_json_form'];
+            var oFormValues = {
+                "update": goog.object.clone(selection['bo_form']),
+                "display": goog.object.clone(selection['bo_form'])
+            };
+
+            // Bouton submit
+            var button = {
+                "fields": [{
+                        "type": "button",
+                        "class": "btn-ungroup btn-group-sm",
+                        "nb_cols": 12,
+                        "buttons": [{
+                                "visibleAllTabs": true,
+                                "type": "submit",
+                                "label": "FORM_UPDATE",
+                                "name": "form_submit",
+                                "class": "btn-primary hidden",
+                                "id": "basictools-select-form-reader-submit-btn"
+                            }
+                        ]
+                    }
+                ]
+            };
+            if (!angular.equals(oFormDefinition['update']['rows'][oFormDefinition['update']['rows'].length - 1], button))
+                oFormDefinition['update']['rows'].push(button);
+
+            // Evènement submit
+            oFormDefinition['update']['event'] = function (oFormValuesResulted) {
+
+                $('#select_edit_form_reader').find('button').attr('disabled', true);
+                showAjaxLoader();
+
+                // Paramètres peut être non fournis dans le formulaire à sauvegarger
+                var aParamsToSave = [selection['bo_id_field']];
+                if (goog.isDefAndNotNull(this_['editableSelection'])) {
+                    if (goog.isDefAndNotNull(this_['editableSelection']['geom_column'])) {
+                        aParamsToSave.push(this_['editableSelection']['geom_column']);
+                    }
+                }
+
+                var boValues = this_.getFormData(oFormValuesResulted, oFormDefinition, 'update', aParamsToSave);
+
+                selection['bo_form'] = boValues;
+
+                this_.updateBOValues(selection['bo_type'], boValues, function () {
+                    $('#select-edit-modal').modal('hide');
+                    $('#select_edit_form_reader').find('button').attr('disabled', false);
+                    this_.clearOverlays();
+                    if (goog.isDefAndNotNull(onsubmit)) {
+                        onsubmit.call(this, boValues);
+                    }
+                }, function () {
+                    $('#select-edit-modal').modal('hide');
+                    $('#select_edit_form_reader').find('button').attr('disabled', false);
+                    this_.clearOverlays();
+                    if (goog.isDefAndNotNull(onsubmit)) {
+                        onsubmit.call(this, boValues);
+                    }
+                });
+
+            };
+
+
+            var editFormReaderScope = this_.getEditFormReaderScope();
+            editFormReaderScope.$evalAsync(function () {
+
+                var loadForm = function () {
+                    // Set le formulaire
+                    editFormReaderScope['ctrl']['setDefinitionName']('update');
+                    editFormReaderScope['ctrl']['setFormValues'](oFormValues);
+                    editFormReaderScope['ctrl']['setFormDefinition'](oFormDefinition);
+
+                    editFormReaderScope.$applyAsync(function () {
+                        editFormReaderScope['ctrl']['loadForm']();
+                        $('#select-edit-modal').modal('show');
+                    });
+                };
+
+                // Tente de lancer destructor_form
+                try {
+                    if (goog.isDef(destructor_form)) {
+                        destructor_form();
+                    }
+                } catch (e) {
+                    oVmap.log("destructor_form does not exist");
+                }
+
+                // Chargement des js associés au bo
+                if (goog.isDefAndNotNull(selection['bo_json_form_js'])) {
+                    var sUrl = selection['bo_json_form_js'];
+                    oVmap.log("initHtmlForm : javascript assoc. to : " + sUrl);
+                    loadExternalJs([sUrl], {
+                        "callback": function () {
+                            loadForm();
+                            try {
+                                if (goog.isDef(constructor_form)) {
+                                    constructor_form(editFormReaderScope, sUrl);
+                                }
+                            } catch (e) {
+                                oVmap.log("constructor_form does not exist");
+                            }
+                        },
+                        "async": true,
+                        "scriptInBody": true
+                    });
+                } else {
+                    loadForm();
+                }
+            });
+        });
+    });
+};
+
+/**
+ * Download the summary infos in the selection, if the summary infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getSummaryInfos = function (aSelection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getSummaryInfos');
+    this.complementDataOnSelection({
+        aSelection: aSelection,
+        dataType: 'summary',
+        callback: callback
+    });
+};
+
+/**
+ * Download the list infos in the selection, if the list infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getListInfos = function (aSelection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getListInfos');
+    this.complementDataOnSelection({
+        aSelection: aSelection,
+        dataType: 'list',
+        callback: callback
+    });
+};
+
+/**
+ * Download the form infos in the selection, if the form infos is already present it will not downloaded
+ * @param {array} aSelection
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormInfos = function (aSelection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormInfos');
+    this.complementDataOnSelection({
+        aSelection: aSelection,
+        dataType: 'form',
+        callback: callback
+    });
+};
+
+/**
+ * Complete data on the dataType param off the selection, the request is maked by the business_object_id. If the param already exists the data is not erased
+ * @param {object} opt_options
+ * @param {array} opt_options.aSelection
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {object} opt_options.complementParams params to add on the http request
+ * @param {function} opt_options.callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.complementDataOnSelection = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.complementDataOnSelection');
+
+    var aSelection = goog.isDef(opt_options.aSelection) ? opt_options.aSelection : [];
+    var dataType = goog.isDef(opt_options.dataType) ? opt_options.dataType : null;
+    var complementParams = goog.isDef(opt_options.complementParams) ? opt_options.complementParams : {};
+    var callback = goog.isDef(opt_options.callback) ? opt_options.callback : function () {
+        return 0;
+    };
+
+    // Récupère la liste des bo
+    var aBusinessObjects = [];
+    for (var i = 0; i < aSelection.length; i++) {
+        goog.array.binaryInsert(aBusinessObjects, aSelection[i]['bo_type']);
+    }
+
+    // Met à jour le compteur de requêtes
+    this.requestCounter_ = goog.isNumber(this.requestCounter_) ? this.requestCounter_ : 0;
+    this.requestCounter_ += aBusinessObjects.length;
+
+    if (aBusinessObjects.length > 0)
+        showAjaxLoader();
+
+    var tmpSelection = [];
+
+    for (var i = 0; i < aBusinessObjects.length; i++) {
+        goog.array.clear(tmpSelection);
+
+        // Récupère la liste des selections par couche
+        for (var ii = 0; ii < aSelection.length; ii++) {
+            if (aSelection[ii]['bo_type'] === aBusinessObjects[i])
+                tmpSelection.push(aSelection[ii]);
+        }
+
+        this.complementDataOnSelection2_({
+            aSelection: goog.array.clone(tmpSelection),
+            bo_type: aBusinessObjects[i],
+            dataType: dataType,
+            complementParams: complementParams,
+            callback: callback
+        });
+
+    }
+};
+
+/**
+ * Add the data on the dataType param off the selection, if the param already exists the data is not erased
+ * @param {object} opt_options
+ * @param {array} opt_options.aSelection
+ * @param {string} opt_options.bo_type
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {object} opt_options.complementParams params to add on the http request
+ * @param {function} opt_options.callback
+ * @private
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.complementDataOnSelection2_ = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.complementDataOnSelection2_');
+
+    var aSelection = goog.isDef(opt_options.aSelection) ? opt_options.aSelection : [];
+    var dataType = goog.isDef(opt_options.dataType) ? opt_options.dataType : null;
+    var complementParams = goog.isDef(opt_options.complementParams) ? opt_options.complementParams : {};
+    var callback = goog.isDef(opt_options.callback) ? opt_options.callback : function () {
+        return 0;
+    };
+
+    var this_ = this;
+
+    // Construction du filtre
+    var filter = {
+        'relation': 'OR',
+        'operators': []
+    };
+    for (var i = 0; i < aSelection.length; i++) {
+        if (!goog.isDef(aSelection[i]['bo_' + dataType])) {
+            filter['operators'].push({
+                'column': aSelection[i]['bo_id_field'].replace(/\./g, '"."'),
+                'compare_operator': '=',
+                'value': aSelection[i]['bo_id_value']
+            });
+        }
+    }
+
+    // Projection en cours
+    var proj = this['map'].getView().getProjection().getCode().substring(5);
+
+    // url de la requête
+    if (goog.isDef(opt_options.bo_type)) {
+        var url = oVmap['properties']['api_url'] + '/vmap/querys/' + opt_options.bo_type + '/' + dataType;
+    } else {
+        console.error('opt_options.bo_type not defined');
+        return 0;
+    }
+
+    var params = {
+        'result_srid': proj,
+        'limit': 200
+    };
+
+    // Si on demande un type summary, alors on demande la geom
+    if (dataType === 'summary') {
+        params['get_geom'] = true;
+        params['get_image'] = true;
+    }
+
+    // Ajoute si besoin les paramètres compémentaires
+    goog.object.extend(params, complementParams);
+
+    if (filter['operators'].length > 0) {
+        params['filter'] = JSON.stringify(filter);
+
+        ajaxRequest({
+            'method': 'POST',
+            'url': url,
+            'headers': {
+                'X-HTTP-Method-Override': 'GET',
+                'Accept': 'application/x-vm-json'
+            },
+            'data': params,
+            'scope': this.$scope_,
+            'success': function (response) {
+
+                var data = [];
+
+                // Décrémente le compteur de requêtes
+                this_.requestCounter_--;
+
+                // Si le compteur de requêtes vaut zéro, alors on remet le curceur normal
+                if (this_.requestCounter_ === 0) {
+                    $('body').css({"cursor": ""});
+                    hideAjaxLoader();
+                }
+
+                // Vérifie si il y a une erreur
+                if (goog.isDef(response['data'])) {
+                    if (goog.isDef(response['data']['errorMessage'])) {
+                        bootbox.alert(response['data']['errorMessage']);
+                    }
+                }
+
+                // Vérifie si il y a des données à afficher
+                if (!goog.isDef(response['data']['data'])) {
+                    oVmap.log('Pas de données à afficher');
+                } else {
+                    var data = response['data']['data'];
+                }
+
+                // Vérifie si la limite de données à afficher n'a pas été dépassée
+                if (data.length > 199) {
+                    var sAlert = '<h4>Attention, vous avez atteint la limite d\'objects affichables sur la carte</h4>';
+                    bootbox.alert(sAlert);
+                }
+
+                // Ajoute le résultat de la requête
+                this_.addQueryResult({
+                    data: data,
+                    selection: aSelection,
+                    dataType: dataType,
+                    callback: callback
+                });
+            },
+            'error': function (response) {
+                // Décrémente le compteur de requêtes
+                this_.requestCounter_--;
+
+                // Si le compteur de requêtes vaut zéro, alors on remet le curceur normal
+                if (this_.requestCounter_ === 0) {
+                    $('body').css({"cursor": ""});
+                    hideAjaxLoader();
+                    callback.call(this, aSelection);
+                }
+            }
+        });
+    } else {
+        // Décrémente le compteur de requêtes
+        this_.requestCounter_--;
+
+        // Si le compteur de requêtes vaut zéro, alors on remet le curceur normal
+        if (this_.requestCounter_ === 0) {
+            $('body').css({"cursor": ""});
+            hideAjaxLoader();
+            callback.call(this, aSelection);
+        }
+    }
+};
+
+/**
+ * Add the query result to this['aSelections'] removing the duplicate selections
+ * @param {object} opt_options
+ * @param {array<object>} opt_options.data
+ * @param {array<object>} opt_options.selection
+ * @param {string} opt_options.dataType summary|list|form
+ * @param {function} opt_options.callback callback to run at the end of the function
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.addQueryResult = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.addQueryResult');
+
+    var aData = goog.isDef(opt_options.data) ? opt_options.data : [];
+    var aSelections = goog.isDef(opt_options.selection) ? opt_options.selection : [];
+    var dataType = goog.isDef(opt_options.dataType) ? opt_options.dataType : null;
+    var callback = goog.isDef(opt_options.callback) ? opt_options.callback : function () {
+        return 0;
+    };
+
+    // Formatage du résultat
+    var aResult = [];
+    for (var i = 0; i < aData.length; i++) {
+        aResult.push(aData[i]);
+        if (goog.isDef(aData[i]['bo_intersect_geom'])) {
+            aResult[i]['olFeature'] = this.extractFeatureFromData(aData[i]);
+        }
+    }
+
+    // Ajoute les résultats
+    goog.array.insertArrayAt(aSelections, aResult, -1);
+
+    // supprime les doublons
+    aSelections = this.removeDuplicateSelections(aSelections);
+
+    callback.call(this, aSelections);
+};
+
+/**
+ * Remove the duplicate values without taking care of the 'loked' item
+ * @param {array} aSelections
+ * @returns {array}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.removeDuplicateSelections = function (aSelections) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.removeDuplicateSelections');
+
+    var itemsToRemove = [];
+
+    for (var i = 0; i < aSelections.length; i++) {
+
+        goog.array.clear(itemsToRemove);
+
+        // Mémorise les élements à supprimer
+        for (var ii = i + 1; ii < aSelections.length; ii++) {
+
+            // Compare les objets
+            //            if (angular.equals(aSelections[i]['bo_id_field'], aSelections[ii]['bo_id_field']) &&
+            //                    angular.equals(aSelections[i]['bo_id_value'], aSelections[ii]['bo_id_value']) &&
+            //                    angular.equals(aSelections[i]['bo_type'], aSelections[ii]['bo_type'])) {
+
+            if (aSelections[i]['bo_id_field'] == aSelections[ii]['bo_id_field'] &&
+                    aSelections[i]['bo_type'] == aSelections[ii]['bo_type'] &&
+                    aSelections[i]['bo_id_value'] == aSelections[ii]['bo_id_value']) {
+
+                itemsToRemove.push(ii);
+
+                // Si le deuxième est locked, alors le premier passe locked (le deuxième sera supprimé dans tous les cas)
+                if (aSelections[ii]['locked'] === true)
+                    aSelections[i]['locked'] = true;
+
+                // Paramètres à sauvegarder si une des deux l'a
+                var paramsToSave = ['olFeature', 'mapPopup', 'bo_image_path', 'bo_summary', 'bo_summary_attributs', 'bo_list', 'bo_list_attributs', 'bo_form', 'bo_form_attributs', 'bo_json_form', 'bo_json_form_js', 'bo_json_form_css'];
+
+                for (var iii = 0; iii < paramsToSave.length; iii++) {
+
+                    // Si le deuxième a le paramètre, alors le premier le prend et vice versa
+                    if (goog.isDef(aSelections[ii][paramsToSave[iii]]) && !goog.isDef(aSelections[i][paramsToSave[iii]]))
+                        aSelections[i][paramsToSave[iii]] = aSelections[ii][paramsToSave[iii]];
+                    if (goog.isDef(aSelections[i][paramsToSave[iii]]) && !goog.isDef(aSelections[ii][paramsToSave[iii]]))
+                        aSelections[ii][paramsToSave[iii]] = aSelections[i][paramsToSave[iii]];
+                }
+            }
+        }
+
+        // Supprime les doublons
+        for (var j = 0; j < itemsToRemove.length; j++) {
+            goog.array.removeAt(aSelections, itemsToRemove[j]);
+        }
+    }
+
+    return aSelections;
+};
+
+/**
+ * Update on database the BO values
+ * @param {string} bo_type
+ * @param {object} boValues
+ * @param {function} successCallback
+ * @param {function} errorCallback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.updateBOValues = function (bo_type, boValues, successCallback, errorCallback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.updateBOValues');
+
+    if (!goog.isDef(bo_type))
+        return 0;
+
+    boValues = goog.isDef(boValues) ? boValues : {};
+    successCallback = goog.isDef(successCallback) ? successCallback : angular.noop;
+    errorCallback = goog.isDef(errorCallback) ? errorCallback : angular.noop;
+
+    var data = this.getFormDataFromValues(boValues);
+    var aLayers = this['map'].getLayers().getArray();
+
+    ajaxRequest({
+        'method': 'PUT',
+        'url': oVmap['properties']['api_url'] + '/vmap/querys/' + bo_type,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': data,
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDef(response['data'])) {
+                console.error('Aucune valeur retournée');
+                errorCallback.call();
+                return 0;
+            }
+
+            if (goog.isDef(response['data']['errorMessage'])) {
+                console.error(response['data']['errorMessage']);
+                errorCallback.call();
+                return 0;
+            }
+
+            // recharge les couches impliquées
+            for (var i = 0; i < aLayers.length; i++) {
+                var aBusinessObjects = aLayers[i].getProperties()['business_objects'];
+                if (goog.isArray(aBusinessObjects)) {
+                    for (var ii = 0; ii < aBusinessObjects.length; ii++) {
+                        if (aBusinessObjects[ii]['business_object_id'] === bo_type) {
+                            aLayers[i].refreshWithTimestamp();
+                        }
+                    }
+                }
+            }
+
+            // Message ok
+            $.notify("Opération réalisée avec succès, les couches de la carte se mettent à jour", "info");
+
+            successCallback.call();
+        }
+    });
+};
+
+/**
+ * Get the form values to send
+ * @param {object} oFormValues
+ * @param {object} oFormDefinition
+ * @param {string} sFormDefinitionName
+ * @param {array|undefined} aParamsToSave
+ * @returns {object|null}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormData = function (oFormValues, oFormDefinition, sFormDefinitionName, aParamsToSave) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormData');
+
+    if (!goog.isDefAndNotNull(oFormValues)) {
+        console.error('oFormValues is undefined or null');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(oFormDefinition)) {
+        console.error('oFormDefinition is undefined or null');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(sFormDefinitionName)) {
+        console.error('sFormDefinitionName is undefined or null');
+        return null;
+    }
+    if (!goog.isDefAndNotNull(aParamsToSave)) {
+        aParamsToSave = [];
+    }
+
+    var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
+    var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]);
+
+    envSrvc["oFormValues"] = oFormValues;
+    envSrvc["oFormDefinition"] = oFormDefinition;
+    envSrvc["sFormDefinitionName"] = sFormDefinitionName;
+
+    var oFormData = formSrvc['getFormData'](sFormDefinitionName, true);
+
+    for (var i = 0; i < aParamsToSave.length; i++) {
+        if (goog.isDefAndNotNull(oFormValues[sFormDefinitionName][aParamsToSave[i]])) {
+            oFormData[aParamsToSave[i]] = oFormValues[sFormDefinitionName][aParamsToSave[i]];
+        }
+    }
+
+    return oFormData;
+};
+
+/**
+ * Creates a FormData object from oValues
+ * @param {object} oValues
+ * @returns {FormData}
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormDataFromValues = function (oValues) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormDataFromValues');
+
+    var oFormData_ = new FormData();
+
+    for (var key in oValues) {
+        // Fichier ?
+        if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
+            oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
+            oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
+        } else {
+            oFormData_.append(key, oValues[key]);
+        }
+    }
+
+    return oFormData_;
+};
+
+/**
+ * Suggest if realy want to delete the object and call submitDeleteObject
+ * @param {object} selection
+ * @param {object} selection.bo_type
+ * @param {object} selection.bo_id_value
+ * @param {function} callback
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.deleteObject = function (selection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.deleteObject');
+
+    var this_ = this;
+
+    bootbox.confirm("<h4>Supprimer définitivement cet objet de la base de données ?</h4>", function (result) {
+        if (result === true)
+            this_.submitDeleteObject(selection, callback);
+    });
+
+};
+
+/**
+ * Suggest if realy want to delete the objects and call submitDeleteObject
+ * @param {array<object>} aSelection
+ * @param {function} callback
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.deleteMultipleObjects = function (aSelection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.deleteMultipleObjects');
+
+    var this_ = this;
+
+    bootbox.confirm("<h4>Supprimer définitivement ces objets de la base de données ?</h4>", function (result) {
+        if (result === true) {
+            for (var i = 0; i < aSelection.length; i++) {
+                this_.submitDeleteObject(aSelection[i], callback);
+            }
+        }
+    });
+
+};
+
+/**
+ * Submit a DELETE request to the server for delete the object from the datasource
+ * @param {object} selection
+ * @param {object} selection.bo_type
+ * @param {object} selection.bo_id_value
+ * @param {function} callback
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.submitDeleteObject = function (selection, callback) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.submitDeleteObject');
+
+    var boId = selection['bo_type'];
+    var boIdValue = selection['bo_id_value'];
+    var aLayers = this['map'].getLayers().getArray();
+
+    ajaxRequest({
+        'method': 'DELETE',
+        'url': oVmap['properties']['api_url'] + '/vmap/querys/' + boId,
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'idList': boIdValue
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            // recharge les couches impliquées
+            for (var i = 0; i < aLayers.length; i++) {
+                var aBusinessObjects = aLayers[i].getProperties()['business_objects'];
+                if (goog.isArray(aBusinessObjects)) {
+                    for (var ii = 0; ii < aBusinessObjects.length; ii++) {
+                        if (aBusinessObjects[ii]['business_object_id'] === boId) {
+                            aLayers[i].refreshWithTimestamp();
+                        }
+                    }
+                }
+            }
+
+            // Message ok
+            $.notify("Opération réalisée avec succès, les couches de la carte se mettent à jour", "info");
+
+            // Callback
+            callback.call();
+        },
+        'error': function (response) {
+
+        }
+    });
+};
+
+/**
+ * Add the selected elements from the table to the card
+ * @param {array} aSelection
+ * @param {boolean} bReplace true to empty the card before adding items
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.addToCard = function (aSelection, bReplace) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.addToCard');
+
+    // Vide le panier
+    if (bReplace) {
+        oVmap.getToolsManager().getInfoContainer().removeAll();
+    }
+
+    var this_ = this;
+
+    // Télécharge les features de la sélection
+    setTimeout(function () {
+        this_.getSummaryInfos(aSelection, function (aSelection) {
+            this_.getListInfos(aSelection, function (aSelection) {
+
+                if (!goog.isDef(aSelection) || aSelection.length <= 0) {
+                    console.error('aSelection empty or inexistent');
+                    return 0;
+                }
+
+                var aData = [];
+                var bo_type = aSelection[0]['bo_type'];
+                var bo_title = aSelection[0]['bo_title'];
+
+                var rowOptions = {
+                    invisibleColumns: ['selection', 'state']
+                };
+
+                // Extrait la data (qui cette fois ci contient la feature)
+                for (var i = 0; i < aSelection.length; i++) {
+                    if (!goog.isDefAndNotNull(aSelection[i]['bo_list'])) {
+                        console.error("Selection[i]['bo_list'] undefined");
+                        continue;
+                    }
+                    if (!goog.isDefAndNotNull(aSelection[i]['olFeature'])) {
+                        console.error("Selection[i]['olFeature'] undefined");
+                        continue;
+                    }
+                    aData.push(aSelection[i]['bo_list']);
+                    aData[i]['feature'] = aSelection[i]['olFeature'];
+
+                    // Si ne contient pas le champ identifiant
+                    if (!goog.isDefAndNotNull(aData[i][aSelection[i]['bo_id_field']])) {
+                        aData[i][aSelection[i]['bo_id_field']] = aSelection[i]['bo_id_value'];
+                        rowOptions.invisibleColumns.push(aSelection[i]['bo_id_field']);
+                    }
+                }
+
+                // Crée l'onglet correspondant
+                if (oVmap.getToolsManager().getInfoContainer().getTabByCode(bo_type) === undefined)
+                    oVmap.getToolsManager().getInfoContainer().addTab({tabCode: bo_type, tabName: bo_title, actions: ['zoom', 'delete']});
+
+                var tabOptions = {tabCode: bo_type};
+                rowOptions.data = aData;
+
+                // Ajoute les inos au panier
+                oVmap.getToolsManager().getInfoContainer().addMultipleRows(tabOptions, rowOptions);
+
+                // Ferme la modale
+                $('#select-list-modal').modal('hide');
+
+                // Affiche le panier
+                oVmap.getToolsManager().getInfoContainer().showBar();
+
+                // Affiche les features
+                oVmap.getToolsManager().getInfoContainer().displayTabFeatures(bo_type);
+
+                setTimeout(function () {
+                    oVmap.getToolsManager().getInfoContainer().zoomOnTabFeatures(bo_type);
+                }, 500);
+            });
+        });
+    });
+};
+
+/**
+ * Parse the geom title and replace the {{ }}
+ * @param {string} sFormTitle
+ * @param {object} oScope
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.parseFormTile = function (sFormTitle, oScope) {
+
+    if (!goog.isString(sFormTitle)) {
+        return sFormTitle;
+    }
+    if (!goog.isObject(oScope)) {
+        return sFormTitle;
+    }
+
+    var sAttr;
+    if (sFormTitle.search('{{') !== -1 && sFormTitle.search('}}') !== -1) {
+        sAttr = sFormTitle.substr(sFormTitle.search('{{') + 2, sFormTitle.search('}}') - sFormTitle.search('{{') - 2);
+        if (goog.isDefAndNotNull(oScope[sAttr])) {
+            sFormTitle = sFormTitle.replace('{{' + sAttr + '}}', oScope[sAttr]);
+        }
+    }
+    if (sFormTitle.search('{{') !== -1 && sFormTitle.search('}}') !== -1) {
+        this.parseFormTile(sFormTitle, oScope);
+    }
+
+    sFormTitle = $('<div/>').html(oVmap['$sanitize'](sFormTitle)).text();
+
+    return sFormTitle;
+};
+
+
+
+// Édition de la géométrie
+
+/**
+ * Edit the form feature
+ * @param {object} selection
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.editFormFeature = function (selection) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.editFormFeature');
+
+    // Ferme le formulaire d'édition
+    $('#select-edit-modal').modal('hide');
+
+    // Ferme les popup
+    this.getBasicSelectScope()['ctrl'].removePopups();
+
+    // Ferme le requêteur
+    $('#select-list-modal').modal('hide');
+
+    // Lance l'édition
+    this.editFeature(selection, true);
+};
+
+/**
+ * Start the geometry edition
+ * @param {object} selection
+ * @param {boolean} bFromEditForm true if the request comes to the EditForm
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.editFeature = function (selection, bFromEditForm) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.editFeature');
+
+    var this_ = this;
+
+    var oBusinessObjects = oVmap.getMapManager().getQueryableBusinessObjects();
+
+    if (!goog.isDefAndNotNull(selection['bo_type'])) {
+        console.error("selection['bo_type'] not defined");
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(oBusinessObjects[selection['bo_type']])) {
+        console.error("oBusinessObjects[selection['bo_type']] not defined");
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(oBusinessObjects[selection['bo_type']]['bo_geom_type'])) {
+        console.error("oBusinessObjects[selection['bo_type']]['bo_geom_type'] not defined");
+        return 0;
+    }
+
+    this['editableSelection'] = selection;
+    this['editableFeatureType'] = oBusinessObjects[selection['bo_type']]['bo_geom_type'];
+
+    if (this['editableFeatureType'] === 'GEOMETRYCOLLECTION') {
+        this['addPartGeomType'] = '';
+    } else if (this['editableFeatureType'] === 'POLYGON' || this['editableFeatureType'] === 'MULTIPOLYGON') {
+        this['addPartGeomType'] = 'Polygon';
+    } else if (this['editableFeatureType'] === 'LINESTRING' || this['editableFeatureType'] === 'MULTILINESTRING') {
+        this['addPartGeomType'] = 'LineString';
+    } else if (this['editableFeatureType'] === 'POINT' || this['editableFeatureType'] === 'MULTIPOINT') {
+        this['addPartGeomType'] = 'Point';
+    }
+
+
+    if (bFromEditForm) {
+        this['editGeometryFromForm'] = true;
+    } else {
+        this['editGeometryFromForm'] = false;
+    }
+
+    if (oVmap['properties']['is_mobile']) {
+        oVmap.getMap().startMobileGeomEdition(this_['editableSelection']['olFeature'], function (olFeature) {
+            setTimeout(function () {
+                this_['editableSelection']['olFeature'] = olFeature;
+                this_.submitGeomEdition();
+            });
+        });
+    } else {
+        // Affiche la palette de modification
+        $('#basictools-select-modify-palette').show();
+
+        // Timeout car lors du toggleOutTools, clearOverlays est lancé
+        setTimeout(function () {
+            // Ajoute la/les feature(s)
+            if (goog.isDefAndNotNull(this_['editableSelection']['olFeature'])) {
+                this_.putElementFeatureOnOverlay();
+            }
+
+            setTimeout(function () {
+                // Ajoute l'interraction
+                if (this_.oOverlayLayer_.getSource().getFeaturesCollection().getLength() > 0) {
+                    this_.startEdition('editFeature', this_['currentAction'] === 'basicTools-select-editFeature');
+                }
+            }, 100);
+        }, 500);
+    }
+};
+
+/**
+ * Set the drawTool
+ * @param {string} type (editFeature, deleteFeature, addHole)
+ * @param {boolean} isActive true if the selection is already active
+ * @returns {Number}
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.startEdition = function (type, isActive) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.startEdition');
+
+    var this_ = this;
+
+    this.cancelEdition();
+
+    if (isActive === true)
+        return 0;
+
+    if (type.substr(0, 6) === 'insert') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez pour commencer à dessiner');
+
+        // Ajoute l'interraction
+        this.startDrawing(type.substr(6));
+
+    } else if (type === 'editFeature') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur la géométrie pour la modifier');
+
+        // Ajoute l'interraction
+        oVmap.getMap().setInteraction(this.modify_, 'basicTools-select-' + type);
+
+        this_.loadVectorSnappingData();
+
+    } else if (type === 'deleteFeature') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur la géométrie pour la supprimer');
+
+        // Ajoute l'interraction
+        oVmap.getMap().setInteraction(this.delete_, 'basicTools-select-' + type);
+
+    } else if (type === 'addHole') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage('Dessinez un polygone à l\'intérieur d\'un autre pour créer un trou');
+
+        // Ajoute l'interraction (reliée à aucune featureCollection)
+        this.draw_ = oVmap.getMap().setDrawInteraction({
+            type: 'Polygon'
+        }, 'basicTools-select-' + type);
+
+        // Copie les features présentes avant le dessin
+        var aFeaturesCopy = goog.array.clone(this.oOverlayFeatures_.getArray());
+
+        this.draw_.on('drawend',
+        function (evt) {
+            // Récupère la feature ajoutée
+            var feature = evt.feature;
+            var linearRing = feature.getGeometry().getLinearRing(0);
+            var bIsContained = false;
+            for (var i = 0; i < aFeaturesCopy.length; i++) {
+                // Si le trou est contenu dans une des features
+                if (aFeaturesCopy[i].getGeometry().containsPolygon(feature.getGeometry())) {
+                    // Troue le polygone
+                    aFeaturesCopy[i].getGeometry().appendLinearRing(linearRing);
+                    bIsContained = true;
+                }
+            }
+
+            if (!bIsContained) {
+                bootbox.alert('<h4>Trou non valide: il doit être contenu dans un polygone dessiné</h4>');
+            } else {
+                setTimeout(function () {
+                    this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
+                });
+            }
+        }, this);
+
+    } else if (type === 'deleteHole') {
+
+        //Ajoute la tooltip
+        oVmap.getMap().getMapTooltip().displayMessage("Cliquez dans un trou pour le supprimer");
+
+        // Ajoute les trous dans la couche oOverlayHolesLayer_
+        this.addHolesIntoHolesLayer();
+
+        // Ajoute l'interraction de suppresion des trous
+        oVmap.getMap().setInteraction(this.deleteHole_, 'basicTools-select-' + type);
+
+    } else {
+        console.error('startEdition: type (' + type + ') not allowed');
+        return 0;
+    }
+};
+
+/**
+ * Cancel the edition
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.cancelEdition = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.cancelEdition');
+
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    // vide oOverlayHolesLayer_
+    this.oOverlayHolesLayer_.getSource().clear();
+};
+
+/**
+ * This function add the holes contained into oOverlayLayer_ to oOverlayHolesLayer_
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.addHolesIntoHolesLayer = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.addHolesIntoHolesLayer');
+
+    var aFeatures = this.oOverlayFeatures_.getArray();
+
+    this.oOverlayHolesLayer_.getSource().clear();
+
+    for (var i = 0; i < aFeatures.length; i++) {
+        var aLinearRings = aFeatures[i].getGeometry().getLinearRings();
+        if (aLinearRings.length > 1) {
+
+            for (var ii = 1; ii < aLinearRings.length; ii++) {
+
+                var newPolygon = new ol.geom.Polygon();
+                newPolygon.setCoordinates([aLinearRings[ii].getCoordinates()]);
+
+                this.oOverlayHolesLayer_.getSource().addFeature(new ol.Feature({
+                    geometry: newPolygon
+                }));
+            }
+        }
+    }
+};
+
+/**
+ * Delete the selected hole
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.deleteHole = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.deleteHole');
+
+    var this_ = this;
+
+    /**
+     * Holes selected by deleteHole_
+     * @type array
+     */
+    var aSelectedHoles = this.deleteHole_.getFeatures().getArray();
+
+    if (aSelectedHoles.length > 0) {
+        for (var i = 0; i < aSelectedHoles.length; i++) {
+
+            /**
+             * Selected hole
+             * @type ol.geom.polygon
+             */
+            var hole = aSelectedHoles[i].getGeometry();
+
+            var bHoleFounded = false;
+
+            // Compare pour chaque polygone si il a un trou ayant les mêmes coordonnées que hole
+            var aFeatures = this.oOverlayFeatures_.getArray();
+            for (var ii = 0; ii < aFeatures.length; ii++) {
+                var aHolesCoords = aFeatures[ii].getGeometry().getCoordinates();
+                for (var iii = aHolesCoords.length - 1; iii >= 0; iii--) {
+                    if (angular.equals(hole.getCoordinates()[0], aHolesCoords[iii])) {
+                        aHolesCoords.splice(iii, 1);
+                        bHoleFounded = true;
+                    }
+                }
+                aFeatures[ii].getGeometry().setCoordinates(aHolesCoords);
+            }
+            if (bHoleFounded)
+                this.oOverlayHolesLayer_.getSource().removeFeature(aSelectedHoles[i]);
+        }
+
+        this.deleteHole_.getFeatures().clear();
+
+
+        setTimeout(function () {
+            this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
+        });
+    }
+};
+
+/**
+ * Start the drawing experience
+ * @param {ol.geom} type geometry type
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.startDrawing = function (type) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.startDrawing');
+
+    var this_ = this;
+
+    // Lance setDrawInteraction avec this.oOverlayFeatures_ comme cible pour les features
+    this.draw_ = oVmap.getMap().setDrawInteraction({
+        type: type,
+        features: this.oOverlayFeatures_
+    }, 'basicTools-select-insert' + type);
+    this.draw_.on('drawend', function (evt) {
+
+        // Récupère la feature ajoutée
+        var feature = evt.feature;
+
+        setTimeout(function () {
+
+            // Transforme les cercles en polygones de 32 côtés
+            // car ils ne sont pas acceptés par WKT
+            if (type === 'Circle') {
+                var circleGeom = feature.getGeometry();
+                var polygonGeom = new ol.geom.Polygon.fromCircle(circleGeom);
+
+                // Supprime l'ancienne feature de l'overlay
+                this_.oOverlayLayer_.getSource().removeFeature(feature);
+
+                feature = new ol.Feature({
+                    geometry: polygonGeom
+                });
+
+                // Ajoute la nouvelle feature à l'overlay
+                this_.oOverlayLayer_.getSource().addFeature(feature);
+            }
+
+            // Ajoute les géométries en mode multi ou simple à editableSelection.olFeature
+            this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
+        });
+    }, this);
+};
+
+/**
+ * Put the array of features passed on aFeatures on editableSelection.olFeature with MULTI... form
+ * @param {array} aFeatures
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.putFeaturesOnTheElement = function (aFeatures) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.putFeaturesOnTheElement');
+
+    if (!goog.isDefAndNotNull(aFeatures)) {
+        console.error('aFeatures undefined');
+        return 0;
+    }
+    if (!goog.isArray(aFeatures)) {
+        console.error('aFeatures is not an array');
+        return 0;
+    }
+
+    // Cas de feature simple
+    if (this['editableFeatureType'].substr(0, 5) !== 'MULTI' && this['editableFeatureType'] !== 'GEOMETRYCOLLECTION') {
+        // La nouvelle feature devient la feature de référence
+        this['editableSelection']['olFeature'] = aFeatures[aFeatures.length - 1];
+        // Supprime les aurtes features
+        for (var i = 0; i < aFeatures.length - 1; i++) {
+            this.oOverlayLayer_.getSource().removeFeature(aFeatures[i]);
+        }
+    }
+    // Cas de feature multiple
+    else {
+        if (this['editableFeatureType'] === 'MULTIPOLYGON') {
+
+            var oMultiPolygon = new ol.geom.MultiPolygon();
+            var aCoordinates = [];
+
+            for (var i = 0; i < aFeatures.length; i++) {
+                if (aFeatures[i].getGeometry().getType() === 'Polygon') {
+                    aCoordinates.push(aFeatures[i].getGeometry().getCoordinates());
+                }
+            }
+
+            oMultiPolygon.setCoordinates(aCoordinates);
+            this['editableSelection']['olFeature'] = new ol.Feature({geometry: oMultiPolygon});
+
+        }
+        if (this['editableFeatureType'] === 'MULTILINESTRING') {
+
+            var oMultiLineString = new ol.geom.MultiLineString();
+            var aCoordinates = [];
+
+            for (var i = 0; i < aFeatures.length; i++) {
+                if (aFeatures[i].getGeometry().getType() === 'LineString') {
+                    aCoordinates.push(aFeatures[i].getGeometry().getCoordinates());
+                }
+            }
+
+            oMultiLineString.setCoordinates(aCoordinates);
+            this['editableSelection']['olFeature'] = new ol.Feature({geometry: oMultiLineString});
+
+        }
+        if (this['editableFeatureType'] === 'MULTIPOINT') {
+
+            var oMultiPoint = new ol.geom.MultiPoint();
+            var aCoordinates = [];
+
+            for (var i = 0; i < aFeatures.length; i++) {
+                if (aFeatures[i].getGeometry().getType() === 'Point') {
+                    aCoordinates.push(aFeatures[i].getGeometry().getCoordinates());
+                }
+            }
+
+            oMultiPoint.setCoordinates(aCoordinates);
+            this['editableSelection']['olFeature'] = new ol.Feature({geometry: oMultiPoint});
+        }
+    }
+};
+
+/**
+ * Put the features in editableSelection.olFeature on the map (disabling the Multi.... form)
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.putElementFeatureOnOverlay = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.putElementFeatureOnOverlay');
+
+    if (!goog.isDefAndNotNull(this['editableSelection']['olFeature'])) {
+        console.error("this['editableSelection']['olFeature'] not defined");
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(this['editableSelection']['olFeature'].getGeometry())) {
+        console.error("this['editableSelection']['olFeature'].getGeometry() not defined");
+        return 0;
+    }
+
+    // Cas de feature simple
+    if (this['editableFeatureType'].substr(0, 5) !== 'MULTI' && this['editableFeatureType'] !== 'GEOMETRYCOLLECTION') {
+        this.oOverlayLayer_.getSource().clear;
+        this.oOverlayLayer_.getSource().addFeature(this['editableSelection']['olFeature']);
+    }
+    // Cas de feature multiple
+    else {
+        var aFeatures = [];
+        var aGeoms = [];
+
+        if (this['editableFeatureType'] === 'MULTIPOINT') {
+            aGeoms = goog.array.clone(this['editableSelection']['olFeature'].getGeometry().getPoints());
+        }
+        if (this['editableFeatureType'] === 'MULTILINESTRING') {
+            aGeoms = goog.array.clone(this['editableSelection']['olFeature'].getGeometry().getLineStrings());
+        }
+        if (this['editableFeatureType'] === 'MULTIPOLYGON') {
+            aGeoms = goog.array.clone(this['editableSelection']['olFeature'].getGeometry().getPolygons());
+        }
+
+        for (var i = 0; i < aGeoms.length; i++) {
+            aFeatures.push(new ol.Feature({
+                geometry: aGeoms[i]
+            }));
+        }
+        this.oOverlayLayer_.getSource().clear;
+        this.oOverlayLayer_.getSource().addFeatures(aFeatures);
+    }
+
+};
+
+/**
+ * Submit the geometry modifications
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.submitGeomEdition = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.submitGeomEdition');
+
+    var oFormValues = {};
+    oFormValues[this['editableSelection']['bo_id_field']] = this['editableSelection']['bo_id_value'];
+
+    if (goog.isDefAndNotNull(this['editableSelection']['olFeature']))
+        oFormValues[this['editableSelection']['geom_column']] = oVmap.getEWKTFromGeom(this['editableSelection']['olFeature'].getGeometry());
+    else
+        oFormValues[this['editableSelection']['geom_column']] = '';
+
+    this.updateBOValues(this['editableSelection']['bo_type'], oFormValues, function () {
+        oVmap.getToolsManager().getBasicTools().toggleOutTools();
+    }, function () {
+        oVmap.getToolsManager().getBasicTools().toggleOutTools();
+    });
+};
+
+/**
+ * Write the feature into the EditForm oFormValues and open it
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.validateGeomAndDisplayEditForm = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.validateGeomAndDisplayEditForm');
+
+    var this_ = this;
+
+    var editFormReaderScope = this.getEditFormReaderScope();
+    editFormReaderScope.$evalAsync(function () {
+
+        if (goog.isDefAndNotNull(this_['editableSelection']['olFeature']))
+            if (goog.isDefAndNotNull(this_['editableSelection']['olFeature'].getGeometry()))
+                editFormReaderScope['oFormValues']['update'][this_['editableSelection']['geom_column']] = oVmap.getEWKTFromGeom(this_['editableSelection']['olFeature'].getGeometry());
+        else
+            editFormReaderScope['oFormValues']['update'][this_['editableSelection']['geom_column']] = '';
+        else
+            editFormReaderScope['oFormValues']['update'][this_['editableSelection']['geom_column']] = '';
+
+
+        // Cache la palette de modification
+        $('#basictools-select-modify-palette').hide();
+
+        // Enlève les interractions
+        oVmap.getMap().removeActionsAndTooltips();
+
+        // Affiche le formulaire d'édition
+        $('#select-edit-modal').modal('show');
+
+        // Enlève la feature de la carte
+        this_.clearOverlays();
+    });
+};
+
+/**
+ * Remove all was did during the geometry edition
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.clearOverlays = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.clearOverlays');
+
+    // Supprime la feature
+    if (this.oOverlayLayer_.getSource().getFeaturesCollection().getLength() > 0) {
+        this.oOverlayLayer_.getSource().clear();
+    }
+    if (this.oOverlayHolesLayer_.getSource().getFeaturesCollection().getLength() > 0) {
+        this.oOverlayHolesLayer_.getSource().clear();
+    }
+
+    // Supprime le snapping
+    this.oSnapOverlayLayer_.getSource().clear();
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+
+    // Supprime les points GetFeatureInfo
+    this.oGetFeatureInfoOverlay_.getSource().clear();
+};
+
+/**
+ * Remove all was did during the geometry edition
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.finishEdition = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.finishEdition');
+
+    // Supprime le snapping
+    this.oSnapOverlayLayer_.getSource().clear();
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+
+    // Supprime la feature
+    this.clearOverlays();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    // cache la palette d'édition
+    oVmap.getToolsManager().getBasicTools().toggleOutTools();
+};
+
+
+// Snapping
+
+/**
+ * Show the snapping options modal
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.showSnappingOptionsModal = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.showSnappingOptionsModal');
+
+    this['tmpSnapOptions'] = angular.copy(this['snapOptions']);
+    $('#vmap-select-snap-options-modal').modal('show');
+};
+
+/**
+ * Validate and hide the snapping options modal
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.submitSnappingOptionsModal = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.submitSnappingOptionsModal');
+
+    this['snapOptions'] = angular.copy(this['tmpSnapOptions']);
+
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+    this.snap_ = new ol.interaction.Snap({
+        vertex: true,
+        edge: (this['snapOptions']['mode'] === 'segment_edge_node' ? true : false),
+        pixelTolerance: this['snapOptions']['tolerance'],
+        source: this.oSnapOverlayLayer_.getSource()
+    });
+    oVmap.getMap().getOLMap().addInteraction(this.snap_);
+
+    $('#vmap-select-snap-options-modal').modal('hide');
+
+    this.loadVectorSnappingData();
+};
+
+/**
+ * Reset snapping option to default values
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.resetSnapOptions = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.resetSnapOptions');
+
+    if (goog.isDefAndNotNull(oVmap['properties']['snapping'])) {
+        this['tmpSnapOptions']['tolerance'] = oVmap['properties']['snapping']['defaut_tolerance'];
+        this['tmpSnapOptions']['mode'] = oVmap['properties']['snapping']['defaut_snapp_mode'];
+        this['tmpSnapOptions']['limit'] = oVmap['properties']['snapping']['defaut_limit'];
+        this['tmpSnapOptions']['visible'] = oVmap['properties']['snapping']['defaut_visibility'];
+    }
+    this.submitSnappingOptionsModal();
+};
+
+/**
+ * Selector function to only reload object when needed
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadVectorSnappingData = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadVectorSnappingData');
+
+    var this_ = this;
+    var oBo = null;
+    this_.oSnapOverlayLayer_.setVisible(this_['snapOptions']['visible']);
+    this_.oSnapOverlayLayer_.getSource().clear();
+    this_.checkEditionScale();
+    oVmap.getMap().getOLMap().removeInteraction(this_.snap_);
+    setTimeout(function () {
+        if (this_['currentAction'] === 'basicTools-select-editFeature') {
+            if (this_['isMaxScaleOk'] && this_['isMinScaleOk']) {
+                for (var i = 0; i < this_['aQueryableBOs'].length; i++) {
+                    oBo = this_['aQueryableBOs'][i];
+                    this_.stopLoadingBoVectorSnappingData(oBo);
+                    this_.loadBoVectorSnappingData(oBo);
+                }
+                for (var i = 0; i < oBo.length; i++) {
+                    if (oBo[i]['bo_snapping_loaded'] === null) {
+                        oBo[i]['bo_snapping_enabled'] = false;
+                    }
+                }
+                oVmap.getMap().getOLMap().addInteraction(this_.snap_);
+            }
+        }
+    });
+};
+
+/**
+ * Retrieve the object given in parameter with ajaxRequest
+ * @param {type} oBo
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadBoVectorSnappingData = function (oBo) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadBoVectorSnappingData');
+    var this_ = this;
+    var bo_id = oBo['bo_id'];
+    var aFeatures = [];
+    var geom = null;
+    var extent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize());
+    var polygonGeom = new ol.geom.Polygon.fromExtent(extent);
+    if (oBo['bo_snapping_enabled'] === true) {
+        oBo['bo_snapping_loaded'] = false;
+        ajaxRequest({
+            'method': 'POST',
+            'url': oVmap['properties']['api_url'] + '/vmap/querys/' + bo_id + '/geometry',
+            'headers': {
+                'X-HTTP-Method-Override': 'GET',
+                'Accept': 'application/x-vm-json'
+            },
+            'data': {
+                'intersect_geom': oVmap.getEWKTFromGeom(polygonGeom),
+                'snapping_limit': this_['snapOptions']['snappingObjectsLimit'],
+                'snapping_mode': this_['snapOptions']['mode']
+            },
+            'ajaxLoader': false,
+            'abord': oBo['loadCanceller'].promise,
+            'scope': this.$scope_,
+            'success': function (response) {
+                if (!goog.isDefAndNotNull(response['data'])) {
+                    oBo['bo_snapping_loaded'] = null;
+                    return 0;
+                }
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    console.error(response['data']['errorMessage']);
+                    oBo['bo_snapping_loaded'] = null;
+                    return 0;
+                }
+                if (response['data'][0]['count'] > this_['snapOptions']['snappingObjectsLimit']) {
+                    oBo['bo_snapping_loaded'] = null;
+                    var text = 'Limit de points atteinte pour object ';
+                    text += oBo['bo_title'];
+                    $.notify(text, "warn");
+                    return 0;
+                }
+                oBo['bo_snapping_loaded'] = true;
+                for (var i = 0; i < response['data'].length; i++) {
+                    if (goog.isDefAndNotNull(response['data'][i]['geom'])) {
+                        geom = response['data'][i]['geom'];
+                        aFeatures.push(new ol.Feature({
+                            geometry: oVmap.getGeomFromEWKT(geom)
+                        }));
+                    }
+                }
+                this_.oSnapOverlayLayer_.getSource().addFeatures(aFeatures);
+            },
+            'error': function (response) {
+                oBo['bo_snapping_loaded'] = null;
+            }
+        });
+    }
+};
+
+/**
+ * Cancel request with a resolve callback
+ * @param {type} oBo
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.stopLoadingBoVectorSnappingData = function (oBo) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.stopLoadingBoVectorSnappingData');
+    var this_ = this;
+    if (goog.isDefAndNotNull(oBo['loadCanceller'])) {
+        oBo['loadCanceller'].resolve();
+        oBo['loadCanceller'] = this_.$q_.defer();
+        oBo['bo_snapping_loaded'] = null;
+    }
+};
+
+
+// GetFeatureInfo
+
+/**
+ * Clear the GetFeatureInfo result
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.clearGetFeatureInfoResult = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.clearGetFeatureInfoResult');
+
+    goog.array.clear(this['aGetFeatureInfoResult']);
+    this['iGetFeatureInfoWithResultLayers'] = 0;
+    this['iGetFeatureInfoWithoutResultLayers'] = 0;
+    this['aGetFeatureInfoSelectedLayer'] = 0;
+    this['aGetFeatureInfoSelectedSubLayer'] = 0;
+};
+
+/**
+ * Show the GetFeatureInfo result window
+ * @param {array} aGetFeatureInfoTree
+ * @param {array} aCoordinate
+ * @param  {boolean} bModalOpened Détermine si la modale GetFeatureInfo est déjà ouverte
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.showGetFeatureInfoResultWindow = function (aGetFeatureInfoResult, aCoordinate, bModalOpened) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.showGetFeatureInfoResultWindow');
+
+    var this_ = this;
+    var bHaveResult = false;
+    var selectedLayer = null;
+    var selectedSubLayer = null;
+    var iResultedLayers = 0;
+    var iResultedSublayers = 0;
+    var iNoResultedLayers = 0;
+    var bModalOpened = goog.isDefAndNotNull(bModalOpened) ? bModalOpened : false;
+
+    // Si la modale est déjà ouverte, sauvegarde le couple calque/couche sélectionné
+    if (bModalOpened) {
+        selectedLayer = angular.copy(this['aGetFeatureInfoSelectedLayer']);
+        selectedSubLayer = angular.copy(this['aGetFeatureInfoSelectedSubLayer']);
+    }
+
+    // Nettoie les variables d'environnement
+    this.clearGetFeatureInfoResult();
+
+    if (!goog.isArray(aGetFeatureInfoResult)) {
+        return 0;
+    }
+
+    // Remplit bHaveResult
+    for (var i = 0; i < aGetFeatureInfoResult.length; i++) {
+        if (goog.isArray(aGetFeatureInfoResult[i]['aSubLayers'])) {
+            for (var ii = 0; ii < aGetFeatureInfoResult[i]['aSubLayers'].length; ii++) {
+                if (goog.isDefAndNotNull(aGetFeatureInfoResult[i]['aSubLayers'][ii]['result'])) {
+                    bHaveResult = true;
+                }
+            }
+        }
+    }
+    if (!bHaveResult) {
+        $.notify('Aucun résultat disponible');
+        if (!bModalOpened) {
+            return 0;
+        }
+    }
+
+    // Ordonne les calques et couches par nom
+    goog.array.sortObjectsByKey(aGetFeatureInfoResult, 'name');
+    for (var i = 0; i < aGetFeatureInfoResult.length; i++) {
+        if (goog.isArray(aGetFeatureInfoResult[i]['aSubLayers'])) {
+            aGetFeatureInfoResult[i]['aSubLayers'].sort(function(a, b){
+                var nameA=a['name'].toLowerCase(), nameB=b['name'].toLowerCase();
+                if (nameA < nameB)
+                    return -1;
+                if (nameA > nameB)
+                    return 1;
+                return 0;
+            });
+            for (var ii = 0; ii < aGetFeatureInfoResult[i]['aSubLayers'].length; ii++) {
+                aGetFeatureInfoResult[i]['aSubLayers'][ii]['index'] = angular.copy(ii);
+            }
+        }
+    }
+
+    // Choisit le calque/couche à choisir en premier et compte les calques ayant des résultats
+    for (var i = 0; i < aGetFeatureInfoResult.length; i++) {
+        if (goog.isArray(aGetFeatureInfoResult[i]['aSubLayers'])) {
+            for (var ii = 0; ii < aGetFeatureInfoResult[i]['aSubLayers'].length; ii++) {
+                if (goog.isDefAndNotNull(aGetFeatureInfoResult[i]['aSubLayers'][ii]['result'])) {
+                    if (!goog.isDefAndNotNull(selectedLayer) && !goog.isDefAndNotNull(selectedSubLayer)) {
+                        selectedLayer = angular.copy(i);
+                        selectedSubLayer = angular.copy(ii);
+                    }
+                }
+            }
+        }
+    }
+
+    // Rempli iResultedLayers et iNoResultedLayers
+    for (var i = 0; i < aGetFeatureInfoResult.length; i++) {
+        iResultedSublayers = 0;
+        if (goog.isArray(aGetFeatureInfoResult[i]['aSubLayers'])) {
+            for (var ii = 0; ii < aGetFeatureInfoResult[i]['aSubLayers'].length; ii++) {
+                if (goog.isDefAndNotNull(aGetFeatureInfoResult[i]['aSubLayers'][ii]['result'])) {
+                    iResultedSublayers++;
+                }
+            }
+        }
+        if (iResultedSublayers > 0) {
+            iResultedLayers++;
+        } else {
+            iNoResultedLayers++;
+        }
+    }
+
+    // Fait confiance aux URL
+    for (var i = 0; i < aGetFeatureInfoResult.length; i++) {
+        if (goog.isArray(aGetFeatureInfoResult[i]['aSubLayers'])) {
+            for (var ii = 0; ii < aGetFeatureInfoResult[i]['aSubLayers'].length; ii++) {
+                if (goog.isDefAndNotNull(aGetFeatureInfoResult[i]['aSubLayers'][ii]['url'])) {
+                    aGetFeatureInfoResult[i]['aSubLayers'][ii]['url_trusted'] = this.$sce_.trustAsResourceUrl(aGetFeatureInfoResult[i]['aSubLayers'][ii]['url']);
+                }
+            }
+        }
+    }
+
+    // Sauvegarde les nouvelles données sur le controler
+    this.$scope_.$applyAsync(function(){
+        this_.$scope_['collapseSublayersTabs'] = false;
+        this_['aGetFeatureInfoResult'] = aGetFeatureInfoResult;
+        this_['aGetFeatureInfoSelectedLayer'] = goog.isDefAndNotNull(selectedLayer) ? selectedLayer : 0;
+        this_['aGetFeatureInfoSelectedSubLayer'] = goog.isDefAndNotNull(selectedSubLayer) ? selectedSubLayer : 0;
+        this_['iGetFeatureInfoWithResultLayers'] = goog.isDefAndNotNull(iResultedLayers) ? iResultedLayers : 0;
+        this_['iGetFeatureInfoWithoutResultLayers'] = goog.isDefAndNotNull(iNoResultedLayers) ? iNoResultedLayers : 0;
+    })
+
+    // Ajoute les coordonnées sur la carte
+    this.oGetFeatureInfoOverlay_.getSource().addFeature(new ol.Feature({
+        geometry: new ol.geom.Point(aCoordinate)
+    }));
+
+    $('#getFeatureInfo-result-window').show();
+
+    this.setCollapseSublayersTabs();
+};
+
+
+/**
+ * Set scope.collapseSublayersTabs
+ *
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.setCollapseSublayersTabs = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.setCollapseSublayersTabs');
+
+    var this_ = this;
+
+    this_.$scope_['collapseSublayersTabs'] = false;
+    setTimeout(function () {
+        // Permet de rejoindre les onglets si il y en a beaucoup
+        this_.$scope_.$applyAsync(function(){
+            this_.$scope_['collapseSublayersTabs'] = $('#select-getFeatureInfo-result-window-sublayer-tabs').innerHeight() > 50;
+        });
+    });
+};
+
+/**
+ * Close the GetFeatureInfo result window
+ * @export
+ */
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.closeGetFeatureInfoResultWindow = function () {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.closeGetFeatureInfoResultWindow');
+
+    // Cache la modale
+    $('#getFeatureInfo-result-window').hide();
+
+    // Supprime les points GetFeatureInfo
+    this.oGetFeatureInfoOverlay_.getSource().clear();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appSelect', nsVmap.nsToolsManager.Select.prototype.selectDirective);
+oVmap.module.controller('AppSelectController', nsVmap.nsToolsManager.Select.prototype.selectController);
diff --git a/module/javascript/app/vmap/tools/toolsmanager.js b/module/javascript/app/vmap/tools/toolsmanager.js
new file mode 100755
index 0000000000000000000000000000000000000000..ba4c644aea4d99f191adc967b8a5f8d78f45a29a
--- /dev/null
+++ b/module/javascript/app/vmap/tools/toolsmanager.js
@@ -0,0 +1,228 @@
+/* global nsVmap, oVmap, goog, oTool, angular */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.ToolsManager
+ * cette classe permet l'initialisation des outils de carte
+ */
+
+goog.provide('nsVmap.nsToolsManager.ToolsManager');
+
+goog.require('oVmap');
+
+goog.require('nsVmap.nsToolsManager.BasicTools');
+goog.require('nsVmap.nsToolsManager.InfoContainer');
+goog.require('nsVmap.nsToolsManager.requireModules');
+
+goog.require('goog.dom');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.ToolsManager}: initializes the map tools
+ *
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager = function () {
+    oVmap.log("nsVmap.nsToolsManager.ToolsManager");
+
+    var this_ = this;
+
+    /**
+     * Object which contains the tools tree
+     * @type {array<object>}
+     * @private
+     */
+    this.aToolsTree_ = this.loadSyncToolsTree();
+
+    /**
+     * Object which contains the basic tools
+     * @type {object}
+     * @private
+     */
+    this.oBasicTools_ = new nsVmap.nsToolsManager.BasicTools();
+
+    /**
+     * Object which contains the info container
+     * @type {object}
+     * @private
+     */
+    this.oInfoContainer_ = new nsVmap.nsToolsManager.InfoContainer();
+
+    // Instancie les classes des modules
+    this.instanciateAvaliableModules();
+};
+
+/**
+ * Instanciates all the avaliable modules
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.instanciateAvaliableModules = function () {
+    oVmap.log('nsVmap.nsToolsManager.ToolsManager.instanciateAvaliableModules');
+
+    var avaliableModules = Object.keys(nsVmap.nsToolsManager.nsModules);
+
+    oVmap.log("avaliableModules: ", avaliableModules);
+
+    for (var i = 0; i < avaliableModules.length; i++) {
+        this.instanciateModule(avaliableModules[i]);
+    }
+};
+
+/**
+ * Instanciate the given module
+ * @param {string} sTool
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.instanciateModule = function (sTool) {
+    oVmap.log('nsVmap.nsToolsManager.ToolsManager.instanciateModule');
+
+    // Met la première lettre en majuscule
+    sTool = sTool.toLowerCase().replace(/\b[a-z]/g, function (letter) {
+        return letter.toUpperCase();
+    });
+
+    if (goog.isDefAndNotNull(nsVmap.nsToolsManager.nsModules[sTool])) {
+        this[sTool] = new nsVmap.nsToolsManager.nsModules[sTool]();
+    } else {
+        console.error('tool (' + sTool + ') does not exist');
+    }
+};
+
+/************************************************
+ ---------- DIRECTIVES AND CONTROLLERS -----------
+ *************************************************/
+
+/**
+ * Basic tools Directive
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.BasicTools.prototype.vmapToolsDirective");
+    return {
+        restrict: 'E',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang',
+            'infos': '=appInfos',
+            'currentAction': '=appAction'
+        },
+        controller: 'AppVmaptoolsController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/tools.html'
+    };
+};
+
+/**
+ * tool-sidebar directive: write the tools directives divs
+ * @ngInject
+ * constructor
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsContainerDirective = function ($compile) {
+    return function (scope, element, attrs) {
+
+        scope['oToolsTree'] = oVmap.getToolsManager().getToolsTree();
+
+        for (var family in scope['oToolsTree']) {
+
+            var htmlTool = '';
+            var htmlFamily = '<div id="' + family + '-container" class="right-sidebar" ';
+            htmlFamily += 'ng-class="ctrl.openedTool == \'' + family + '\' ? \'open\' : \'\'">';
+
+            for (var tool in scope['oToolsTree'][family]) {
+                htmlTool += '<div id="' + tool + '-tool" class="side-tool ng-isolate-scope app-' + tool + '" ';
+                htmlTool += 'app-map="ctrl.map" app-lang="ctrl.lang" app-infos="ctrl.infos" app-action="ctrl.currentAction"></div>';
+            }
+
+            angular.element($('tools-container')).append($compile(htmlFamily + htmlTool + '</div>')(scope));
+        }
+    };
+};
+
+/**
+ * Basic tools Controller
+ * @export
+ * @constructor
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsController = function () {
+    oVmap.log("nsVmap.nsToolsManager.BasicTools.prototype.vmapToolsController");
+
+    this['oToolsTree'] = oVmap.getToolsManager().getToolsTree();
+    this['openedTool'] = '_';
+};
+
+
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+
+/**
+ * Load synchronally the tools tree from the json file
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.loadSyncToolsTree = function () {
+
+    var oToolsTree = {};
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vmap/usermodules',
+        'async': false,
+        'responseType': '',
+        'success': function (response) {
+            var data = JSON.parse(response['data']);
+            oToolsTree = data['usermodules'];
+        }
+    });
+    
+    return oToolsTree;
+};
+
+/**
+ * @returns {object} Tools tree
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.getToolsTree = function () {
+    return this.aToolsTree_;
+};
+
+/**
+ * nsVmap.toolsTree setter
+ * @param {object} tree Tools tree
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.setToolsTree = function (tree) {
+    this.aToolsTree_ = tree;
+};
+
+/**
+ * @returns {object<nsVmap.nsToolsManager.BasicTools>}
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.getBasicTools = function () {
+    return this.oBasicTools_;
+};
+
+/**
+ * @returns {object<nsVmap.nsToolsManager.InfoContainer>}
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.getInfoContainer = function () {
+    return this.oInfoContainer_;
+};
+
+/**
+ * Return a tool
+ * @param {string} tool name of the tool
+ * @return {object<nsVmap.nsToolsManager.tool>}
+ * @export
+ */
+nsVmap.nsToolsManager.ToolsManager.prototype.getTool = function (tool) {
+    return this[tool];
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appVmaptools', nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsDirective);
+oVmap.module.directive('toolsContainer', nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsContainerDirective);
+oVmap.module.controller('AppVmaptoolsController', nsVmap.nsToolsManager.ToolsManager.prototype.vmapToolsController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/urlexporter.js b/module/javascript/app/vmap/tools/urlexporter.js
new file mode 100644
index 0000000000000000000000000000000000000000..85e757f8f70c2bac1538b099482fd06940cec290
--- /dev/null
+++ b/module/javascript/app/vmap/tools/urlexporter.js
@@ -0,0 +1,140 @@
+/* global oVmap, nsVmap, goog, ol, vitisApp */
+
+/**
+ * @author: Anthony Borghi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Urlexporter
+ * cette classe permet à l'utilisateur d'exporter une url pour un autre utilisateur
+ */
+goog.provide('nsVmap.nsToolsManager.Urlexporter');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.VmapUser}
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Urlexporter = function () {
+    oVmap.log('nsVmap.nsToolsManager.Urlexporter');
+};
+
+
+
+/**
+ * Directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppUrlExporterController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'urlexporter_mobile.html' : 'urlexporter.html')
+    };
+};
+
+/**
+ * Controler
+ * @constructor
+ * @param {object} $scope
+ * @returns {undefined}
+ * @ngInject
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController = function ($scope, $q, $element) {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController");
+
+    var this_ = this;
+
+    this.$scope_ = $scope;
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * @type {string}
+     */
+    this["urlToExport"] = "";
+    /**
+     * @type {boolean}
+     */
+    this["usePublicToken"] = false;
+
+    this["urlConstructor"]();
+
+    // Affiche les modales en plein écran pour la version mobile
+    //if (oVmap['properties']['is_mobile']) {
+    //    $element.find('.modal').on('shown.bs.modal', function () {
+    //        $('.modal-backdrop.fade.in').hide();
+    //        $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+    //    });
+    //}
+
+    console.log(this['properties']);
+
+    // recalcule l'url quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        this_["urlConstructor"]();
+    });
+
+    $scope.$watch("ctrl.usePublicToken", function(){
+        this_["urlConstructor"]();
+    })
+
+    oVmap.getMap().getOLMap().on("moveend", function(event){
+        this_["urlConstructor"]();
+    });
+};
+
+/**
+ * Display the user form in display mode
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlConstructor = function () {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.urlConstructor");
+
+    var sUrl = this['properties']['web_server_name'] + "/" + this['properties']['application'];
+
+    if (goog.isDefAndNotNull(this['properties']['environment'])){
+        if (this['properties']['environment'] != ""){
+            sUrl += "_" + this['properties']['environment'];
+        }
+    }
+
+    sUrl += "?";
+
+    var oMapCatalog = oVmap.getMapManager().getMapCatalog();
+    var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
+
+    sUrl += "map_id=" + iMapId;
+
+    // si public add token
+    if (this["usePublicToken"]){
+        sUrl += "&token=" + this['properties']['public_token'];
+    }
+
+    // get extent and add in url
+    var sExtent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize()).join("|");
+    sUrl += "&extent=" + encodeURI(sExtent);
+
+    this["urlToExport"] = sUrl;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appUrlExporter', nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective);
+oVmap.module.controller('AppUrlExporterController', nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/tools/user.js b/module/javascript/app/vmap/tools/user.js
new file mode 100755
index 0000000000000000000000000000000000000000..ab93245fceb13e48c1566c1e194375196b2ca266
--- /dev/null
+++ b/module/javascript/app/vmap/tools/user.js
@@ -0,0 +1,191 @@
+/* global oVmap, nsVmap, goog, ol, vitisApp */
+
+/**
+ * @author: Armand Bahi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.VmapUser
+ * cette classe permet à l'utilisateur de se déconnecter et de voir les informations de son compte
+ */
+goog.provide('nsVmap.nsToolsManager.VmapUser');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.VmapUser}
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.VmapUser = function () {
+    oVmap.log('nsVmap.nsToolsManager.VmapUser');
+
+};
+// Obligatoire pour instancier dans nsVmap.nsToolsManager.ToolsManager
+goog.exportProperty(nsVmap.nsToolsManager, 'VmapUser', nsVmap.nsToolsManager.VmapUser);
+
+
+/**
+ * Directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.prototype.vmapuserDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppVmapUserController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'user_mobile.html' : 'user.html')
+    };
+};
+
+/**
+ * Controler
+ * @constructor
+ * @param {object} $scope
+ * @returns {undefined}
+ * @ngInject
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController = function ($scope, $q, $element) {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController");
+
+    $scope['sUserLoginText'] = sessionStorage['user_login'];
+
+    this.$scope_ = $scope;
+
+    this.$q_ = $q;
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    // Affiche les modales en plein écran pour la version mobile
+    if (oVmap['properties']['is_mobile']) {
+        $element.find('.modal').on('shown.bs.modal', function () {
+            $('.modal-backdrop.fade.in').hide();
+            $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+        });
+    }
+};
+
+/**
+ * Display the user form in display mode
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController.prototype.displayUserInfos = function () {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.vmapuserController.displayUserInfos");
+
+    var this_ = this;
+
+    // Récupère le formulaire
+    this.getUserForm_().then(function (oFormDefinition) {
+        // Récupère les valeurs
+        this_.getUserInfos_().then(function (oUserInfos) {
+
+            var oFormValues = {
+                'display': oUserInfos
+            };
+
+            // Affiche le formulaire
+            var userInfosFormReaderScope = this_.getUserInfos_FormReaderScope();
+            userInfosFormReaderScope.$evalAsync(function () {
+                userInfosFormReaderScope['ctrl']['setDefinitionName']('display');
+                userInfosFormReaderScope['ctrl']['setFormValues'](oFormValues);
+                userInfosFormReaderScope['ctrl']['setFormDefinition'](oFormDefinition);
+                userInfosFormReaderScope['ctrl']['loadForm']();
+                $('#basictools-user-form-reader-modal').modal('show');
+            });
+
+        });
+    });
+};
+
+/**
+ * Disconnect the current user
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController.prototype.disconnect = function () {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.vmapuserController.disconnect");
+
+    angular.element(vitisApp.appMainDrtv).scope()['disconnect']();
+};
+
+/**
+ * Get the user form in a promise
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController.prototype.getUserForm_ = function () {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.vmapuserController.getUserForm_");
+
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': 'modules/vitis/forms/user/user_vitis_user.json',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (goog.isDefAndNotNull(response['data'])) {
+                deferred.resolve(response['data']);
+            }
+        }
+    });
+    return deferred.promise;
+};
+
+/**
+ * Get the user infos in a promise
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController.prototype.getUserInfos_ = function () {
+    oVmap.log("nsVmap.nsToolsManager.VmapUser.vmapuserController.getUserInfos_");
+
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': oVmap['properties']['api_url'] + '/vitis/users/' + sessionStorage['user_id'],
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['data'])) {
+                    if (goog.isDefAndNotNull(response['data']['data'][0])) {
+                        deferred.resolve(response['data']['data'][0]);
+                    }
+                }
+            }
+        }
+    });
+    return deferred.promise;
+};
+
+/**
+ * Get the UserInfos FormReader scope
+ * @returns {angular.scope}
+ */
+nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController.prototype.getUserInfos_FormReaderScope = function () {
+    return angular.element($('#basictools-user-form-reader').children()).scope();
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appVmapUser', nsVmap.nsToolsManager.VmapUser.prototype.vmapuserDirective);
+oVmap.module.controller('AppVmapUserController', nsVmap.nsToolsManager.VmapUser.prototype.vmapuserController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/vmap.js b/module/javascript/app/vmap/vmap.js
new file mode 100644
index 0000000000000000000000000000000000000000..48dbc1bacdb92c117848b877817f120614ccbc71
--- /dev/null
+++ b/module/javascript/app/vmap/vmap.js
@@ -0,0 +1,1453 @@
+/* global goog, angular, nsVmap, less, bootbox, ol, vitisApp */
+/**
+ * @author: Armand Bahi
+ */
+//less.refresh();
+//G_testRunner.setStrict(false);
+
+goog.provide('oVmap');
+
+/**
+ * Vmap Object
+ * @type {object}
+ * @export
+ */
+var oVmap = {};
+
+/**
+ * Angular module
+ * @type {!angular.Module}
+ */
+oVmap.module = angular.module('vmap', ["formReader"]);
+
+/**
+ * Module config
+ *
+ * @param {angular.$httpProvider} $httpProvider Angular httpProvider service.
+ * @ngInject
+ */
+oVmap.config = function ($httpProvider) {
+
+    $httpProvider.defaults.headers.get = {
+        'Accept': 'application/x-vm-json'
+    };
+
+    $httpProvider.defaults.headers.post = {
+        'Accept': 'application/x-vm-json'
+    };
+
+};
+oVmap.module.config(oVmap.config);
+
+/**
+ * Filtre angular permettant de faire du orderBy sur des objets
+ * ex: ng-repeat="node in ctrl.oBusinessObjects | orderObjectBy:'bo_title'"
+ * @returns {Function}
+ */
+oVmap.orderObjectBy = function () {
+    return function (items, field, reverse) {
+        var filtered = [];
+        angular.forEach(items, function (item) {
+            filtered.push(item);
+        });
+        filtered.sort(function (a, b) {
+            return (a[field] > b[field] ? 1 : -1);
+        });
+        if (reverse)
+            filtered.reverse();
+        return filtered;
+    };
+
+};
+oVmap.module.filter('orderObjectBy', oVmap.orderObjectBy);
+
+/**
+ * Filtre angular permettant de connaitre le type d'un élément
+ * @returns {Function}
+ */
+oVmap.getType = function () {
+    return function (obj) {
+        return typeof obj;
+    };
+};
+oVmap.module.filter('getType', oVmap.getType);
+
+/**
+ * Filtre angular permettant de savoir si un élément est défini
+ * @returns {Function}
+ */
+oVmap.isDef = function () {
+    return function (obj) {
+        return goog.isDefAndNotNull(obj);
+    };
+};
+oVmap.module.filter('isDef', oVmap.isDef);
+
+/**
+ * Properties
+ * @type {object}
+ * @api stable
+ */
+oVmap.properties = {};
+
+/**
+ * Objet which contains the map
+ * @type {nsVmap.Map}
+ * @private
+ */
+oVmap.oMap_ = {};
+
+/**
+ * Objet which contains the layers tools (on the left band)
+ * @type {nsVmap.nsMapManager.MapManager}
+ * @private
+ */
+oVmap.oMapManager_ = {};
+
+/**
+ * Objet which contains the map tools (on the right band)
+ * @private
+ */
+oVmap.oToolsManager_ = {};
+
+/**
+ * Function to log messages
+ * @param {string} message message to log
+ * @param {string} message2 message to log
+ * @export
+ */
+oVmap.log = function (message, message2) {
+    if (goog.isDefAndNotNull(oVmap['properties'])) {
+        if (oVmap['properties']['debug_mode'])
+            if (goog.isDef(message2))
+                console.log(message, message2);
+            else
+                console.log(message);
+    }
+};
+
+/**
+ * Initialise Vmap
+ * @export
+ */
+oVmap.init = function () {
+    oVmap.log("oVmap.init");
+
+    vitisApp.broadcast('vmapLoaded');
+
+    var vMapLoaderScope = angular.element($('#app-vmap-loader')).scope();
+
+    if (goog.isDefAndNotNull(vMapLoaderScope)) {
+        angular.element($('#app-vmap-loader')).scope()['compileVmapTemplates']();
+    } else {
+        // Charge les template
+        vitisApp.on('vmapLoaderOk', function () {
+            angular.element($('#app-vmap-loader')).scope()['compileVmapTemplates']();
+        });
+    }
+
+    var url = window.location.href;
+    var indexOfLastFolder = url.lastIndexOf('/');
+    var vmap_folder = url.slice(0, indexOfLastFolder);
+
+    /**
+     * Nom de l'application
+     */
+    if (!goog.isDefAndNotNull(sessionStorage['application'])) {
+        sessionStorage['application'] = document.location.pathname.replace(/\//g, '');
+    }
+
+    oVmap['properties'] = window["oClientProperties"];
+    oVmap['properties']['api_url'] = oVmap['properties']['web_server_name'] + '/' + oVmap['properties']['services_alias'];
+
+    // Recherche si il y a le token dans l'url ou dans le session storage
+    oVmap['properties']['token'] = goog.isDef(sessionStorage['session_token']) ?
+            sessionStorage['session_token'] : oVmap.findInURL('token', window.location.href);
+
+    if (goog.isDefAndNotNull(oVmap['properties']['token'])) {
+
+        // Recupère les properties serveur
+        ajaxRequest({
+            'method': 'GET',
+            'url': oVmap['properties']['api_url'] + '/vitis/properties',
+            'async': false,
+            'responseType': '',
+            'success': function (response) {
+                var data = JSON.parse(response['data']);
+                goog.object.extend(oVmap['properties'], data);
+                oVmap.log("properties: ", oVmap['properties']);
+            }
+        });
+
+        // Recupère les projections dispo
+        ajaxRequest({
+            'method': 'GET',
+            'url': oVmap['properties']['api_url'] + '/vmap/crss',
+            'success': function (response) {
+                var aCrs = response['data']['crss'];
+                oVmap['oProjections'] = {};
+                for (var i = 0; i < aCrs.length; i++) {
+                    oVmap['oProjections'][aCrs[i]['crs_id']] = aCrs[i]['name'];
+                }
+            }
+        });
+
+    }
+
+    // Instenciation des objects Vmap
+    oVmap.oMap_ = new nsVmap.Map();
+    oVmap.oMapManager_ = new nsVmap.nsMapManager.MapManager();
+    oVmap.oToolsManager_ = new nsVmap.nsToolsManager.ToolsManager();
+
+    // Resize les outils du bandeau de gauche
+    oVmap.resizeAll();
+
+    // Resize les outils du bandeau de gauche lorsque la fenêtre se resize
+    $(window).resize(oVmap.resizeAll);
+
+    // Active l'ooutil tooltip
+    $('[data-toggle="tooltip"]').tooltip({animation: false});
+
+    // Incrémenté lors de l'appel à la fonction oVmap.displayNoTokenMessage
+    oVmap.noTokenMessage_ = 0;
+
+    // S'inscrit au service WebSocket VmapEvents
+    if (goog.isDefAndNotNull(vitisApp['oWebsocket'])) {
+        vitisApp['oWebsocket'].subscribeService('VmapEvents');
+    }
+
+};
+
+/**
+ * Vmap Directive
+ *
+ * @return {angular.Directive} The directive specs.
+ * @export
+ * @constructor
+ */
+oVmap.vmapDirective = function () {
+    oVmap.log("oVmap.vmapDirective");
+    vitisApp.broadcast('vmapDirectiveLoaded');
+    return {
+        restrict: 'A',
+        controller: 'AppVmapController',
+        controllerAs: 'vmapCtrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/vmap.html'
+    };
+};
+
+/**
+ * Vmap controller
+ *
+ * @constructor
+ * @ngInject
+ * @export
+ */
+oVmap.vmapController = function ($sanitize) {
+    oVmap.log("oVmap.vmapController");
+
+    var this_ = this;
+
+    /**
+     * Variable lang
+     * @type {string}
+     * @api stable
+     */
+    this.lang = this['lang'] = 'fr';
+
+    /**
+     * True if the panel is open
+     * @type {boolean}
+     * @api stable
+     */
+    this.left_open = this['left_open'] = false;
+
+    /**
+     * True if the panel is open
+     * @type {boolean}
+     * @api stable
+     */
+    this.right_open = this['right_open'] = false;
+
+    /**
+     * True if the panel is open
+     * @type {boolean}
+     * @api stable
+     */
+    this.bottom_open = this['bottom_open'] = false;
+
+    /**
+     * The OpenLayers map
+     * @type {ol.Map}
+     * @api stable
+     */
+    this.map = this['map'] = oVmap.getMap().getOLMap();
+
+    /**
+     * The current action on map
+     * @type {string}
+     * @api stable
+     */
+    this.currentAction = this['currentAction'] = '';
+
+    /**
+     * The OpenLayers map projection
+     * @type {string}
+     * @api stable
+     */
+    this.proj = this['proj'] = this.map.getView().getProjection().getCode();
+
+    /**
+     * The infoContainer infos
+     * @type {string}
+     * @api stable
+     */
+    this.infos = this['infos'] = [];
+
+    /**
+     * Root scope
+     */
+    oVmap['scope'] = angular.element('#app-vmap').scope();
+
+    /**
+     * Root controller
+     */
+    oVmap['ctrl'] = oVmap['scope']['vmapCtrl'];
+
+    oVmap['$sanitize'] = $sanitize;
+
+    // Usefull Functions
+
+    /**
+     * Return the size of the object|array
+     * @param {object|array} obj
+     * @returns {Number}
+     */
+    oVmap['scope']['sizeOf'] = function (obj) {
+        return Object.keys(obj).length;
+    };
+
+    /**
+     * Return true if the element is defined and not false
+     * @param {type} obj
+     * @returns {Boolean}
+     */
+    oVmap['scope']['isDef'] = function (obj) {
+        return goog.isDefAndNotNull(obj);
+    };
+
+    // Ferme le panier et le bandeau de droite quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        // Ferme le panier
+        oVmap['scope'].$applyAsync(function () {
+            oVmap['scope']['ctrl']['bottom_open'] = false;
+            oVmap.minResizeBottomBar();
+        });
+        // Ferme le bandeau de droite
+        oVmap.simuleClickOnClass('tool-btn-active');
+    });
+};
+
+/************************************************
+ ------------ GETTERS AND SETTERS ----------------
+ *************************************************/
+/**
+ * nsVmap.oMap_ getter
+ * @return {nsVmap.Map} Map to use
+ * @export
+ * @api experimental
+ */
+oVmap.getMap = function () {
+    return this.oMap_;
+};
+
+/**
+ * nsVmap.oMapManager_ getter
+ * @return {nsVmap.nsMapManager.MapManager} Tools fo layers
+ * @export
+ * @api experimental
+ */
+oVmap.getMapManager = function () {
+    return this.oMapManager_;
+};
+
+/**
+ * nsVmap.oToolsManager_ getter
+ * @return {nsVmap.nsToolsManager.ToolsManager} Tools for map
+ * @export
+ * @api experimental
+ */
+oVmap.getToolsManager = function () {
+    return this.oToolsManager_;
+};
+
+// Usefull Functions
+
+/**
+ * Function find attributes in url
+ * @param {string} element element to find
+ * @param {string} url url to parse
+ * @return {string} value of the element
+ * @export
+ */
+oVmap.findInURL = function (element, url) {
+
+    var elementIndexEnd = 0;
+
+    if (url.indexOf('?') === -1)
+        return undefined;
+
+    url = url.slice(url.indexOf('?') + 1);
+
+    if (url.indexOf(element + '=') === -1)
+        return undefined;
+
+    url = url.slice(url.indexOf(element + '='));
+
+    if (url.indexOf('&') !== -1) {
+        elementIndexEnd = url.indexOf('&');
+        url = url.slice(0, elementIndexEnd);
+    }
+
+    elementIndexEnd = url.indexOf('=');
+    url = url.slice(elementIndexEnd + 1);
+
+    return url;
+};
+
+/**
+ * Function called when a layer is added on the map by layerstree.js
+ */
+oVmap.layerAdded = function () {
+    // donne la valeur de la projection à l'outil current-projection
+    $("#current-projection").html(oVmap['oProjections'][oVmap.getMap().getOLMap().getView().getProjection().getCode()]);
+    var vMapCatalog = oVmap.getMapManager().getMapCatalog();
+    for (var i = 0; i < vMapCatalog['maps'].length; i++) {
+        if (vMapCatalog['maps'][i]['used'] === true) {
+            var currentMapName = vMapCatalog['maps'][i]['name'];
+        }
+    }
+    $("#map-name").html(currentMapName);
+};
+
+/**
+ * Function to move elements in array
+ * @param {array} array Array to change
+ * @param {integer} old_index Index of the element to move
+ * @param {integer} new_index Index where move the element
+ * @return {array} The new array
+ */
+oVmap.moveInArray = function (array, old_index, new_index) {
+    if (new_index >= array.length) {
+        var k = new_index - array.length;
+        while ((k--) + 1) {
+            array.push(undefined);
+        }
+    }
+    array.splice(new_index, 0, array.splice(old_index, 1)[0]);
+    return array;
+};
+
+/**
+ * Convert an object to csv
+ * @param {object} objArray object to convert
+ * @param {boolean} labels true if you want to include the labels in the first row
+ * @param {boolean} quotes true if you want to wrap the values in double quotes
+ */
+oVmap.JSON2CSV = function (objArray, labels, quotes) {
+    var array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
+    var str = '';
+    var line = '';
+    if (labels === true) {
+        var head = array[0];
+        if ($("#quote").is(':checked')) {
+            for (var index in array[0]) {
+                var value = index + "";
+                line += '"' + value.replace(/"/g, '""') + '",';
+            }
+        } else {
+            for (var index in array[0]) {
+                line += index + ',';
+            }
+        }
+        line = line.slice(0, -1);
+        str += line + '\r\n';
+    }
+    for (var i = 0; i < array.length; i++) {
+        var line = '';
+        if (quotes === true) {
+            for (var index in array[i]) {
+                var value = array[i][index] + "";
+                line += '"' + value.replace(/"/g, '""') + '",';
+            }
+        } else {
+            for (var index in array[i]) {
+                line += array[i][index] + ',';
+            }
+        }
+        line = line.slice(0, -1);
+        str += line + '\r\n';
+    }
+    return str;
+};
+
+/**
+ * Simule a click on a target by id
+ * @param {string} target id of the target
+ * @export
+ */
+oVmap.simuleClick = function (target) {
+    oVmap.log("simuleClick : " + target);
+    if (goog.isDefAndNotNull(document.getElementById(target))) {
+        var evt = document.createEvent("MouseEvents");
+        evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+        document.getElementById(target).dispatchEvent(evt);
+        var evt = document.createEvent("MouseEvents");
+        evt.initMouseEvent("mouseout", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+        document.getElementById(target).dispatchEvent(evt);
+    } else {
+        console.error('target undefined: ', target);
+    }
+};
+
+/**
+ * Simule a click on targets by class name
+ * @param {string} targets class of the targets
+ * @export
+ */
+oVmap.simuleClickOnClass = function (targets) {
+    oVmap.log("simuleClickOnClass : " + targets);
+    var evt = document.createEvent("MouseEvents");
+    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+    var aElements = document.getElementsByClassName(targets);
+    for (var i = 0; i < aElements.length; i++) {
+        aElements[i].dispatchEvent(evt);
+    }
+    var evt = document.createEvent("MouseEvents");
+    evt.initMouseEvent("mouseout", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+    aElements = document.getElementsByClassName(targets);
+    for (var i = 0; i < aElements.length; i++) {
+        aElements[i].dispatchEvent(evt);
+    }
+};
+
+/**
+ * Write a succes message under the layers tools
+ * @param {string} message message to display
+ * @param {string} target Target Id
+ * @export
+ */
+oVmap.displaySucces = function (message, target) {
+    $("#" + target).show();
+    var messageContainer = document.getElementById(target);
+    var numberOfChildren = messageContainer.getElementsByTagName('*').length;
+    var messageDiv = goog.dom.createDom('div', {'id': target + '_' + numberOfChildren,
+        'class': 'alert alert-warning', 'role': 'alert'}, null);
+    goog.dom.appendChild(messageContainer, messageDiv);
+    var closeMessageButton = goog.dom.createDom('button', {'class': 'close'}, "x");
+    closeMessageButton.onclick = function () {
+        $('#' + target + '_' + numberOfChildren).hide();
+    };
+    goog.dom.appendChild(messageDiv, closeMessageButton);
+    var messageDom = goog.dom.createDom('strong', null, message);
+    goog.dom.appendChild(messageDiv, messageDom);
+};
+
+/**
+ * Write a info message under the layers tools
+ * @param {string} message message to display
+ * @param {string} target Target Id
+ * @export
+ */
+oVmap.displayInfo = function (message, target) {
+    $("#" + target).show();
+    var messageContainer = document.getElementById(target);
+    var numberOfChildren = messageContainer.getElementsByTagName('*').length;
+    var messageDiv = goog.dom.createDom('div', {'id': target + '_' + numberOfChildren,
+        'class': 'alert alert-warning', 'role': 'alert'}, null);
+    goog.dom.appendChild(messageContainer, messageDiv);
+    var closeMessageButton = goog.dom.createDom('button', {'class': 'close'}, "x");
+    closeMessageButton.onclick = function () {
+        $("#" + target + '_' + numberOfChildren).hide();
+    };
+    goog.dom.appendChild(messageDiv, closeMessageButton);
+    var messageDom = goog.dom.createDom('strong', null, message);
+    goog.dom.appendChild(messageDiv, messageDom);
+};
+
+/**
+ * Write a warning message under the layers tools
+ * @param {string} message message to display
+ * @param {string} target Target Id
+ * @export
+ */
+oVmap.displayWarning = function (message, target) {
+    $("#" + target).show();
+    var messageContainer = document.getElementById(target);
+    var numberOfChildren = messageContainer.getElementsByTagName('*').length;
+    var messageDiv = goog.dom.createDom('div', {'id': target + '_' + numberOfChildren,
+        'class': 'alert alert-warning', 'role': 'alert'}, null);
+    goog.dom.appendChild(messageContainer, messageDiv);
+    var closeMessageButton = goog.dom.createDom('button', {'class': 'close'}, "x");
+    closeMessageButton.onclick = function () {
+        $("#" + target + '_' + numberOfChildren).hide();
+    };
+    goog.dom.appendChild(messageDiv, closeMessageButton);
+    var messageDom = goog.dom.createDom('strong', null, message);
+    goog.dom.appendChild(messageDiv, messageDom);
+};
+
+/**
+ * Write a error message under the layers tools
+ * @param {string} message Error message to display
+ * @param {string} target Target Id
+ * @export
+ */
+oVmap.displayError = function (message, target) {
+    message = "Erreur: " + message;
+    $("#" + target).show();
+    var messageContainer = document.getElementById(target);
+    var numberOfChildren = messageContainer.getElementsByTagName('*').length;
+    var messageDiv = goog.dom.createDom('div', {'id': target + '_' + numberOfChildren,
+        'class': 'alert alert-warning', 'role': 'alert'}, null);
+    goog.dom.appendChild(messageContainer, messageDiv);
+    var closeMessageButton = goog.dom.createDom('button', {'class': 'close'}, "x");
+    closeMessageButton.onclick = function () {
+        $("#" + target + '_' + numberOfChildren).hide();
+    };
+    goog.dom.appendChild(messageDiv, closeMessageButton);
+    var messageDom = goog.dom.createDom('strong', null, message);
+    goog.dom.appendChild(messageDiv, messageDom);
+};
+
+/**
+ *
+ * @param {object} opt_options
+ * @param {string|undefined} opt_options.target
+ * @param {string} opt_options.coordinates
+ * @param {string} opt_options.type ('top-left, top-right, bottom-left, bottom-right')
+ * @param {string} message
+ * @returns {string} messageDiv
+ * @export
+ */
+oVmap.displayTooltipError = function (opt_options, message) {
+
+    var offsetX = 0;
+    var offsetY = 0;
+
+    if (goog.isDef(opt_options.target)) {
+        $(opt_options.target).animate({opacity: 0}, 300, "linear")
+                .animate({opacity: 1}, 300, "linear")
+                .animate({opacity: 0}, 300, "linear")
+                .animate({opacity: 1}, 300, "linear")
+                .animate({opacity: 0}, 300, "linear")
+                .animate({opacity: 1}, 300, "linear");
+    }
+
+    // Récupère les coordonnées de la target
+    if (goog.isDef(opt_options.target)) {
+        var offset = $(opt_options.target).offset();
+        opt_options.coordinates = [offset.left, offset.top];
+    }
+
+    if (!goog.isDef(opt_options.coordinates))
+        return 0;
+
+    // Type par défaut
+    opt_options.type = goog.isDef(opt_options.type) ? opt_options.type : 'top-right';
+
+    var messageDiv = goog.dom.createDom('div', {'class': 'tooltip-error tooltip-error-' + opt_options.type, 'role': 'alert'}, null);
+    var messageDom = goog.dom.createDom('strong', null, message);
+
+    // Met la div dans le body
+    goog.dom.appendChild(document.body, messageDiv);
+    goog.dom.appendChild(messageDiv, messageDom);
+
+    // place la tooltip par rapport au target
+    if (opt_options.type === 'top-left') {
+
+        if (goog.isDef(opt_options.target))
+            offsetX = 0 - messageDiv.offsetWidth + 33;
+        else
+            offsetX = 0 - messageDiv.offsetWidth + 13;
+
+        offsetY = 0 - messageDiv.offsetHeight - 12;
+
+    } else if (opt_options.type === 'top-right') {
+
+        offsetX = $(opt_options.target).width() - 35;
+        offsetY = 0 - messageDiv.offsetHeight - 12;
+
+    } else if (opt_options.type === 'bottom-left') {
+
+        offsetX = 0 - messageDiv.offsetWidth + 33;
+        offsetY = $(opt_options.target).height() + 12;
+
+    } else if (opt_options.type === 'bottom-right') {
+
+        offsetX = $(opt_options.target).width() - 35;
+        offsetY = $(opt_options.target).height() + 12;
+
+    }
+
+    messageDiv.style.left = opt_options.coordinates[0] + offsetX + 'px';
+    messageDiv.style.top = opt_options.coordinates[1] + offsetY + 'px';
+
+    // Détruit la div lors su click ailleurs que sur la div
+    var bodyEvent = goog.events.listenOnce(document.body, goog.events.EventType.CLICK, function (evt) {
+        oVmap.log('remove error tooltip');
+        if (evt.target !== messageDiv)
+            document.body.removeChild(messageDiv);
+    });
+
+    return messageDiv;
+};
+
+/**
+ * Set the layers order tools max height
+ * @param {boolean} animate true if the function have to animate
+ * @export
+ * @api experimental
+ */
+oVmap.resizeLayerTools = function (animate) {
+    oVmap.log("oVmap.resizeLayerTools: " + animate);
+
+    if (oVmap['properties']['is_mobile']) {
+        return null;
+    }
+
+    if (goog.isDef(angular.element($('#olMap')).scope()))
+        angular.element($('#olMap')).scope()['ctrl'].startAnimation();
+
+    var aItems = ["layertree", "layersorder", "maplegendcontainer"];
+    var iMarge = 0;
+    var iNbCollapses = 0;
+    var iNbItems = aItems.length;
+    var iMaxHeight = 0;
+
+    /**
+     * Set collapste in/out and get if is collapse
+     * @param {string} id id of the html element
+     * @return {boolean} true if the element is not collapse
+     */
+    var getCollapse = function (id) {
+        if ($("#" + id).attr("collapse") === "out") {
+            return true;
+        } else
+            return false;
+    };
+
+    var setHeight = function (aItems, aMaxHeight, aHeight) {
+
+        var aBigElements = {
+            sItem: [],
+            iHeight: [],
+            iMaxHeight: []
+        };
+
+        var iOverHeight = 0;
+
+        // Cherche les elements qui sont plus grand que la normale
+        for (var i = 0; i < aItems.length; i++) {
+
+            // Si plus grand que la nourmale, on l'incrit dans un objet que l'on utilisera plus tard,
+            // Sinon on lui donne son animation
+            if ((aHeight[i] >= aMaxHeight[i]) && (getCollapse(aItems[i]) === false)) {
+                aBigElements.sItem.push(aItems[i]);
+                aBigElements.iHeight.push(aHeight[i]);
+                aBigElements.iMaxHeight.push(aMaxHeight[i]);
+            } else {
+                if (aMaxHeight[i] > aHeight[i])
+                    iOverHeight += (aMaxHeight[i] - aHeight[i]);
+
+                if (animate === true) {
+                    $("#" + aItems[i]).animate({"max-height": aMaxHeight[i]});
+                } else
+                    $("#" + aItems[i]).css({"max-height": aMaxHeight[i]});
+            }
+        }
+
+        // Pour les elements grands, on ajoute à leur max-height une part du blanc de façon à compenser tous les trous
+        for (var i = 0; i < aBigElements.sItem.length; i++) {
+            var heightToAdd = iOverHeight / aBigElements.sItem.length;
+            if (animate === true)
+                $("#" + aBigElements.sItem[i]).animate({"max-height": aBigElements.iMaxHeight[i] + heightToAdd});
+            else
+                $("#" + aBigElements.sItem[i]).css({"max-height": aBigElements.iMaxHeight[i] + heightToAdd});
+        }
+        ;
+    };
+
+    var headersHeight = $("#maplistlitle-container").height();
+
+    for (var i = 0; i < aItems.length; i++) {
+
+        // Calcule la hauteur des boutons
+        headersHeight += $("#" + aItems[i] + "-button").height();
+
+        // Compte le nombre de collapses
+        if (getCollapse(aItems[i]) === true)
+            iNbCollapses++;
+    }
+
+    var aMaxHeight = [];
+    var aHeight = [];
+
+    iMaxHeight = ($("#left-sidebar").height() - headersHeight) / (iNbItems - iNbCollapses) - iMarge;
+
+    // Donne la valeur max-height aux éléments correspondants
+    for (var i = 0; i < aItems.length; i++) {
+
+        // Récupère la hauteur théorique
+        aMaxHeight[i] = $("#" + aItems[i]).css("max-height");
+        $("#" + aItems[i]).css({"max-height": ""});
+        aHeight[i] = $("#" + aItems[i]).height();
+        $("#" + aItems[i]).css({"max-height": aMaxHeight[i]});
+
+        // Donne la valeur du max-height
+        if (getCollapse(aItems[i]) === false)
+            aMaxHeight[i] = iMaxHeight;
+        else
+            aMaxHeight[i] = 0;
+    }
+
+    setHeight(aItems, aMaxHeight, aHeight);
+};
+
+/**
+ * Print the content of an element
+ * @param {string} elem html element selector
+ * @export
+ */
+oVmap.printElem = function (elem) {
+    oVmap.log('print: ' + elem);
+
+    var this_ = this;
+
+    var data = $(elem).html();
+    this.printElemWindow_ = window.open('', 'Impression', 'height=400,width=600');
+    this.printElemWindow_.document.write('<html><head><title>Impression</title>');
+    /* stylesheet*/
+    this.printElemWindow_.document.write($("HEAD").html());
+    this.printElemWindow_.document.write('<style>.print-hidden{visibility: hidden !important;}</style>');
+    this.printElemWindow_.document.write('</head><body>');
+    this.printElemWindow_.document.write(data);
+    this.printElemWindow_.document.write('</body></html>');
+
+    setTimeout(function () {
+        this_.printElemWindow_.document.close(); // necessary for IE >= 10
+        this_.printElemWindow_.focus(); // necessary for IE >= 10
+        this_.printElemWindow_.print();
+        this_.printElemWindow_.close();
+    }, 500);
+
+
+};
+
+/**
+ * Resize the bottombar to 50%
+ * @export
+ */
+oVmap.maxResizeBottomBar = function () {
+    angular.element($('#olMap')).scope()['ctrl'].startAnimation();
+
+    $(".open-more-selection-info").toggleClass("reverse");
+
+    if (!$("#map-container").hasClass("open2")) {
+        $("#map-container").addClass("open2");
+        $("#bottombar").addClass("open2");
+    } else {
+        $("#map-container").removeClass("open2");
+        $("#bottombar").removeClass("open2");
+    }
+};
+
+/**
+ * Resize the bottombar to 25%
+ * @export
+ */
+oVmap.minResizeBottomBar = function () {
+    angular.element($('#olMap')).scope()['ctrl'].startAnimation();
+
+    if ($("#map-container").hasClass("open2")) {
+        $("#map-container").removeClass("open2");
+        $("#bottombar").removeClass("open2");
+        $(".open-more-selection-info").removeClass("reverse");
+    } else if ($("#map-container").hasClass("open")) {
+        $("#map-container").addClass("minus");
+    }
+};
+
+/**
+ * resize all
+ */
+oVmap.resizeAll = function () {
+    // resize le bandeau de gauche
+    oVmap.resizeLayerTools(false);
+};
+
+/**
+ * Get a multiple geom feature from an array of features
+ * @param {array} aFeatures
+ * @param {string} sType
+ * @returns {null|ol.Feature}
+ */
+oVmap.getMultiGeomFromSingleFeatures = function (aFeatures, sType) {
+    oVmap.log('getMultiGeomFromSingleFeatures');
+
+    var oOutputGeom, oInputGeom, aInputMultipleGeoms;
+    if (sType === 'MultiPoint') {
+        oOutputGeom = new ol.geom.MultiPoint();
+    } else if (sType === 'MultiLineString') {
+        oOutputGeom = new ol.geom.MultiLineString();
+    } else if (sType === 'MultiPolygon') {
+        oOutputGeom = new ol.geom.MultiPolygon();
+    } else {
+        console.error('startSelection: type (' + sType + ') not allowed');
+        return null;
+    }
+
+    for (var i = 0; i < aFeatures.length; i++) {
+        oInputGeom = aFeatures[i].getGeometry();
+
+        // oInputGeom est de type multi
+        if (oInputGeom.getType() === sType) {
+
+            if (sType === 'MultiPoint') {
+                aInputMultipleGeoms = oInputGeom.getPoints();
+            } else if (sType === 'MultiLineString') {
+                aInputMultipleGeoms = oInputGeom.getLineStrings();
+            } else if (sType === 'MultiPolygon') {
+                aInputMultipleGeoms = oInputGeom.getPolygons();
+            } else {
+                console.error('startSelection: type (' + sType + ') not allowed');
+                return null;
+            }
+
+            for (var ii = 0; ii < aInputMultipleGeoms.length; ii++) {
+
+                if (sType === 'MultiPoint') {
+                    oOutputGeom.appendPoint(aInputMultipleGeoms[ii]);
+                } else if (sType === 'MultiLineString') {
+                    oOutputGeom.appendLineString(aInputMultipleGeoms[ii]);
+                } else if (sType === 'MultiPolygon') {
+                    oOutputGeom.appendPolygon(aInputMultipleGeoms[ii]);
+                } else {
+                    console.error('startSelection: type (' + sType + ') not allowed');
+                    return null;
+                }
+            }
+        }
+
+        // oInputGeom est de type simple
+        if (oInputGeom.getType() === sType.substr(5)) {
+
+            if (sType === 'MultiPoint') {
+                oOutputGeom.appendPoint(oInputGeom);
+            } else if (sType === 'MultiLineString') {
+                oOutputGeom.appendLineString(oInputGeom);
+            } else if (sType === 'MultiPolygon') {
+                oOutputGeom.appendPolygon(oInputGeom);
+            } else {
+                console.error('startSelection: type (' + sType + ') not allowed');
+                return null;
+            }
+        }
+    }
+
+    var feature = new ol.Feature({
+        geometry: oOutputGeom
+    });
+
+    return feature;
+};
+
+/**
+ * Parse a WKT geom and a EPSG projection code to return an EWKT geometry
+ * @param {string} WKTGeom WKT Geom
+ * @param {string} EPSGProj EPSG Code
+ * @returns {string} EWKT Geom
+ * @export
+ */
+oVmap.getEWKTFromWKT = function (WKTGeom, EPSGProj) {
+    oVmap.log('getEWKTFromWKT');
+    return ol.getEWKTFromWKT(WKTGeom, EPSGProj);
+};
+
+/**
+ * Get a WKT with proj from an EWKT geom
+ * @param {string} EWKTGeom
+ * @returns {object}
+ * @export
+ */
+oVmap.getWKTFromEWKT = function (EWKTGeom) {
+    oVmap.log('getWKTFromEWKT');
+    return ol.getWKTFromEWKT(EWKTGeom);
+};
+
+/**
+ * Return an EWKT geometry from a geom and a proj
+ * @param {ol.geom.Geometry} geom
+ * @param {String|undefined} proj
+ * @returns {String} EWKT Geom
+ * @export
+ */
+oVmap.getEWKTFromGeom = function (geom, proj) {
+    oVmap.log('getEWKTFromGeom', geom);
+    proj = goog.isDefAndNotNull(proj) ? proj : oVmap.getMap().getOLMap().getView().getProjection().getCode();
+    return ol.getEWKTFromGeom(geom, proj);
+};
+
+/**
+ * Return true if EWKTGeom is an EWKT geometry
+ * @param {string} EWKTGeom
+ * @returns {boolean}
+ * @export
+ */
+oVmap.isEWKTGeom = function (EWKTGeom) {
+    oVmap.log('isEWKTGeom');
+    return ol.isEWKTGeom(EWKTGeom);
+};
+
+/**
+ * Return an OpenLayers geometry from a EWKT geom
+ * @param {string} EWKTGeom
+ * @param {string|undefined} proj
+ * @returns {ol.geom.Geometry}
+ * @export
+ */
+oVmap.getGeomFromEWKT = function (EWKTGeom, proj) {
+    oVmap.log('getGeomFromEWKT');
+    proj = goog.isDefAndNotNull(proj) ? proj : oVmap.getMap().getOLMap().getView().getProjection().getCode();
+    return ol.getGeomFromEWKT(EWKTGeom, proj);
+};
+
+/**
+ * Get all the loaded styles
+ * @returns {Array}
+ * @export
+ */
+oVmap.getStyles = function () {
+    var aStyles = [];
+    $('link[rel="stylesheet"]').each(function (i, ele) {
+        ajaxRequest({
+            'method': 'GET',
+            'url': $(this).attr('href'),
+            'async': false,
+            'responseType': '',
+            'success': function (response) {
+                var css = response['data'];
+                var style = document.createElement('style');
+                style.type = 'text/css';
+                if (style.styleSheet) {
+                    style.styleSheet.cssText = css;
+                } else {
+                    style.appendChild(document.createTextNode(css));
+                }
+                aStyles.push(style);
+            }
+        });
+    });
+    $('style').each(function (i, ele) {
+        var css = this.innerHTML;
+        var style = document.createElement('style');
+        style.type = 'text/css';
+        if (style.styleSheet) {
+            style.styleSheet.cssText = css;
+        } else {
+            style.appendChild(document.createTextNode(css));
+        }
+        aStyles.push(style);
+    });
+    return aStyles;
+};
+
+/**
+ * Generate a report
+ * @param {object} opt_options
+ * @param {string} opt_options.printReportId
+ * @param {string} opt_options.ids
+ * @export
+ */
+oVmap.generatePrintReport = function (opt_options) {
+    oVmap.log('oVmap.generatePrintReport');
+
+    if (!goog.isDefAndNotNull(opt_options['printReportId'])) {
+        console.error('generatePrintReport: opt_options.printReportId undefined');
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(opt_options['ids'])) {
+        console.error('generatePrintReport: opt_options.ids undefined');
+        return 0;
+    }
+
+    var printReportId = opt_options['printReportId'];
+    var aIds = opt_options['ids'];
+    var sIds = '';
+
+    for (var i = 0; i < aIds.length; i++) {
+        if (i > 0)
+            sIds += '|';
+        sIds += aIds[i];
+    }
+
+    // Ouvre la fenêtre d'impression
+    var printWindow = window.open("", '_blank', 'height=400,width=600');
+
+    // Si le navigateur bloque les fenêtres
+    if (!goog.isDefAndNotNull(printWindow)) {
+        $.notify('Fenêtre d\'impression bloquée par le navigateur', 'error');
+        return 0;
+    }
+    printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/vmap/printreportservices',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'printreport_id': printReportId,
+            'ids': sIds
+        },
+        'timeout': 5 * 60 * 1000,
+        'success': function (response) {
+
+            var bError = false;
+            if (!goog.isDefAndNotNull(response['data'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['printreportservices'])) {
+                bError = true;
+            } else if (!goog.isDefAndNotNull(response['data']['printreportservices']['fileurl'])) {
+                bError = true;
+            } else if (response['data']['status'] !== 1) {
+                bError = true;
+            }
+            if (bError) {
+                $.notify('Une erreur est survenue lors de l\'impression', 'error');
+                printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Une erreur est survenue lors de l\'impression</div>');
+                console.error("response: ", response);
+                return 0;
+            }
+
+            $.notify('Impression réussie', 'success');
+
+            // Ajoute les styles d'impression
+            var aStyles = oVmap.getStyles();
+            for (var i = 0; i < aStyles.length; i++) {
+                try {
+                    printWindow.document.head.appendChild(aStyles[i]);
+                } catch (e) {
+
+                }
+            }
+
+            // Ajoute le bouton d'impression
+            printWindow.document.body.style.textAlign = 'center';
+            printWindow.document.body.innerHTML = '<a href="' + response['data']['printreportservices']['fileurl'] + '" style="margin-top: calc(50vh - 46px);" class="btn btn-lg btn-primary btn-bs btn-outline" download>Télécharger le rapport</a>';
+
+        },
+        'error': function (response) {
+            $.notify('Une erreur est survenue lors de l\'impression', 'error');
+            printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px">Une erreur est survenue lors de l\'impression</div>');
+        }
+    });
+};
+
+/**
+ * Get if the item is a link to parse ex: [link href="https://www.google.fr" target="_blank"]Lien[/link]
+ * @param {String} item
+ * @param {String} tagIdentifier the indentifier inside the brackets ex: [link] or [bo_link]
+ * @returns {Boolean}
+ * @export
+ */
+oVmap.isLink = function (item, tagIdentifier) {
+    if (!goog.isDefAndNotNull(item)) {
+        return false;
+    }
+    if (!goog.isString(item)) {
+        return false;
+    }
+    tagIdentifier = goog.isDefAndNotNull(tagIdentifier) ? tagIdentifier : 'link';
+    if (item.indexOf('[' + tagIdentifier) !== -1 && item.indexOf('[/' + tagIdentifier + ']') !== -1) {
+        return true;
+    }
+
+    if (item.indexOf('<a') !== -1 && item.indexOf('</a>') !== -1) {
+        return true;
+    }
+
+
+    return false;
+};
+
+/**
+ * Parse a tagged link ex: [link href="https://www.google.fr" target="_blank"]Lien[/link]
+ * @param {String} sString
+ * @param {String} tagIdentifier the indentifier inside the brackets ex: [link] or [bo_link]
+ * @returns {String}
+ * @export
+ */
+oVmap.parseLink = function (sString, tagIdentifier) {
+    if (!goog.isDefAndNotNull(sString)) {
+        return '';
+    }
+    if (!goog.isString(sString)) {
+        return '';
+    }
+    tagIdentifier = goog.isDefAndNotNull(tagIdentifier) ? tagIdentifier : 'link';
+    var sLink = sString.substr(sString.indexOf('[' + tagIdentifier), sString.indexOf('[/' + tagIdentifier + ']') - sString.indexOf('[' + tagIdentifier) + 10);
+    var sLinkFirstTag = oVmap.getFirstLinkTag_(sLink);
+    var sLinkLastTag = '[/' + tagIdentifier + ']';
+    var sLinkContent = oVmap.getLinkContent_(sLink, sLinkFirstTag, sLinkLastTag);
+    var oLinkArgs = oVmap.getLinkTagArguments_(sLinkFirstTag);
+
+    var sHref = goog.isDefAndNotNull(oLinkArgs['href']) ? oLinkArgs['href'] : null;
+    var sTarget = goog.isDefAndNotNull(oLinkArgs['target']) ? oLinkArgs['target'] : '_blank';
+    var sContent = sLinkContent.length > 0 ? sLinkContent : sHref;
+
+    if (goog.isDefAndNotNull(sHref)) {
+        var sLink = '<a href="' + sHref + '" target="' + sTarget + '">' + sContent + '</a>';
+        return sLink;
+    } else {
+        console.error('cannot parse href');
+        return sString;
+    }
+};
+
+/**
+ * Parse a link and extract only good tags ex: <a href="https://www.google.fr" target="_blank">Lien</a>
+ * @param {String} sString
+ * @returns {String}
+ * @export
+ */
+oVmap.checkLink = function(sString){
+    if (!goog.isDefAndNotNull(sString)) {
+        return '';
+    }
+    if (!goog.isString(sString)) {
+        return '';
+    }
+    var sLink = sString.substr(sString.indexOf('<a'), sString.indexOf('</a>') - sString.indexOf('<a') + 10);
+    var sLinkFirstTag = oVmap.getFirstLinkTag_(sLink, '>');
+    var sLinkContent = oVmap.getLinkContent_(sLink, sLinkFirstTag, '</a>');
+    var oLinkArgs = oVmap.getLinkTagArguments_(sLinkFirstTag);
+    // extract only required tags (href and target)
+    var sHref = goog.isDefAndNotNull(oLinkArgs['href']) ? oLinkArgs['href'] : null;
+    var sTarget = goog.isDefAndNotNull(oLinkArgs['target']) ? oLinkArgs['target'] : '_blank';
+    var sContent = sLinkContent.length > 0 ? sLinkContent : sHref;
+
+    if (goog.isDefAndNotNull(sHref)) {
+        var sLink = '<a href="' + sHref + '" target="' + sTarget + '">' + sContent + '</a>';
+        return sLink;
+    } else {
+        console.error('cannot parse href');
+        // return empty string to avoid Javascript injection
+        return "";
+    }
+}
+
+
+/**
+ * Get the first tag
+ * @param {String} sLink
+ * @returns {String}
+ */
+oVmap.getFirstLinkTag_ = function (sLink, sLinkTagToFind) {
+
+    var quoteIndex1 = null;
+    var quoteIndex2 = null;
+    var bInArgument = false;
+    var sLinkFirstTag = '';
+
+    sLinkTagToFind = (goog.isDefAndNotNull(sLinkTagToFind)) ? sLinkTagToFind : ']';
+
+    for (var i = 0; i < sLink.length; i++) {
+        sLinkFirstTag += sLink[i];
+        if (sLink[i] === '"') {
+            if (quoteIndex1 === null) {
+                if (sLink[i - 1] !== '\\') {
+                    quoteIndex1 = i;
+                    continue;
+                }
+            }
+        }
+        if (sLink[i] === '"') {
+            if (quoteIndex2 === null && quoteIndex1 !== null) {
+                if (sLink[i - 1] !== '\\') {
+                    quoteIndex2 = i;
+                    continue;
+                }
+            }
+        }
+
+        if (quoteIndex1 !== null && quoteIndex2 === null) {
+            bInArgument = true;
+        } else {
+            bInArgument = false;
+            if (quoteIndex1 !== null && quoteIndex2 !== null) {
+                quoteIndex1 = null;
+                quoteIndex2 = null;
+            }
+        }
+
+        if (!bInArgument && sLink[i] === sLinkTagToFind) {
+            break;
+        }
+    }
+    return sLinkFirstTag;
+};
+
+/**
+ * Get the content
+ * @param {String} sLink
+ * @param {String} sLinkFirstTag
+ * @param {String} sLinkLastTag
+ * @returns {unresolved}
+ */
+oVmap.getLinkContent_ = function (sLink, sLinkFirstTag, sLinkLastTag) {
+
+    // sLink sans le premier tag
+    var content1 = sLink.substr(sLink.indexOf(sLinkFirstTag) + sLinkFirstTag.length);
+    // Contenu
+    var content = content1.substr(0, content1.indexOf(sLinkLastTag));
+    return content;
+};
+
+/**
+ * Get the arguments
+ * @param {String} sLinkTag
+ * @returns {Object}
+ */
+oVmap.getLinkTagArguments_ = function (sLinkTag) {
+
+    var quoteIndex1 = null;
+    var quoteIndex2 = null;
+    var spaceIndex = null;
+    var equalIndex = null;
+    var content = null;
+    var argument = null;
+    var bInArgument = false;
+    var oArguments = {};
+
+    for (var i = 0; i < sLinkTag.length; i++) {
+
+        if (sLinkTag[i] === '"') {
+            if (quoteIndex1 === null) {
+                if (sLinkTag[i - 1] !== '\\') {
+                    quoteIndex1 = i;
+                    continue;
+                }
+            }
+        }
+        if (sLinkTag[i] === '"') {
+            if (quoteIndex2 === null && quoteIndex1 !== null) {
+                if (sLinkTag[i - 1] !== '\\') {
+                    quoteIndex2 = i;
+                    continue;
+                }
+            }
+        }
+
+        if (quoteIndex1 !== null && quoteIndex2 === null) {
+            bInArgument = true;
+        } else {
+            bInArgument = false;
+            if (quoteIndex1 !== null && quoteIndex2 !== null) {
+                content = sLinkTag.substr(quoteIndex1 + 1, quoteIndex2 - quoteIndex1 - 1);
+                quoteIndex1 = null;
+                quoteIndex2 = null;
+            }
+        }
+
+        if (!bInArgument) {
+            if (sLinkTag[i] === ' ') {
+                if (spaceIndex === null) {
+                    spaceIndex = i;
+                }
+            }
+            if (sLinkTag[i] === '=') {
+                if (equalIndex === null) {
+                    equalIndex = i;
+                }
+            }
+
+            if (spaceIndex !== null && equalIndex !== null) {
+                argument = sLinkTag.substr(spaceIndex + 1, equalIndex - spaceIndex - 1);
+                spaceIndex = null;
+                equalIndex = null;
+            }
+        }
+
+        if (content !== null && argument !== null) {
+            oArguments[argument] = content;
+            content = null;
+            argument = null;
+        }
+    }
+    return oArguments;
+};
+
+/**
+ * Download a blob in a file
+ * @param {object} oBlob
+ * @param {string} sFileName
+ * @export
+ */
+oVmap.downloadBlob = function (oBlob, sFileName) {
+
+    // IE
+    if (window.navigator['msSaveOrOpenBlob']) {
+        window.navigator['msSaveOrOpenBlob'](oBlob, sFileName);
+    }
+    // Others
+    else {
+        var a = document.createElement("a");
+        var url = window.URL.createObjectURL(oBlob);
+        document.body.appendChild(a);
+        a.style = "display: none";
+        a.href = url;
+        a.download = sFileName;
+        a.click();
+        window.URL.revokeObjectURL(url);
+    }
+};
+
+/**
+ * appVmapLoaderDrtv directive.
+ * Charge les template vMap en utilisant compileVmapTemplates
+ * @param {service} $compile
+ * @param {service} $log
+ * @ngInject
+ */
+oVmap.appVmapLoaderDrtv = function ($compile, $log) {
+    return {
+        link: function (scope, element, attrs) {
+            $log.log("formReader.appSubformDrtv.link");
+
+            var content;
+            var template = '<div app-vmap id="app-vmap"></div>';
+
+            scope['compileVmapTemplates'] = function () {
+                $log.log("compileVmapTemplates");
+
+                scope.$applyAsync(function () {
+                    // compile the provided template against the current scope
+                    content = $compile(template)(scope);
+                    // add the template content
+                    element.html("");
+                    element.append(content);
+
+                });
+            };
+            vitisApp.broadcast('vmapLoaderOk');
+        }
+    };
+};
+oVmap.module.directive("appVmapLoader", oVmap.appVmapLoaderDrtv);
+
+// Définit la directive et le controller
+oVmap.module.directive('appVmap', oVmap.vmapDirective);
+oVmap.module.controller('AppVmapController', oVmap.vmapController);
diff --git a/module/javascript/app/vmap/vmap.jsdoc b/module/javascript/app/vmap/vmap.jsdoc
new file mode 100755
index 0000000000000000000000000000000000000000..4866b8a95083432281c08ed64833cc52cea283db
--- /dev/null
+++ b/module/javascript/app/vmap/vmap.jsdoc
@@ -0,0 +1,25 @@
+/**
+* @author: Armand Bahi
+* This file allow namespaces on the jsdoc
+*/
+
+
+
+/**
+* @namespace nsVmap
+*/
+
+/**
+* Objet which contains the layers tools (on the left band)
+* @namespace nsVmap.nsMapManager
+*/
+
+/**
+* Objet which contains the layers tools modal
+* @namespace nsVmap.nsMapManager.nsMapModal
+*/
+
+/**
+* Objet which contains the map tools (on the right band)
+* @namespace nsVmap.nsToolsManager
+*/
diff --git a/module/javascript/externs/bootstrap-table/LICENSE b/module/javascript/externs/bootstrap-table/LICENSE
new file mode 100755
index 0000000000000000000000000000000000000000..2989272e93fca795b79936a2784e5c9b5c05e9da
--- /dev/null
+++ b/module/javascript/externs/bootstrap-table/LICENSE
@@ -0,0 +1,21 @@
+(The MIT License)
+
+Copyright (c) 2012-2016 Zhixin Wen <wenzhixin2010@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.
\ No newline at end of file
diff --git a/module/javascript/externs/bootstrap-table/bootstrap-table-export.js b/module/javascript/externs/bootstrap-table/bootstrap-table-export.js
new file mode 100755
index 0000000000000000000000000000000000000000..80c35898602e3966bc5fdecb39f3ffb583de5e7c
--- /dev/null
+++ b/module/javascript/externs/bootstrap-table/bootstrap-table-export.js
@@ -0,0 +1,103 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * extensions: https://github.com/kayalshri/tableExport.jquery.plugin
+ */
+
+(function ($) {
+    'use strict';
+
+    var TYPE_NAME = {
+        json: 'JSON',
+        xml: 'XML',
+        png: 'PNG',
+        csv: 'CSV',
+        txt: 'TXT',
+        sql: 'SQL',
+        doc: 'MS-Word',
+        excel: 'Ms-Excel',
+        powerpoint: 'Ms-Powerpoint',
+        pdf: 'PDF'
+    };
+
+    $.extend($.fn.bootstrapTable.defaults, {
+        showExport: false,
+        exportDataType: 'basic', // basic, all, selected
+        // 'json', 'xml', 'png', 'csv', 'txt', 'sql', 'doc', 'excel', 'powerpoint', 'pdf'
+        exportTypes: ['json', 'xml', 'csv', 'txt', 'sql', 'excel'],
+        exportOptions: {}
+    });
+
+    var BootstrapTable = $.fn.bootstrapTable.Constructor,
+        _initToolbar = BootstrapTable.prototype.initToolbar;
+
+    BootstrapTable.prototype.initToolbar = function () {
+        this.showToolbar = this.options.showExport;
+
+        _initToolbar.apply(this, Array.prototype.slice.apply(arguments));
+
+        if (this.options.showExport) {
+            var that = this,
+                $btnGroup = this.$toolbar.find('>.btn-group'),
+                $export = $btnGroup.find('div.export');
+
+            if (!$export.length) {
+                $export = $([
+                    '<div class="export btn-group">',
+                        '<button class="btn btn-default dropdown-toggle" ' +
+                            'data-toggle="dropdown" type="button">',
+                            '<i class="glyphicon glyphicon-export icon-share"></i> ',
+                            '<span class="caret"></span>',
+                        '</button>',
+                        '<ul class="dropdown-menu" role="menu">',
+                        '</ul>',
+                    '</div>'].join('')).appendTo($btnGroup);
+
+                var $menu = $export.find('.dropdown-menu'),
+                    exportTypes = this.options.exportTypes;
+
+                if (typeof this.options.exportTypes === 'string') {
+                    var types = this.options.exportTypes.slice(1, -1).replace(/ /g, '').split(',');
+
+                    exportTypes = [];
+                    $.each(types, function (i, value) {
+                        exportTypes.push(value.slice(1, -1));
+                    });
+                }
+                $.each(exportTypes, function (i, type) {
+                    if (TYPE_NAME.hasOwnProperty(type)) {
+                        $menu.append(['<li data-type="' + type + '">',
+                                '<a href="javascript:void(0)">',
+                                    TYPE_NAME[type],
+                                '</a>',
+                            '</li>'].join(''));
+                    }
+                });
+
+                $menu.find('li').click(function () {
+                    var type = $(this).data('type'),
+                        doExport = function () {
+                            that.$el.tableExport($.extend({}, that.options.exportOptions, {
+                                type: type,
+                                escape: false
+                            }));
+                        };
+
+                    if (that.options.exportDataType === 'all' && that.options.pagination) {
+                        that.togglePagination();
+                        doExport();
+                        that.togglePagination();
+                    } else if (that.options.exportDataType === 'selected') {
+                        var data = that.getData(),
+                            selectedData = that.getAllSelections();
+
+                        that.load(selectedData);
+                        doExport();
+                        that.load(data);
+                    } else {
+                        doExport();
+                    }
+                });
+            }
+        }
+    };
+})(jQuery);
\ No newline at end of file
diff --git a/module/javascript/externs/bootstrap-table/bootstrap-table.js b/module/javascript/externs/bootstrap-table/bootstrap-table.js
new file mode 100755
index 0000000000000000000000000000000000000000..87d2b5f2d699aeed778465df0449d20915ae04a2
--- /dev/null
+++ b/module/javascript/externs/bootstrap-table/bootstrap-table.js
@@ -0,0 +1,2679 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * version: 1.9.0
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+!function ($) {
+    'use strict';
+
+    // TOOLS DEFINITION
+    // ======================
+
+    var cachedWidth = null;
+
+    // it only does '%s', and return '' when arguments are undefined
+    var sprintf = function (str) {
+        var args = arguments,
+            flag = true,
+            i = 1;
+
+        str = str.replace(/%s/g, function () {
+            var arg = args[i++];
+
+            if (typeof arg === 'undefined') {
+                flag = false;
+                return '';
+            }
+            return arg;
+        });
+        return flag ? str : '';
+    };
+
+    var getPropertyFromOther = function (list, from, to, value) {
+        var result = '';
+        $.each(list, function (i, item) {
+            if (item[from] === value) {
+                result = item[to];
+                return false;
+            }
+            return true;
+        });
+        return result;
+    };
+
+    var getFieldIndex = function (columns, field) {
+        var index = -1;
+
+        $.each(columns, function (i, column) {
+            if (column.field === field) {
+                index = i;
+                return false;
+            }
+            return true;
+        });
+        return index;
+    };
+
+    // http://jsfiddle.net/wenyi/47nz7ez9/3/
+    var setFieldIndex = function (columns) {
+        var i, j, k,
+            totalCol = 0,
+            flag = [];
+
+        for (i = 0; i < columns[0].length; i++) {
+            totalCol += columns[0][i].colspan || 1;
+        }
+
+        for (i = 0; i < columns.length; i++) {
+            flag[i] = [];
+            for (j = 0; j < totalCol; j++) {
+                flag[i][j] = false;
+            }
+        }
+
+        for (i = 0; i < columns.length; i++) {
+            for (j = 0; j < columns[i].length; j++) {
+                var r = columns[i][j],
+                    rowspan = r.rowspan || 1,
+                    colspan = r.colspan || 1,
+                    index = $.inArray(false, flag[i]);
+
+                if (colspan === 1) {
+                    r.fieldIndex = index;
+                    // when field is undefined, use index instead
+                    if (typeof r.field === 'undefined') {
+                        r.field = index;
+                    }
+                }
+
+                for (k = 0; k < rowspan; k++) {
+                    flag[i + k][index] = true;
+                }
+                for (k = 0; k < colspan; k++) {
+                    flag[i][index + k] = true;
+                }
+            }
+        }
+    };
+
+    var getScrollBarWidth = function () {
+        if (cachedWidth === null) {
+            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
+                outer = $('<div/>').addClass('fixed-table-scroll-outer'),
+                w1, w2;
+
+            outer.append(inner);
+            $('body').append(outer);
+
+            w1 = inner[0].offsetWidth;
+            outer.css('overflow', 'scroll');
+            w2 = inner[0].offsetWidth;
+
+            if (w1 === w2) {
+                w2 = outer[0].clientWidth;
+            }
+
+            outer.remove();
+            cachedWidth = w1 - w2;
+        }
+        return cachedWidth;
+    };
+
+    var calculateObjectValue = function (self, name, args, defaultValue) {
+        var func = name;
+
+        if (typeof name === 'string') {
+            // support obj.func1.func2
+            var names = name.split('.');
+
+            if (names.length > 1) {
+                func = window;
+                $.each(names, function (i, f) {
+                    func = func[f];
+                });
+            } else {
+                func = window[name];
+            }
+        }
+        if (typeof func === 'object') {
+            return func;
+        }
+        if (typeof func === 'function') {
+            return func.apply(self, args);
+        }
+        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
+            return sprintf.apply(this, [name].concat(args));
+        }
+        return defaultValue;
+    };
+
+    var compareObjects = function (objectA, objectB, compareLength) {
+        // Create arrays of property names
+        var objectAProperties = Object.getOwnPropertyNames(objectA),
+            objectBProperties = Object.getOwnPropertyNames(objectB),
+            propName = '';
+
+        if (compareLength) {
+            // If number of properties is different, objects are not equivalent
+            if (objectAProperties.length !== objectBProperties.length) {
+                return false;
+            }
+        }
+
+        for (var i = 0; i < objectAProperties.length; i++) {
+            propName = objectAProperties[i];
+
+            // If the property is not in the object B properties, continue with the next property
+            if ($.inArray(propName, objectBProperties) > -1) {
+                // If values of same property are not equal, objects are not equivalent
+                if (objectA[propName] !== objectB[propName]) {
+                    return false;
+                }
+            }
+        }
+
+        // If we made it this far, objects are considered equivalent
+        return true;
+    };
+
+    var escapeHTML = function (text) {
+        if (typeof text === 'string') {
+            return text
+                .replace(/&/g, "&amp;")
+                .replace(/</g, "&lt;")
+                .replace(/>/g, "&gt;")
+                .replace(/"/g, "&quot;")
+                .replace(/'/g, "&#039;");
+        }
+        return text;
+    };
+
+    var getRealHeight = function ($el) {
+        var height = 0;
+        $el.children().each(function () {
+            if (height < $(this).outerHeight(true)) {
+                height = $(this).outerHeight(true);
+            }
+        });
+        return height;
+    };
+
+    var getRealDataAttr = function (dataAttr) {
+        for (var attr in dataAttr) {
+            var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
+            if (auxAttr !== attr) {
+                dataAttr[auxAttr] = dataAttr[attr];
+                delete dataAttr[attr];
+            }
+        }
+
+        return dataAttr;
+    };
+
+    var getItemField = function (item, field) {
+        var value = item;
+
+        if (typeof field !== 'string' || item.hasOwnProperty(field)) {
+            return item[field];
+        }
+        var props = field.split('.');
+        for (var p in props) {
+            value = value[props[p]];
+        }
+        return value;
+    };
+
+    // BOOTSTRAP TABLE CLASS DEFINITION
+    // ======================
+
+    var BootstrapTable = function (el, options) {
+        this.options = options;
+        this.$el = $(el);
+        this.$el_ = this.$el.clone();
+        this.timeoutId_ = 0;
+        this.timeoutFooter_ = 0;
+
+        this.init();
+    };
+
+    BootstrapTable.DEFAULTS = {
+        classes: 'table table-hover',
+        locale: undefined,
+        height: undefined,
+        undefinedText: '-',
+        sortName: undefined,
+        sortOrder: 'asc',
+        striped: false,
+        columns: [[]],
+        data: [],
+        dataField: 'rows',
+        method: 'get',
+        url: undefined,
+        ajax: undefined,
+        cache: true,
+        contentType: 'application/json',
+        dataType: 'json',
+        ajaxOptions: {},
+        queryParams: function (params) {
+            return params;
+        },
+        queryParamsType: 'limit', // undefined
+        responseHandler: function (res) {
+            return res;
+        },
+        pagination: false,
+        sidePagination: 'client', // client or server
+        totalRows: 0, // server side need to set
+        pageNumber: 1,
+        pageSize: 10,
+        pageList: [10, 25, 50, 100],
+        paginationHAlign: 'right', //right, left
+        paginationVAlign: 'bottom', //bottom, top, both
+        paginationDetailHAlign: 'left', //right, left
+        paginationFirstText: '&laquo;',
+        paginationPreText: '&lsaquo;',
+        paginationNextText: '&rsaquo;',
+        paginationLastText: '&raquo;',
+        search: false,
+        strictSearch: false,
+        searchAlign: 'right',
+        selectItemName: 'btSelectItem',
+        showHeader: true,
+        showFooter: false,
+        showColumns: false,
+        showPaginationSwitch: false,
+        showRefresh: false,
+        showToggle: false,
+        buttonsAlign: 'right',
+        smartDisplay: true,
+        minimumCountColumns: 1,
+        idField: undefined,
+        uniqueId: undefined,
+        cardView: false,
+        detailView: false,
+        detailFormatter: function (index, row) {
+            return '';
+        },
+        trimOnSearch: true,
+        clickToSelect: false,
+        singleSelect: false,
+        toolbar: undefined,
+        toolbarAlign: 'left',
+        checkboxHeader: true,
+        sortable: true,
+        silentSort: true,
+        maintainSelected: false,
+        searchTimeOut: 500,
+        searchText: '',
+        iconSize: undefined,
+        iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)
+        icons: {
+            paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
+            paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
+            refresh: 'glyphicon-refresh icon-refresh',
+            toggle: 'glyphicon-list-alt icon-list-alt',
+            columns: 'glyphicon-th icon-th',
+            detailOpen: 'glyphicon-plus icon-plus',
+            detailClose: 'glyphicon-minus icon-minus'
+        },
+
+        rowStyle: function (row, index) {
+            return {};
+        },
+
+        rowAttributes: function (row, index) {
+            return {};
+        },
+
+        onAll: function (name, args) {
+            return false;
+        },
+        onClickCell: function (field, value, row, $element) {
+            return false;
+        },
+        onDblClickCell: function (field, value, row, $element) {
+            return false;
+        },
+        onClickRow: function (item, $element) {
+            return false;
+        },
+        onDblClickRow: function (item, $element) {
+            return false;
+        },
+        onSort: function (name, order) {
+            return false;
+        },
+        onCheck: function (row) {
+            return false;
+        },
+        onUncheck: function (row) {
+            return false;
+        },
+        onCheckAll: function (rows) {
+            return false;
+        },
+        onUncheckAll: function (rows) {
+            return false;
+        },
+        onCheckSome: function (rows) {
+            return false;
+        },
+        onUncheckSome: function (rows) {
+            return false;
+        },
+        onLoadSuccess: function (data) {
+            return false;
+        },
+        onLoadError: function (status) {
+            return false;
+        },
+        onColumnSwitch: function (field, checked) {
+            return false;
+        },
+        onPageChange: function (number, size) {
+            return false;
+        },
+        onSearch: function (text) {
+            return false;
+        },
+        onToggle: function (cardView) {
+            return false;
+        },
+        onPreBody: function (data) {
+            return false;
+        },
+        onPostBody: function () {
+            return false;
+        },
+        onPostHeader: function () {
+            return false;
+        },
+        onExpandRow: function (index, row, $detail) {
+            return false;
+        },
+        onCollapseRow: function (index, row) {
+            return false;
+        },
+        onRefreshOptions: function (options) {
+            return false;
+        },
+        onResetView: function () {
+            return false;
+        }
+    };
+
+    BootstrapTable.LOCALES = [];
+
+    BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
+        formatLoadingMessage: function () {
+            return 'Loading, please wait...';
+        },
+        formatRecordsPerPage: function (pageNumber) {
+            return sprintf('%s records per page', pageNumber);
+        },
+        formatShowingRows: function (pageFrom, pageTo, totalRows) {
+            return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);
+        },
+        formatSearch: function () {
+            return 'Search';
+        },
+        formatNoMatches: function () {
+            return 'No matching records found';
+        },
+        formatPaginationSwitch: function () {
+            return 'Hide/Show pagination';
+        },
+        formatRefresh: function () {
+            return 'Refresh';
+        },
+        formatToggle: function () {
+            return 'Toggle';
+        },
+        formatColumns: function () {
+            return 'Columns';
+        },
+        formatAllRows: function () {
+            return 'All';
+        }
+    };
+
+    BootstrapTable.LOCALES['fr-FR'] = BootstrapTable.LOCALES['fr'] = {
+        formatLoadingMessage: function () {
+            return 'Chargement en cours...';
+        },
+        formatRecordsPerPage: function (pageNumber) {
+            return sprintf('%s résulatats par gage', pageNumber);
+        },
+        formatShowingRows: function (pageFrom, pageTo, totalRows) {
+            return sprintf('Affichage de %s sur %s sur un total de %s éléments', pageFrom, pageTo, totalRows);
+        },
+        formatSearch: function () {
+            return 'Rechercher';
+        },
+        formatNoMatches: function () {
+            return 'Aucun résultat';
+        },
+        formatPaginationSwitch: function () {
+            return 'Voir/Cacher pagination';
+        },
+        formatRefresh: function () {
+            return 'Recharger';
+        },
+        formatToggle: function () {
+            return 'Basculer';
+        },
+        formatColumns: function () {
+            return 'Colonnes';
+        },
+        formatAllRows: function () {
+            return 'Tout';
+        }
+    };
+
+//    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);
+    $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['fr-FR']);
+
+    BootstrapTable.COLUMN_DEFAULTS = {
+        radio: false,
+        checkbox: false,
+        checkboxEnabled: true,
+        field: undefined,
+        title: undefined,
+        titleTooltip: undefined,
+        'class': undefined,
+        align: undefined, // left, right, center
+        halign: undefined, // left, right, center
+        falign: undefined, // left, right, center
+        valign: undefined, // top, middle, bottom
+        width: undefined,
+        sortable: false,
+        order: 'asc', // asc, desc
+        visible: true,
+        switchable: true,
+        clickToSelect: true,
+        formatter: undefined,
+        footerFormatter: undefined,
+        events: undefined,
+        sorter: undefined,
+        sortName: undefined,
+        cellStyle: undefined,
+        searchable: true,
+        searchFormatter: true,
+        cardVisible: true
+    };
+
+    BootstrapTable.EVENTS = {
+        'all.bs.table': 'onAll',
+        'click-cell.bs.table': 'onClickCell',
+        'dbl-click-cell.bs.table': 'onDblClickCell',
+        'click-row.bs.table': 'onClickRow',
+        'dbl-click-row.bs.table': 'onDblClickRow',
+        'sort.bs.table': 'onSort',
+        'check.bs.table': 'onCheck',
+        'uncheck.bs.table': 'onUncheck',
+        'check-all.bs.table': 'onCheckAll',
+        'uncheck-all.bs.table': 'onUncheckAll',
+        'check-some.bs.table': 'onCheckSome',
+        'uncheck-some.bs.table': 'onUncheckSome',
+        'load-success.bs.table': 'onLoadSuccess',
+        'load-error.bs.table': 'onLoadError',
+        'column-switch.bs.table': 'onColumnSwitch',
+        'page-change.bs.table': 'onPageChange',
+        'search.bs.table': 'onSearch',
+        'toggle.bs.table': 'onToggle',
+        'pre-body.bs.table': 'onPreBody',
+        'post-body.bs.table': 'onPostBody',
+        'post-header.bs.table': 'onPostHeader',
+        'expand-row.bs.table': 'onExpandRow',
+        'collapse-row.bs.table': 'onCollapseRow',
+        'refresh-options.bs.table': 'onRefreshOptions',
+        'reset-view.bs.table': 'onResetView'
+    };
+
+    BootstrapTable.prototype.init = function () {
+        this.initLocale();
+        this.initContainer();
+        this.initTable();
+        this.initHeader();
+        this.initData();
+        this.initFooter();
+        this.initToolbar();
+        this.initPagination();
+        this.initBody();
+        this.initSearchText();
+        this.initServer();
+    };
+
+    BootstrapTable.prototype.initLocale = function () {
+        if (this.options.locale) {
+            var parts = this.options.locale.split(/-|_/);
+            parts[0].toLowerCase();
+            parts[1] && parts[1].toUpperCase();
+            if ($.fn.bootstrapTable.locales[this.options.locale]) {
+                // locale as requested
+                $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
+            } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {
+                // locale with sep set to - (in case original was specified with _)
+                $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
+            } else if ($.fn.bootstrapTable.locales[parts[0]]) {
+                // short locale language code (i.e. 'en')
+                $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
+            }
+        }
+    };
+
+    BootstrapTable.prototype.initContainer = function () {
+        this.$container = $([
+            '<div class="bootstrap-table">',
+            '<div class="fixed-table-toolbar"></div>',
+            this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
+                '<div class="fixed-table-pagination" style="clear: both;"></div>' :
+                '',
+            '<div class="fixed-table-container">',
+            '<div class="fixed-table-header"><table></table></div>',
+            '<div class="fixed-table-body">',
+            '<div class="fixed-table-loading">',
+            this.options.formatLoadingMessage(),
+            '</div>',
+            '</div>',
+            '<div class="fixed-table-footer"><table><tr></tr></table></div>',
+            this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
+                '<div class="fixed-table-pagination"></div>' :
+                '',
+            '</div>',
+            '</div>'
+        ].join(''));
+
+        this.$container.insertAfter(this.$el);
+        this.$tableContainer = this.$container.find('.fixed-table-container');
+        this.$tableHeader = this.$container.find('.fixed-table-header');
+        this.$tableBody = this.$container.find('.fixed-table-body');
+        this.$tableLoading = this.$container.find('.fixed-table-loading');
+        this.$tableFooter = this.$container.find('.fixed-table-footer');
+        this.$toolbar = this.$container.find('.fixed-table-toolbar');
+        this.$pagination = this.$container.find('.fixed-table-pagination');
+
+        this.$tableBody.append(this.$el);
+        this.$container.after('<div class="clearfix"></div>');
+
+        this.$el.addClass(this.options.classes);
+        if (this.options.striped) {
+            this.$el.addClass('table-striped');
+        }
+        if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {
+            this.$tableContainer.addClass('table-no-bordered');
+        }
+    };
+
+    BootstrapTable.prototype.initTable = function () {
+        var that = this,
+            columns = [],
+            data = [];
+
+        this.$header = this.$el.find('thead');
+        if (!this.$header.length) {
+            this.$header = $('<thead></thead>').appendTo(this.$el);
+        }
+        this.$header.find('tr').each(function () {
+            var column = [];
+
+            $(this).find('th').each(function () {
+                column.push($.extend({}, {
+                    title: $(this).html(),
+                    'class': $(this).attr('class'),
+                    titleTooltip: $(this).attr('title'),
+                    rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
+                    colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
+                }, $(this).data()));
+            });
+            columns.push(column);
+        });
+        if (!$.isArray(this.options.columns[0])) {
+            this.options.columns = [this.options.columns];
+        }
+        this.options.columns = $.extend(true, [], columns, this.options.columns);
+        this.columns = [];
+
+        setFieldIndex(this.options.columns);
+        $.each(this.options.columns, function (i, columns) {
+            $.each(columns, function (j, column) {
+                column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);
+
+                if (typeof column.fieldIndex !== 'undefined') {
+                    that.columns[column.fieldIndex] = column;
+                }
+
+                that.options.columns[i][j] = column;
+            });
+        });
+
+        // if options.data is setting, do not process tbody data
+        if (this.options.data.length) {
+            return;
+        }
+
+        this.$el.find('tbody tr').each(function () {
+            var row = {};
+
+            // save tr's id, class and data-* attributes
+            row._id = $(this).attr('id');
+            row._class = $(this).attr('class');
+            row._data = getRealDataAttr($(this).data());
+
+            $(this).find('td').each(function (i) {
+                var field = that.columns[i].field;
+
+                row[field] = $(this).html();
+                // save td's id, class and data-* attributes
+                row['_' + field + '_id'] = $(this).attr('id');
+                row['_' + field + '_class'] = $(this).attr('class');
+                row['_' + field + '_rowspan'] = $(this).attr('rowspan');
+                row['_' + field + '_title'] = $(this).attr('title');
+                row['_' + field + '_data'] = getRealDataAttr($(this).data());
+            });
+            data.push(row);
+        });
+        this.options.data = data;
+    };
+
+    BootstrapTable.prototype.initHeader = function () {
+        var that = this,
+            visibleColumns = {},
+            html = [];
+
+        this.header = {
+            fields: [],
+            styles: [],
+            classes: [],
+            formatters: [],
+            events: [],
+            sorters: [],
+            sortNames: [],
+            cellStyles: [],
+            searchables: []
+        };
+
+        $.each(this.options.columns, function (i, columns) {
+            html.push('<tr>');
+
+            if (i == 0 && !that.options.cardView && that.options.detailView) {
+                html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',
+                    that.options.columns.length));
+            }
+
+            $.each(columns, function (j, column) {
+                var text = '',
+                    halign = '', // header align style
+                    align = '', // body align style
+                    style = '',
+                    class_ = sprintf(' class="%s"', column['class']),
+                    order = that.options.sortOrder || column.order,
+                    unitWidth = 'px',
+                    width = column.width;
+
+                if (column.width !== undefined && (!that.options.cardView)) {
+                    if (typeof column.width === 'string') {
+                        if (column.width.indexOf('%') !== -1) {
+                            unitWidth = '%';
+                        }
+                    }
+                }
+                if (column.width && typeof column.width === 'string') {
+                    width = column.width.replace('%', '').replace('px', '');
+                }
+
+                halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);
+                align = sprintf('text-align: %s; ', column.align);
+                style = sprintf('vertical-align: %s; ', column.valign);
+                style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?
+                    '36px' : (width ? width + unitWidth : undefined));
+
+                if (typeof column.fieldIndex !== 'undefined') {
+                    that.header.fields[column.fieldIndex] = column.field;
+                    that.header.styles[column.fieldIndex] = align + style;
+                    that.header.classes[column.fieldIndex] = class_;
+                    that.header.formatters[column.fieldIndex] = column.formatter;
+                    that.header.events[column.fieldIndex] = column.events;
+                    that.header.sorters[column.fieldIndex] = column.sorter;
+                    that.header.sortNames[column.fieldIndex] = column.sortName;
+                    that.header.cellStyles[column.fieldIndex] = column.cellStyle;
+                    that.header.searchables[column.fieldIndex] = column.searchable;
+
+                    if (!column.visible) {
+                        return;
+                    }
+
+                    if (that.options.cardView && (!column.cardVisible)) {
+                        return;
+                    }
+
+                    visibleColumns[column.field] = column;
+                }
+
+                html.push('<th' + sprintf(' title="%s"', column.titleTooltip),
+                    column.checkbox || column.radio ?
+                        sprintf(' class="bs-checkbox %s"', column['class'] || '') :
+                        class_,
+                    sprintf(' style="%s"', halign + style),
+                    sprintf(' rowspan="%s"', column.rowspan),
+                    sprintf(' colspan="%s"', column.colspan),
+                    sprintf(' data-field="%s"', column.field),
+                    "tabindex='0'",
+                    '>');
+
+                html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ?
+                    'sortable both' : ''));
+
+                text = column.title;
+
+                if (column.checkbox) {
+                    if (!that.options.singleSelect && that.options.checkboxHeader) {
+                        text = '<input name="btSelectAll" type="checkbox" />';
+                    }
+                    that.header.stateField = column.field;
+                }
+                if (column.radio) {
+                    text = '';
+                    that.header.stateField = column.field;
+                    that.options.singleSelect = true;
+                }
+
+                html.push(text);
+                html.push('</div>');
+                html.push('<div class="fht-cell"></div>');
+                html.push('</div>');
+                html.push('</th>');
+            });
+            html.push('</tr>');
+        });
+
+        this.$header.html(html.join(''));
+        this.$header.find('th[data-field]').each(function (i) {
+            $(this).data(visibleColumns[$(this).data('field')]);
+        });
+        this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
+            if (that.options.sortable && $(this).parent().data().sortable) {
+                that.onSort(event);
+            }
+        });
+
+        this.$header.children().children().off('keypress').on('keypress', function (event) {
+            if (that.options.sortable && $(this).data().sortable) {
+                var code = event.keyCode || event.which;
+                if (code == 13) { //Enter keycode
+                    that.onSort(event);
+                }
+            }
+        });
+
+        if (!this.options.showHeader || this.options.cardView) {
+            this.$header.hide();
+            this.$tableHeader.hide();
+            this.$tableLoading.css('top', 0);
+        } else {
+            this.$header.show();
+            this.$tableHeader.show();
+            this.$tableLoading.css('top', this.$header.outerHeight() + 1);
+            // Assign the correct sortable arrow
+            this.getCaret();
+        }
+
+        this.$selectAll = this.$header.find('[name="btSelectAll"]');
+        this.$container.off('click', '[name="btSelectAll"]')
+            .on('click', '[name="btSelectAll"]', function () {
+                var checked = $(this).prop('checked');
+                that[checked ? 'checkAll' : 'uncheckAll']();
+            });
+    };
+
+    BootstrapTable.prototype.initFooter = function () {
+        if (!this.options.showFooter || this.options.cardView) {
+            this.$tableFooter.hide();
+        } else {
+            this.$tableFooter.show();
+        }
+    };
+
+    /**
+     * @param data
+     * @param type: append / prepend
+     */
+    BootstrapTable.prototype.initData = function (data, type) {
+        if (type === 'append') {
+            this.data = this.data.concat(data);
+        } else if (type === 'prepend') {
+            this.data = [].concat(data).concat(this.data);
+        } else {
+            this.data = data || this.options.data;
+        }
+
+        // Fix #839 Records deleted when adding new row on filtered table
+        if (type === 'append') {
+            this.options.data = this.options.data.concat(data);
+        } else if (type === 'prepend') {
+            this.options.data = [].concat(data).concat(this.options.data);
+        } else {
+            this.options.data = this.data;
+        }
+
+        if (this.options.sidePagination === 'server') {
+            return;
+        }
+        this.initSort();
+    };
+
+    BootstrapTable.prototype.initSort = function () {
+        var that = this,
+            name = this.options.sortName,
+            order = this.options.sortOrder === 'desc' ? -1 : 1,
+            index = $.inArray(this.options.sortName, this.header.fields);
+
+        if (index !== -1) {
+            this.data.sort(function (a, b) {
+                if (that.header.sortNames[index]) {
+                    name = that.header.sortNames[index];
+                }
+                var aa = getItemField(a, name),
+                    bb = getItemField(b, name),
+                    value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);
+
+                if (value !== undefined) {
+                    return order * value;
+                }
+
+                // Fix #161: undefined or null string sort bug.
+                if (aa === undefined || aa === null) {
+                    aa = '';
+                }
+                if (bb === undefined || bb === null) {
+                    bb = '';
+                }
+
+                // IF both values are numeric, do a numeric comparison
+                if ($.isNumeric(aa) && $.isNumeric(bb)) {
+                    // Convert numerical values form string to float.
+                    aa = parseFloat(aa);
+                    bb = parseFloat(bb);
+                    if (aa < bb) {
+                        return order * -1;
+                    }
+                    return order;
+                }
+
+                if (aa === bb) {
+                    return 0;
+                }
+
+                // If value is not a string, convert to string
+                if (typeof aa !== 'string') {
+                    aa = aa.toString();
+                }
+
+                if (aa.localeCompare(bb) === -1) {
+                    return order * -1;
+                }
+
+                return order;
+            });
+        }
+    };
+
+    BootstrapTable.prototype.onSort = function (event) {
+        var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
+            $this_ = this.$header.find('th').eq($this.index());
+
+        this.$header.add(this.$header_).find('span.order').remove();
+
+        if (this.options.sortName === $this.data('field')) {
+            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
+        } else {
+            this.options.sortName = $this.data('field');
+            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
+        }
+        this.trigger('sort', this.options.sortName, this.options.sortOrder);
+
+        $this.add($this_).data('order', this.options.sortOrder);
+
+        // Assign the correct sortable arrow
+        this.getCaret();
+
+        if (this.options.sidePagination === 'server') {
+            this.initServer(this.options.silentSort);
+            return;
+        }
+
+        this.initSort();
+        this.initBody();
+    };
+
+    BootstrapTable.prototype.initToolbar = function () {
+        var that = this,
+            html = [],
+            timeoutId = 0,
+            $keepOpen,
+            $search,
+            switchableCount = 0;
+
+        this.$toolbar.html('');
+
+        if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
+            $(sprintf('<div class="bars pull-%s"></div>', this.options.toolbarAlign))
+                .appendTo(this.$toolbar)
+                .append($(this.options.toolbar));
+        }
+
+        // showColumns, showToggle, showRefresh
+        html = [sprintf('<div class="columns columns-%s btn-group pull-%s">',
+            this.options.buttonsAlign, this.options.buttonsAlign)];
+
+        if (typeof this.options.icons === 'string') {
+            this.options.icons = calculateObjectValue(null, this.options.icons);
+        }
+
+        if (this.options.showPaginationSwitch) {
+            html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',
+                    this.options.formatPaginationSwitch()),
+                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
+                '</button>');
+        }
+
+        if (this.options.showRefresh) {
+            html.push(sprintf('<button class="btn btn-default' + (this.options.iconSize === undefined ? '' : ' btn-' + this.options.iconSize) + '" type="button" name="refresh" title="%s">',
+                    this.options.formatRefresh()),
+                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh),
+                '</button>');
+        }
+
+        if (this.options.showToggle) {
+            html.push(sprintf('<button class="btn btn-default' + (this.options.iconSize === undefined ? '' : ' btn-' + this.options.iconSize) + '" type="button" name="toggle" title="%s">',
+                    this.options.formatToggle()),
+                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle),
+                '</button>');
+        }
+
+        if (this.options.showColumns) {
+            html.push(sprintf('<div class="keep-open btn-group" title="%s">',
+                    this.options.formatColumns()),
+                '<button type="button" class="btn btn-default' + (this.options.iconSize == undefined ? '' : ' btn-' + this.options.iconSize) + ' dropdown-toggle" data-toggle="dropdown">',
+                sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.columns),
+                ' <span class="caret"></span>',
+                '</button>',
+                '<ul class="dropdown-menu" role="menu">');
+
+            $.each(this.columns, function (i, column) {
+                if (column.radio || column.checkbox) {
+                    return;
+                }
+
+                if (that.options.cardView && (!column.cardVisible)) {
+                    return;
+                }
+
+                var checked = column.visible ? ' checked="checked"' : '';
+
+                if (column.switchable) {
+                    html.push(sprintf('<li>' +
+                        '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
+                        '</li>', column.field, i, checked, column.title));
+                    switchableCount++;
+                }
+            });
+            html.push('</ul>',
+                '</div>');
+        }
+
+        html.push('</div>');
+
+        // Fix #188: this.showToolbar is for extentions
+        if (this.showToolbar || html.length > 2) {
+            this.$toolbar.append(html.join(''));
+        }
+
+        if (this.options.showPaginationSwitch) {
+            this.$toolbar.find('button[name="paginationSwitch"]')
+                .off('click').on('click', $.proxy(this.togglePagination, this));
+        }
+
+        if (this.options.showRefresh) {
+            this.$toolbar.find('button[name="refresh"]')
+                .off('click').on('click', $.proxy(this.refresh, this));
+        }
+
+        if (this.options.showToggle) {
+            this.$toolbar.find('button[name="toggle"]')
+                .off('click').on('click', function () {
+                    that.toggleView();
+                });
+        }
+
+        if (this.options.showColumns) {
+            $keepOpen = this.$toolbar.find('.keep-open');
+
+            if (switchableCount <= this.options.minimumCountColumns) {
+                $keepOpen.find('input').prop('disabled', true);
+            }
+
+            $keepOpen.find('li').off('click').on('click', function (event) {
+                event.stopImmediatePropagation();
+            });
+            $keepOpen.find('input').off('click').on('click', function () {
+                var $this = $(this);
+
+                that.toggleColumn(getFieldIndex(that.columns,
+                    $(this).data('field')), $this.prop('checked'), false);
+                that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
+            });
+        }
+
+        if (this.options.search) {
+            html = [];
+            html.push(
+                '<div class="pull-' + this.options.searchAlign + ' search">',
+                sprintf('<input class="form-control' + (this.options.iconSize === undefined ? '' : ' input-' + this.options.iconSize) + '" type="text" placeholder="%s">',
+                    this.options.formatSearch()),
+                '</div>');
+
+            this.$toolbar.append(html.join(''));
+            $search = this.$toolbar.find('.search input');
+            $search.off('keyup drop').on('keyup drop', function (event) {
+                clearTimeout(timeoutId); // doesn't matter if it's 0
+                timeoutId = setTimeout(function () {
+                    that.onSearch(event);
+                }, that.options.searchTimeOut);
+            });
+        }
+    };
+
+    BootstrapTable.prototype.onSearch = function (event) {
+        var text = $.trim($(event.currentTarget).val());
+
+        // trim search input
+        if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
+            $(event.currentTarget).val(text);
+        }
+
+        if (text === this.searchText) {
+            return;
+        }
+        this.searchText = text;
+
+        this.options.pageNumber = 1;
+        this.initSearch();
+        this.updatePagination();
+        this.trigger('search', text);
+    };
+
+    BootstrapTable.prototype.initSearch = function () {
+        var that = this;
+
+        if (this.options.sidePagination !== 'server') {
+            var s = this.searchText && this.searchText.toLowerCase();
+            var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;
+
+            // Check filter
+            this.data = f ? $.grep(this.options.data, function (item, i) {
+                for (var key in f) {
+                    if (item[key] !== f[key]) {
+                        return false;
+                    }
+                }
+                return true;
+            }) : this.options.data;
+
+            this.data = s ? $.grep(this.data, function (item, i) {
+                for (var key in item) {
+                    key = $.isNumeric(key) ? parseInt(key, 10) : key;
+                    var value = item[key],
+                        column = that.columns[getFieldIndex(that.columns, key)],
+                        j = $.inArray(key, that.header.fields);
+
+                    // Fix #142: search use formated data
+                    if (column && column.searchFormatter) {
+                        value = calculateObjectValue(column,
+                            that.header.formatters[j], [value, item, i], value);
+                    }
+
+                    var index = $.inArray(key, that.header.fields);
+                    if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
+                        if (that.options.strictSearch) {
+                            if ((value + '').toLowerCase() === s) {
+                                return true;
+                            }
+                        } else {
+                            if ((value + '').toLowerCase().indexOf(s) !== -1) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+                return false;
+            }) : this.data;
+        }
+    };
+
+    BootstrapTable.prototype.initPagination = function () {
+        if (!this.options.pagination) {
+            this.$pagination.hide();
+            return;
+        } else {
+            this.$pagination.show();
+        }
+
+        var that = this,
+            html = [],
+            $allSelected = false,
+            i, from, to,
+            $pageList,
+            $first, $pre,
+            $next, $last,
+            $number,
+            data = this.getData();
+
+        if (this.options.sidePagination !== 'server') {
+            this.options.totalRows = data.length;
+        }
+
+        this.totalPages = 0;
+        if (this.options.totalRows) {
+            if (this.options.pageSize === this.options.formatAllRows()) {
+                this.options.pageSize = this.options.totalRows;
+                $allSelected = true;
+            } else if (this.options.pageSize === this.options.totalRows) {
+                // Fix #667 Table with pagination,
+                // multiple pages and a search that matches to one page throws exception
+                var pageLst = typeof this.options.pageList === 'string' ?
+                    this.options.pageList.replace('[', '').replace(']', '')
+                        .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;
+                if (pageLst.indexOf(this.options.formatAllRows().toLowerCase()) > -1) {
+                    $allSelected = true;
+                }
+            }
+
+            this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;
+
+            this.options.totalPages = this.totalPages;
+        }
+        if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {
+            this.options.pageNumber = this.totalPages;
+        }
+
+        this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;
+        this.pageTo = this.options.pageNumber * this.options.pageSize;
+        if (this.pageTo > this.options.totalRows) {
+            this.pageTo = this.options.totalRows;
+        }
+
+        html.push(
+            '<div class="pull-' + this.options.paginationDetailHAlign + ' pagination-detail">',
+            '<span class="pagination-info">',
+            this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),
+            '</span>');
+
+        html.push('<span class="page-list">');
+
+        var pageNumber = [
+                sprintf('<span class="btn-group %s">',
+                    this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
+                        'dropdown' : 'dropup'),
+                '<button type="button" class="btn btn-default ' +
+                (this.options.iconSize === undefined ? '' : ' btn-' + this.options.iconSize) +
+                ' dropdown-toggle" data-toggle="dropdown">',
+                '<span class="page-size">',
+                $allSelected ? this.options.formatAllRows() : this.options.pageSize,
+                '</span>',
+                ' <span class="caret"></span>',
+                '</button>',
+                '<ul class="dropdown-menu" role="menu">'
+            ],
+            pageList = this.options.pageList;
+
+        if (typeof this.options.pageList === 'string') {
+            var list = this.options.pageList.replace('[', '').replace(']', '')
+                .replace(/ /g, '').split(',');
+
+            pageList = [];
+            $.each(list, function (i, value) {
+                pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?
+                    that.options.formatAllRows() : +value);
+            });
+        }
+
+        $.each(pageList, function (i, page) {
+            if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {
+                var active;
+                if ($allSelected) {
+                    active = page === that.options.formatAllRows() ? ' class="active"' : '';
+                } else {
+                    active = page === that.options.pageSize ? ' class="active"' : '';
+                }
+                pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page));
+            }
+        });
+        pageNumber.push('</ul></span>');
+
+        html.push(this.options.formatRecordsPerPage(pageNumber.join('')));
+        html.push('</span>');
+
+        html.push('</div>',
+            '<div class="pull-' + this.options.paginationHAlign + ' pagination">',
+            '<ul class="pagination' + (this.options.iconSize === undefined ? '' : ' pagination-' + this.options.iconSize) + '">',
+            '<li class="page-first"><a href="javascript:void(0)">' + this.options.paginationFirstText + '</a></li>',
+            '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>');
+
+        if (this.totalPages < 5) {
+            from = 1;
+            to = this.totalPages;
+        } else {
+            from = this.options.pageNumber - 2;
+            to = from + 4;
+            if (from < 1) {
+                from = 1;
+                to = 5;
+            }
+            if (to > this.totalPages) {
+                to = this.totalPages;
+                from = to - 4;
+            }
+        }
+        for (i = from; i <= to; i++) {
+            html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">',
+                '<a href="javascript:void(0)">', i, '</a>',
+                '</li>');
+        }
+
+        html.push(
+            '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>',
+            '<li class="page-last"><a href="javascript:void(0)">' + this.options.paginationLastText + '</a></li>',
+            '</ul>',
+            '</div>');
+
+        this.$pagination.html(html.join(''));
+
+        $pageList = this.$pagination.find('.page-list a');
+        $first = this.$pagination.find('.page-first');
+        $pre = this.$pagination.find('.page-pre');
+        $next = this.$pagination.find('.page-next');
+        $last = this.$pagination.find('.page-last');
+        $number = this.$pagination.find('.page-number');
+
+        if (this.options.pageNumber <= 1) {
+            $first.addClass('disabled');
+            $pre.addClass('disabled');
+        }
+        if (this.options.pageNumber >= this.totalPages) {
+            $next.addClass('disabled');
+            $last.addClass('disabled');
+        }
+        if (this.options.smartDisplay) {
+            if (this.totalPages <= 1) {
+                this.$pagination.find('div.pagination').hide();
+            }
+            if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {
+                this.$pagination.find('span.page-list').hide();
+            }
+
+            // when data is empty, hide the pagination
+            this.$pagination[this.getData().length ? 'show' : 'hide']();
+        }
+        if ($allSelected) {
+            this.options.pageSize = this.options.formatAllRows();
+        }
+        $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));
+        $first.off('click').on('click', $.proxy(this.onPageFirst, this));
+        $pre.off('click').on('click', $.proxy(this.onPagePre, this));
+        $next.off('click').on('click', $.proxy(this.onPageNext, this));
+        $last.off('click').on('click', $.proxy(this.onPageLast, this));
+        $number.off('click').on('click', $.proxy(this.onPageNumber, this));
+    };
+
+    BootstrapTable.prototype.updatePagination = function (event) {
+        // Fix #171: IE disabled button can be clicked bug.
+        if (event && $(event.currentTarget).hasClass('disabled')) {
+            return;
+        }
+
+        if (!this.options.maintainSelected) {
+            this.resetRows();
+        }
+
+        this.initPagination();
+        if (this.options.sidePagination === 'server') {
+            this.initServer();
+        } else {
+            this.initBody();
+        }
+
+        this.trigger('page-change', this.options.pageNumber, this.options.pageSize);
+    };
+
+    BootstrapTable.prototype.onPageListChange = function (event) {
+        var $this = $(event.currentTarget);
+
+        $this.parent().addClass('active').siblings().removeClass('active');
+        this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
+            this.options.formatAllRows() : +$this.text();
+        this.$toolbar.find('.page-size').text(this.options.pageSize);
+
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.onPageFirst = function (event) {
+        this.options.pageNumber = 1;
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.onPagePre = function (event) {
+        this.options.pageNumber--;
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.onPageNext = function (event) {
+        this.options.pageNumber++;
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.onPageLast = function (event) {
+        this.options.pageNumber = this.totalPages;
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.onPageNumber = function (event) {
+        if (this.options.pageNumber === +$(event.currentTarget).text()) {
+            return;
+        }
+        this.options.pageNumber = +$(event.currentTarget).text();
+        this.updatePagination(event);
+    };
+
+    BootstrapTable.prototype.initBody = function (fixedScroll) {
+        var that = this,
+            html = [],
+            data = this.getData();
+
+        this.trigger('pre-body', data);
+
+        this.$body = this.$el.find('tbody');
+        if (!this.$body.length) {
+            this.$body = $('<tbody></tbody>').appendTo(this.$el);
+        }
+
+        //Fix #389 Bootstrap-table-flatJSON is not working
+
+        if (!this.options.pagination || this.options.sidePagination === 'server') {
+            this.pageFrom = 1;
+            this.pageTo = data.length;
+        }
+
+        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
+            var key,
+                item = data[i],
+                style = {},
+                csses = [],
+                data_ = '',
+                attributes = {},
+                htmlAttributes = [];
+
+            style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
+
+            if (style && style.css) {
+                for (key in style.css) {
+                    csses.push(key + ': ' + style.css[key]);
+                }
+            }
+
+            attributes = calculateObjectValue(this.options,
+                this.options.rowAttributes, [item, i], attributes);
+
+            if (attributes) {
+                for (key in attributes) {
+                    htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
+                }
+            }
+
+            if (item._data && !$.isEmptyObject(item._data)) {
+                $.each(item._data, function (k, v) {
+                    // ignore data-index
+                    if (k === 'index') {
+                        return;
+                    }
+                    data_ += sprintf(' data-%s="%s"', k, v);
+                });
+            }
+
+            html.push('<tr',
+                sprintf(' %s', htmlAttributes.join(' ')),
+                sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
+                sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
+                sprintf(' data-index="%s"', i),
+                sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
+                sprintf('%s', data_),
+                '>'
+            );
+
+            if (this.options.cardView) {
+                html.push(sprintf('<td colspan="%s">', this.header.fields.length));
+            }
+
+            if (!this.options.cardView && this.options.detailView) {
+                html.push('<td>',
+                    '<a class="detail-icon" href="javascript:">',
+                    sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
+                    '</a>',
+                    '</td>');
+            }
+
+            $.each(this.header.fields, function (j, field) {
+                var text = '',
+                    value = getItemField(item, field),
+                    type = '',
+                    cellStyle = {},
+                    id_ = '',
+                    class_ = that.header.classes[j],
+                    data_ = '',
+                    rowspan_ = '',
+                    title_ = '',
+                    column = that.columns[getFieldIndex(that.columns, field)];
+
+                if (!column.visible) {
+                    return;
+                }
+
+                style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
+
+                value = calculateObjectValue(column,
+                    that.header.formatters[j], [value, item, i], value);
+
+                // handle td's id and class
+                if (item['_' + field + '_id']) {
+                    id_ = sprintf(' id="%s"', item['_' + field + '_id']);
+                }
+                if (item['_' + field + '_class']) {
+                    class_ = sprintf(' class="%s"', item['_' + field + '_class']);
+                }
+                if (item['_' + field + '_rowspan']) {
+                    rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
+                }
+                if (item['_' + field + '_title']) {
+                    title_ = sprintf(' title="%s"', item['_' + field + '_title']);
+                }
+                cellStyle = calculateObjectValue(that.header,
+                    that.header.cellStyles[j], [value, item, i], cellStyle);
+                if (cellStyle.classes) {
+                    class_ = sprintf(' class="%s"', cellStyle.classes);
+                }
+                if (cellStyle.css) {
+                    var csses_ = [];
+                    for (var key in cellStyle.css) {
+                        csses_.push(key + ': ' + cellStyle.css[key]);
+                    }
+                    style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
+                }
+
+                if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
+                    $.each(item['_' + field + '_data'], function (k, v) {
+                        // ignore data-index
+                        if (k === 'index') {
+                            return;
+                        }
+                        data_ += sprintf(' data-%s="%s"', k, v);
+                    });
+                }
+
+                if (column.checkbox || column.radio) {
+                    type = column.checkbox ? 'checkbox' : type;
+                    type = column.radio ? 'radio' : type;
+
+                    text = [that.options.cardView ?
+                        '<div class="card-view">' : '<td class="bs-checkbox">',
+                        '<input' +
+                        sprintf(' data-index="%s"', i) +
+                        sprintf(' name="%s"', that.options.selectItemName) +
+                        sprintf(' type="%s"', type) +
+                        sprintf(' value="%s"', item[that.options.idField]) +
+                        sprintf(' checked="%s"', value === true ||
+                        (value && value.checked) ? 'checked' : undefined) +
+                        sprintf(' disabled="%s"', !column.checkboxEnabled ||
+                        (value && value.disabled) ? 'disabled' : undefined) +
+                        ' />',
+                        that.header.formatters[j] && typeof value === 'string' ? value : '',
+                        that.options.cardView ? '</div>' : '</td>'
+                    ].join('');
+
+                    item[that.header.stateField] = value === true || (value && value.checked);
+                } else {
+                    value = typeof value === 'undefined' || value === null ?
+                        that.options.undefinedText : value;
+
+                    text = that.options.cardView ? ['<div class="card-view">',
+                        that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
+                            getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
+                        sprintf('<span class="value">%s</span>', value),
+                        '</div>'
+                    ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),
+                        value,
+                        '</td>'
+                    ].join('');
+
+                    // Hide empty data on Card view when smartDisplay is set to true.
+                    if (that.options.cardView && that.options.smartDisplay && value === '') {
+                        text = '';
+                    }
+                }
+
+                html.push(text);
+            });
+
+            if (this.options.cardView) {
+                html.push('</td>');
+            }
+
+            html.push('</tr>');
+        }
+
+        // show no records
+        if (!html.length) {
+            html.push('<tr class="no-records-found">',
+                sprintf('<td colspan="%s">%s</td>',
+                    this.$header.find('th').length, this.options.formatNoMatches()),
+                '</tr>');
+        }
+
+        this.$body.html(html.join(''));
+
+        if (!fixedScroll) {
+            this.scrollTo(0);
+        }
+
+        // click to select by column
+        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
+            var $td = $(this),
+                $tr = $td.parent(),
+                item = that.data[$tr.data('index')],
+                index = $td[0].cellIndex,
+                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
+                column = that.columns[getFieldIndex(that.columns, field)],
+                value = getItemField(item, field);
+
+            if ($td.find('.detail-icon').length) {
+                return;
+            }
+
+            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
+            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
+
+            // if click to select - then trigger the checkbox/radio click
+            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {
+                var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
+                if ($selectItem.length) {
+                    $selectItem[0].click(); // #144: .trigger('click') bug
+                }
+            }
+        });
+
+        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
+            var $this = $(this),
+                $tr = $this.parent().parent(),
+                index = $tr.data('index'),
+                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row
+
+            // remove and update
+            if ($tr.next().is('tr.detail-view')) {
+                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
+                $tr.next().remove();
+                that.trigger('collapse-row', index, row);
+            } else {
+                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
+                $tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>',
+                    $tr.find('td').length, calculateObjectValue(that.options,
+                        that.options.detailFormatter, [index, row], '')));
+                that.trigger('expand-row', index, row, $tr.next().find('td'));
+            }
+            that.resetView();
+        });
+
+        this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
+        this.$selectItem.off('click').on('click', function (event) {
+            event.stopImmediatePropagation();
+
+            var $this = $(this),
+                checked = $this.prop('checked'),
+                row = that.data[$this.data('index')];
+
+            if (that.options.maintainSelected && $(this).is(':radio')) {
+                $.each(that.options.data, function (i, row) {
+                    row[that.header.stateField] = false;
+                });
+            }
+
+            row[that.header.stateField] = checked;
+
+            if (that.options.singleSelect) {
+                that.$selectItem.not(this).each(function () {
+                    that.data[$(this).data('index')][that.header.stateField] = false;
+                });
+                that.$selectItem.filter(':checked').not(this).prop('checked', false);
+            }
+
+            that.updateSelected();
+            that.trigger(checked ? 'check' : 'uncheck', row, $this);
+        });
+
+        $.each(this.header.events, function (i, events) {
+            if (!events) {
+                return;
+            }
+            // fix bug, if events is defined with namespace
+            if (typeof events === 'string') {
+                events = calculateObjectValue(null, events);
+            }
+
+            var field = that.header.fields[i],
+                fieldIndex = $.inArray(field, that.getVisibleFields());
+
+            if (that.options.detailView && !that.options.cardView) {
+                fieldIndex += 1;
+            }
+
+            for (var key in events) {
+                that.$body.find('tr').each(function () {
+                    var $tr = $(this),
+                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),
+                        index = key.indexOf(' '),
+                        name = key.substring(0, index),
+                        el = key.substring(index + 1),
+                        func = events[key];
+
+                    $td.find(el).off(name).on(name, function (e) {
+                        var index = $tr.data('index'),
+                            row = that.data[index],
+                            value = row[field];
+
+                        func.apply(this, [e, value, row, index]);
+                    });
+                });
+            }
+        });
+
+        this.updateSelected();
+        this.resetView();
+
+        this.trigger('post-body');
+    };
+
+    BootstrapTable.prototype.initServer = function (silent, query) {
+        var that = this,
+            data = {},
+            params = {
+                pageSize: this.options.pageSize === this.options.formatAllRows() ?
+                    this.options.totalRows : this.options.pageSize,
+                pageNumber: this.options.pageNumber,
+                searchText: this.searchText,
+                sortName: this.options.sortName,
+                sortOrder: this.options.sortOrder
+            },
+            request;
+
+        if (!this.options.url && !this.options.ajax) {
+            return;
+        }
+
+        if (this.options.queryParamsType === 'limit') {
+            params = {
+                search: params.searchText,
+                sort: params.sortName,
+                order: params.sortOrder
+            };
+            if (this.options.pagination) {
+                params.limit = this.options.pageSize === this.options.formatAllRows() ?
+                    this.options.totalRows : this.options.pageSize;
+                params.offset = this.options.pageSize === this.options.formatAllRows() ?
+                    0 : this.options.pageSize * (this.options.pageNumber - 1);
+            }
+        }
+
+        if (!($.isEmptyObject(this.filterColumnsPartial))) {
+            params['filter'] = JSON.stringify(this.filterColumnsPartial, null);
+        }
+
+        data = calculateObjectValue(this.options, this.options.queryParams, [params], data);
+
+        $.extend(data, query || {});
+
+        // false to stop request
+        if (data === false) {
+            return;
+        }
+
+        if (!silent) {
+            this.$tableLoading.show();
+        }
+        request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {
+            type: this.options.method,
+            url: this.options.url,
+            data: this.options.contentType === 'application/json' && this.options.method === 'post' ?
+                JSON.stringify(data) : data,
+            cache: this.options.cache,
+            contentType: this.options.contentType,
+            dataType: this.options.dataType,
+            success: function (res) {
+                res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);
+
+                that.load(res);
+                that.trigger('load-success', res);
+            },
+            error: function (res) {
+                that.trigger('load-error', res.status, res);
+            },
+            complete: function () {
+                if (!silent) {
+                    that.$tableLoading.hide();
+                }
+            }
+        });
+
+        if (this.options.ajax) {
+            calculateObjectValue(this, this.options.ajax, [request], null);
+        } else {
+            $.ajax(request);
+        }
+    };
+
+    BootstrapTable.prototype.initSearchText = function () {
+        if (this.options.search) {
+            if (this.options.searchText !== '') {
+                var $search = this.$toolbar.find('.search input');
+                $search.val(this.options.searchText);
+                this.onSearch({currentTarget: $search});
+            }
+        }
+    };
+
+    BootstrapTable.prototype.getCaret = function () {
+        var that = this;
+
+        $.each(this.$header.find('th'), function (i, th) {
+            $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');
+        });
+    };
+
+    BootstrapTable.prototype.updateSelected = function () {
+        var checkAll = this.$selectItem.filter(':enabled').length &&
+            this.$selectItem.filter(':enabled').length ===
+            this.$selectItem.filter(':enabled').filter(':checked').length;
+
+        this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);
+
+        this.$selectItem.each(function () {
+            $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');
+        });
+    };
+
+    BootstrapTable.prototype.updateRows = function () {
+        var that = this;
+
+        this.$selectItem.each(function () {
+            that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
+        });
+    };
+
+    BootstrapTable.prototype.resetRows = function () {
+        var that = this;
+
+        $.each(this.data, function (i, row) {
+            that.$selectAll.prop('checked', false);
+            that.$selectItem.prop('checked', false);
+            if (that.header.stateField) {
+                row[that.header.stateField] = false;
+            }
+        });
+    };
+
+    BootstrapTable.prototype.trigger = function (name) {
+        var args = Array.prototype.slice.call(arguments, 1);
+
+        name += '.bs.table';
+        this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);
+        this.$el.trigger($.Event(name), args);
+
+        this.options.onAll(name, args);
+        this.$el.trigger($.Event('all.bs.table'), [name, args]);
+    };
+
+    BootstrapTable.prototype.resetHeader = function () {
+        // fix #61: the hidden table reset header bug.
+        // fix bug: get $el.css('width') error sometime (height = 500)
+        clearTimeout(this.timeoutId_);
+        this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
+    };
+
+    BootstrapTable.prototype.fitHeader = function () {
+        var that = this,
+            fixedBody,
+            scrollWidth,
+            focused,
+            focusedTemp;
+
+        if (that.$el.is(':hidden')) {
+            that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);
+            return;
+        }
+        fixedBody = this.$tableBody.get(0);
+
+        scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&
+        fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?
+            getScrollBarWidth() : 0;
+
+        this.$el.css('margin-top', -this.$header.outerHeight());
+
+        focused = $(':focus');
+        if (focused.length > 0) {
+            var $th = focused.parents('th');
+            if ($th.length > 0) {
+                var dataField = $th.attr('data-field');
+                if (dataField !== undefined) {
+                    var $headerTh = this.$header.find("[data-field='" + dataField + "']");
+                    if ($headerTh.length > 0) {
+                        $headerTh.find(":input").addClass("focus-temp");
+                    }
+                }
+            }
+        }
+
+        this.$header_ = this.$header.clone(true, true);
+        this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
+        this.$tableHeader.css({
+            'margin-right': scrollWidth
+        }).find('table').css('width', this.$el.outerWidth())
+            .html('').attr('class', this.$el.attr('class'))
+            .append(this.$header_);
+
+
+        focusedTemp = $('.focus-temp:visible:eq(0)');
+        if (focusedTemp.length > 0) {
+            focusedTemp.focus();
+            this.$header.find('.focus-temp').removeClass('focus-temp');
+        }
+
+        // fix bug: $.data() is not working as expected after $.append()
+        this.$header.find('th[data-field]').each(function (i) {
+            that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
+        });
+
+        var visibleFields = this.getVisibleFields();
+
+        this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) {
+            var $this = $(this),
+                index = i;
+
+            if (that.options.detailView && !that.options.cardView) {
+                if (i === 0) {
+                    that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
+                }
+                index = i - 1;
+            }
+
+            that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index]))
+                .find('.fht-cell').width($this.innerWidth());
+        });
+        // horizontal scroll event
+        // TODO: it's probably better improving the layout than binding to scroll event
+        this.$tableBody.off('scroll').on('scroll', function () {
+            that.$tableHeader.scrollLeft($(this).scrollLeft());
+
+            if (that.options.showFooter && !that.options.cardView) {
+                that.$tableFooter.scrollLeft($(this).scrollLeft());
+            }
+        });
+        that.trigger('post-header');
+    };
+
+    BootstrapTable.prototype.resetFooter = function () {
+        var that = this,
+            data = that.getData(),
+            html = [];
+
+        if (!this.options.showFooter || this.options.cardView) { //do nothing
+            return;
+        }
+
+        if (!this.options.cardView && this.options.detailView) {
+            html.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>');
+        }
+
+        $.each(this.columns, function (i, column) {
+            var falign = '', // footer align style
+                style = '',
+                class_ = sprintf(' class="%s"', column['class']);
+
+            if (!column.visible) {
+                return;
+            }
+
+            if (that.options.cardView && (!column.cardVisible)) {
+                return;
+            }
+
+            falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);
+            style = sprintf('vertical-align: %s; ', column.valign);
+
+            html.push('<td', class_, sprintf(' style="%s"', falign + style), '>');
+            html.push('<div class="th-inner">');
+
+            html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');
+
+            html.push('</div>');
+            html.push('<div class="fht-cell"></div>');
+            html.push('</div>');
+            html.push('</td>');
+        });
+
+        this.$tableFooter.find('tr').html(html.join(''));
+        clearTimeout(this.timeoutFooter_);
+        this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),
+            this.$el.is(':hidden') ? 100 : 0);
+    };
+
+    BootstrapTable.prototype.fitFooter = function () {
+        var that = this,
+            $footerTd,
+            elWidth,
+            scrollWidth;
+
+        clearTimeout(this.timeoutFooter_);
+        if (this.$el.is(':hidden')) {
+            this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);
+            return;
+        }
+
+        elWidth = this.$el.css('width');
+        scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;
+
+        this.$tableFooter.css({
+            'margin-right': scrollWidth
+        }).find('table').css('width', elWidth)
+            .attr('class', this.$el.attr('class'));
+
+        $footerTd = this.$tableFooter.find('td');
+
+        this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) {
+            var $this = $(this);
+
+            $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
+        });
+    };
+
+    BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {
+        if (index === -1) {
+            return;
+        }
+        this.columns[index].visible = checked;
+        this.initHeader();
+        this.initSearch();
+        this.initPagination();
+        this.initBody();
+
+        if (this.options.showColumns) {
+            var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);
+
+            if (needUpdate) {
+                $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked);
+            }
+
+            if ($items.filter(':checked').length <= this.options.minimumCountColumns) {
+                $items.filter(':checked').prop('disabled', true);
+            }
+        }
+    };
+
+    BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
+        if (index === -1) {
+            return;
+        }
+
+        this.$body.find(typeof index !== 'undefined' ?
+            sprintf('tr[data-index="%s"]', index) :
+            sprintf('tr[data-uniqueid="%s"]', uniqueId))
+            [visible ? 'show' : 'hide']();
+    };
+
+    BootstrapTable.prototype.getVisibleFields = function () {
+        var that = this,
+            visibleFields = [];
+
+        $.each(this.header.fields, function (j, field) {
+            var column = that.columns[getFieldIndex(that.columns, field)];
+
+            if (!column.visible) {
+                return;
+            }
+            visibleFields.push(field);
+        });
+        return visibleFields;
+    };
+
+    // PUBLIC FUNCTION DEFINITION
+    // =======================
+
+    BootstrapTable.prototype.resetView = function (params) {
+        var padding = 0;
+
+        if (params && params.height) {
+            this.options.height = params.height;
+        }
+
+        this.$selectAll.prop('checked', this.$selectItem.length > 0 &&
+            this.$selectItem.length === this.$selectItem.filter(':checked').length);
+
+        if (this.options.height) {
+            var toolbarHeight = getRealHeight(this.$toolbar),
+                paginationHeight = getRealHeight(this.$pagination),
+                height = this.options.height - toolbarHeight - paginationHeight;
+
+            this.$tableContainer.css('height', height + 'px');
+        }
+
+        if (this.options.cardView) {
+            // remove the element css
+            this.$el.css('margin-top', '0');
+            this.$tableContainer.css('padding-bottom', '0');
+            return;
+        }
+
+        if (this.options.showHeader && this.options.height) {
+            this.$tableHeader.show();
+            this.resetHeader();
+            padding += this.$header.outerHeight();
+        } else {
+            this.$tableHeader.hide();
+            this.trigger('post-header');
+        }
+
+        if (this.options.showFooter) {
+            this.resetFooter();
+            if (this.options.height) {
+                padding += this.$tableFooter.outerHeight() + 1;
+            }
+        }
+
+        // Assign the correct sortable arrow
+        this.getCaret();
+        this.$tableContainer.css('padding-bottom', padding + 'px');
+        this.trigger('reset-view');
+    };
+
+    BootstrapTable.prototype.getData = function (useCurrentPage) {
+        return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
+            (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :
+            (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);
+    };
+
+    BootstrapTable.prototype.load = function (data) {
+        var fixedScroll = false;
+
+        // #431: support pagination
+        if (this.options.sidePagination === 'server') {
+            this.options.totalRows = data.total;
+            fixedScroll = data.fixedScroll;
+            data = data[this.options.dataField];
+        } else if (!$.isArray(data)) { // support fixedScroll
+            fixedScroll = data.fixedScroll;
+            data = data.data;
+        }
+
+        this.initData(data);
+        this.initSearch();
+        this.initPagination();
+        this.initBody(fixedScroll);
+    };
+
+    BootstrapTable.prototype.append = function (data) {
+        this.initData(data, 'append');
+        this.initSearch();
+        this.initPagination();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.prepend = function (data) {
+        this.initData(data, 'prepend');
+        this.initSearch();
+        this.initPagination();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.remove = function (params) {
+        var len = this.options.data.length,
+            i, row;
+
+        if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {
+            return;
+        }
+
+        for (i = len - 1; i >= 0; i--) {
+            row = this.options.data[i];
+
+            if (!row.hasOwnProperty(params.field)) {
+                continue;
+            }
+            if ($.inArray(row[params.field], params.values) !== -1) {
+                this.options.data.splice(i, 1);
+            }
+        }
+
+        if (len === this.options.data.length) {
+            return;
+        }
+
+        this.initSearch();
+        this.initPagination();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.removeAll = function () {
+        if (this.options.data.length > 0) {
+            this.options.data.splice(0, this.options.data.length);
+            this.initSearch();
+            this.initPagination();
+            this.initBody(true);
+        }
+    };
+
+    BootstrapTable.prototype.getRowByUniqueId = function (id) {
+        var uniqueId = this.options.uniqueId,
+            len = this.options.data.length,
+            dataRow = null,
+            i, row;
+
+        for (i = len - 1; i >= 0; i--) {
+            row = this.options.data[i];
+
+            if (!row.hasOwnProperty(uniqueId)) {
+                continue;
+            }
+
+            if (typeof row[uniqueId] === 'string') {
+                id = id.toString();
+            } else if (typeof row[uniqueId] === 'number') {
+                if ((Number(row[uniqueId]) === row[uniqueId]) && (row[uniqueId] % 1 === 0)) {
+                    id = parseInt(id);
+                } else if ((row[uniqueId] === Number(row[uniqueId])) && (row[uniqueId] !== 0)) {
+                    id = parseFloat(id);
+                }
+            }
+
+            if (row[uniqueId] === id) {
+                dataRow = row;
+                break;
+            }
+        }
+
+        return dataRow;
+    };
+
+    BootstrapTable.prototype.removeByUniqueId = function (id) {
+        var len = this.options.data.length,
+            row = this.getRowByUniqueId(id);
+
+        if (row) {
+            this.options.data.splice(this.options.data.indexOf(row), 1);
+        }
+
+        if (len === this.options.data.length) {
+            return;
+        }
+
+        this.initSearch();
+        this.initPagination();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.insertRow = function (params) {
+        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
+            return;
+        }
+        this.data.splice(params.index, 0, params.row);
+        this.initSearch();
+        this.initPagination();
+        this.initSort();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.updateRow = function (params) {
+        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
+            return;
+        }
+        $.extend(this.data[params.index], params.row);
+        this.initSort();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.showRow = function (params) {
+        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
+            return;
+        }
+        this.toggleRow(params.index, params.uniqueId, true);
+    };
+
+    BootstrapTable.prototype.hideRow = function (params) {
+        if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
+            return;
+        }
+        this.toggleRow(params.index, params.uniqueId, false);
+    };
+
+    BootstrapTable.prototype.getRowsHidden = function (show) {
+        var rows = $(this.$body[0]).children().filter(':hidden'),
+            i = 0;
+        if (show) {
+            for (; i < rows.length; i++) {
+                $(rows[i]).show();
+            }
+        }
+        return rows;
+    };
+
+    BootstrapTable.prototype.mergeCells = function (options) {
+        var row = options.index,
+            col = $.inArray(options.field, this.getVisibleFields()),
+            rowspan = options.rowspan || 1,
+            colspan = options.colspan || 1,
+            i, j,
+            $tr = this.$body.find('tr'),
+            $td;
+
+        if (this.options.detailView && !this.options.cardView) {
+            col += 1;
+        }
+
+        $td = $tr.eq(row).find('td').eq(col);
+
+        if (row < 0 || col < 0 || row >= this.data.length) {
+            return;
+        }
+
+        for (i = row; i < row + rowspan; i++) {
+            for (j = col; j < col + colspan; j++) {
+                $tr.eq(i).find('td').eq(j).hide();
+            }
+        }
+
+        $td.attr('rowspan', rowspan).attr('colspan', colspan).show();
+    };
+
+    BootstrapTable.prototype.updateCell = function (params) {
+        if (!params.hasOwnProperty('index') ||
+            !params.hasOwnProperty('field') ||
+            !params.hasOwnProperty('value')) {
+            return;
+        }
+        this.data[params.index][params.field] = params.value;
+        this.initSort();
+        this.initBody(true);
+    };
+
+    BootstrapTable.prototype.getOptions = function () {
+        return this.options;
+    };
+
+    BootstrapTable.prototype.getSelections = function () {
+        var that = this;
+
+        return $.grep(this.data, function (row) {
+            return row[that.header.stateField];
+        });
+    };
+
+    BootstrapTable.prototype.getAllSelections = function () {
+        var that = this;
+
+        return $.grep(this.options.data, function (row) {
+            return row[that.header.stateField];
+        });
+    };
+
+    BootstrapTable.prototype.checkAll = function () {
+        this.checkAll_(true);
+    };
+
+    BootstrapTable.prototype.uncheckAll = function () {
+        this.checkAll_(false);
+    };
+
+    BootstrapTable.prototype.checkAll_ = function (checked) {
+        var rows;
+        if (!checked) {
+            rows = this.getSelections();
+        }
+        this.$selectAll.add(this.$selectAll_).prop('checked', checked);
+        this.$selectItem.filter(':enabled').prop('checked', checked);
+        this.updateRows();
+        if (checked) {
+            rows = this.getSelections();
+        }
+        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);
+    };
+
+    BootstrapTable.prototype.check = function (index) {
+        this.check_(true, index);
+    };
+
+    BootstrapTable.prototype.uncheck = function (index) {
+        this.check_(false, index);
+    };
+
+    BootstrapTable.prototype.check_ = function (checked, index) {
+        this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+        this.data[index][this.header.stateField] = checked;
+        this.updateSelected();
+        this.trigger(checked ? 'check' : 'uncheck', this.data[index]);
+    };
+
+    BootstrapTable.prototype.checkBy = function (obj) {
+        this.checkBy_(true, obj);
+    };
+
+    BootstrapTable.prototype.uncheckBy = function (obj) {
+        this.checkBy_(false, obj);
+    };
+
+    BootstrapTable.prototype.checkBy_ = function (checked, obj) {
+        if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {
+            return;
+        }
+
+        var that = this,
+            rows = [];
+        $.each(this.options.data, function (index, row) {
+            if (!row.hasOwnProperty(obj.field)) {
+                return false;
+            }
+            if ($.inArray(row[obj.field], obj.values) !== -1) {
+                that.$selectItem.filter(':enabled')
+                    .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+                row[that.header.stateField] = checked;
+                rows.push(row);
+                that.trigger(checked ? 'check' : 'uncheck', row);
+            }
+        });
+        this.updateSelected();
+        this.trigger(checked ? 'check-some' : 'uncheck-some', rows);
+    };
+
+    BootstrapTable.prototype.destroy = function () {
+        this.$el.insertBefore(this.$container);
+        $(this.options.toolbar).insertBefore(this.$el);
+        this.$container.next().remove();
+        this.$container.remove();
+        this.$el.html(this.$el_.html())
+            .css('margin-top', '0')
+            .attr('class', this.$el_.attr('class') || ''); // reset the class
+    };
+
+    BootstrapTable.prototype.showLoading = function () {
+        this.$tableLoading.show();
+    };
+
+    BootstrapTable.prototype.hideLoading = function () {
+        this.$tableLoading.hide();
+    };
+
+    BootstrapTable.prototype.togglePagination = function () {
+        this.options.pagination = !this.options.pagination;
+        var button = this.$toolbar.find('button[name="paginationSwitch"] i');
+        if (this.options.pagination) {
+            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown);
+        } else {
+            button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp);
+        }
+        this.updatePagination();
+    };
+
+    BootstrapTable.prototype.refresh = function (params) {
+        if (params && params.url) {
+            this.options.url = params.url;
+            this.options.pageNumber = 1;
+        }
+        this.initServer(params && params.silent, params && params.query);
+    };
+
+    BootstrapTable.prototype.resetWidth = function () {
+        if (this.options.showHeader && this.options.height) {
+            this.fitHeader();
+        }
+        if (this.options.showFooter) {
+            this.fitFooter();
+        }
+    };
+
+    BootstrapTable.prototype.showColumn = function (field) {
+        this.toggleColumn(getFieldIndex(this.columns, field), true, true);
+    };
+
+    BootstrapTable.prototype.hideColumn = function (field) {
+        this.toggleColumn(getFieldIndex(this.columns, field), false, true);
+    };
+
+    BootstrapTable.prototype.getHiddenColumns = function () {
+        return $.grep(this.columns, function (column) {
+            return !column.visible;
+        });
+    };
+
+    BootstrapTable.prototype.filterBy = function (columns) {
+        this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
+        this.options.pageNumber = 1;
+        this.initSearch();
+        this.updatePagination();
+    };
+
+    BootstrapTable.prototype.scrollTo = function (value) {
+        if (typeof value === 'string') {
+            value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;
+        }
+        if (typeof value === 'number') {
+            this.$tableBody.scrollTop(value);
+        }
+        if (typeof value === 'undefined') {
+            return this.$tableBody.scrollTop();
+        }
+    };
+
+    BootstrapTable.prototype.getScrollPosition = function () {
+        return this.scrollTo();
+    };
+
+    BootstrapTable.prototype.selectPage = function (page) {
+        if (page > 0 && page <= this.options.totalPages) {
+            this.options.pageNumber = page;
+            this.updatePagination();
+        }
+    };
+
+    BootstrapTable.prototype.prevPage = function () {
+        if (this.options.pageNumber > 1) {
+            this.options.pageNumber--;
+            this.updatePagination();
+        }
+    };
+
+    BootstrapTable.prototype.nextPage = function () {
+        if (this.options.pageNumber < this.options.totalPages) {
+            this.options.pageNumber++;
+            this.updatePagination();
+        }
+    };
+
+    BootstrapTable.prototype.toggleView = function () {
+        this.options.cardView = !this.options.cardView;
+        this.initHeader();
+        // Fixed remove toolbar when click cardView button.
+        //that.initToolbar();
+        this.initBody();
+        this.trigger('toggle', this.options.cardView);
+    };
+
+    BootstrapTable.prototype.refreshOptions = function (options) {
+        //If the objects are equivalent then avoid the call of destroy / init methods
+        if (compareObjects(this.options, options, false)) {
+            return;
+        }
+        this.options = $.extend(this.options, options);
+        this.trigger('refresh-options', this.options);
+        this.destroy();
+        this.init();
+    };
+
+    BootstrapTable.prototype.resetSearch = function (text) {
+        var $search = this.$toolbar.find('.search input');
+        $search.val(text || '');
+        this.onSearch({currentTarget: $search});
+    };
+
+    BootstrapTable.prototype.expandRow_ = function (expand, index) {
+        var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index));
+        if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {
+            $tr.find('> td > .detail-icon').click();
+        }
+    };
+
+    BootstrapTable.prototype.expandRow = function (index) {
+        this.expandRow_(true, index);
+    };
+
+    BootstrapTable.prototype.collapseRow = function (index) {
+        this.expandRow_(false, index);
+    };
+
+    BootstrapTable.prototype.expandAllRows = function (isSubTable) {
+        if (isSubTable) {
+            var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)),
+                that = this,
+                detailIcon = null,
+                executeInterval = false,
+                idInterval = -1;
+
+            if (!$tr.next().is('tr.detail-view')) {
+                $tr.find('> td > .detail-icon').click();
+                executeInterval = true;
+            } else if (!$tr.next().next().is('tr.detail-view')) {
+                $tr.next().find(".detail-icon").click();
+                executeInterval = true;
+            }
+
+            if (executeInterval) {
+                try {
+                    idInterval = setInterval(function () {
+                        detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon");
+                        if (detailIcon.length > 0) {
+                            detailIcon.click();
+                        } else {
+                            clearInterval(idInterval);
+                        }
+                    }, 1);
+                } catch (ex) {
+                    clearInterval(idInterval);
+                }
+            }
+        } else {
+            var trs = this.$body.children();
+            for (var i = 0; i < trs.length; i++) {
+                this.expandRow_(true, $(trs[i]).data("index"));
+            }
+        }
+    };
+
+    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {
+        if (isSubTable) {
+            this.expandRow_(false, 0);
+        } else {
+            var trs = this.$body.children();
+            for (var i = 0; i < trs.length; i++) {
+                this.expandRow_(false, $(trs[i]).data("index"));
+            }
+        }
+    };
+
+    // BOOTSTRAP TABLE PLUGIN DEFINITION
+    // =======================
+
+    var allowedMethods = [
+        'getOptions',
+        'getSelections', 'getAllSelections', 'getData',
+        'load', 'append', 'prepend', 'remove', 'removeAll',
+        'insertRow', 'updateRow', 'updateCell', 'removeByUniqueId',
+        'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
+        'mergeCells',
+        'checkAll', 'uncheckAll',
+        'check', 'uncheck',
+        'checkBy', 'uncheckBy',
+        'refresh',
+        'resetView',
+        'resetWidth',
+        'destroy',
+        'showLoading', 'hideLoading',
+        'showColumn', 'hideColumn', 'getHiddenColumns',
+        'filterBy',
+        'scrollTo',
+        'getScrollPosition',
+        'selectPage', 'prevPage', 'nextPage',
+        'togglePagination',
+        'toggleView',
+        'refreshOptions',
+        'resetSearch',
+        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'
+    ];
+
+    $.fn.bootstrapTable = function (option) {
+        var value,
+            args = Array.prototype.slice.call(arguments, 1);
+
+        this.each(function () {
+            var $this = $(this),
+                data = $this.data('bootstrap.table'),
+                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),
+                    typeof option === 'object' && option);
+
+            if (typeof option === 'string') {
+                if ($.inArray(option, allowedMethods) < 0) {
+                    throw new Error("Unknown method: " + option);
+                }
+
+                if (!data) {
+                    return;
+                }
+
+                value = data[option].apply(data, args);
+
+                if (option === 'destroy') {
+                    $this.removeData('bootstrap.table');
+                }
+            }
+
+            if (!data) {
+                $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));
+            }
+        });
+
+        return typeof value === 'undefined' ? this : value;
+    };
+
+    $.fn.bootstrapTable.Constructor = BootstrapTable;
+    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;
+    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;
+    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;
+    $.fn.bootstrapTable.methods = allowedMethods;
+    $.fn.bootstrapTable.utils = {
+        sprintf: sprintf,
+        getFieldIndex: getFieldIndex,
+        compareObjects: compareObjects,
+        calculateObjectValue: calculateObjectValue
+    };
+
+    // BOOTSTRAP TABLE INIT
+    // =======================
+
+    $(function () {
+        $('[data-toggle="table"]').bootstrapTable();
+    });
+
+}(jQuery);
diff --git a/module/javascript/externs/bootstrap-table/bootstrap-table.min.js b/module/javascript/externs/bootstrap-table/bootstrap-table.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..5a83c03427f581204aabb9f648718a828c998c0c
--- /dev/null
+++ b/module/javascript/externs/bootstrap-table/bootstrap-table.min.js
@@ -0,0 +1,8 @@
+/*
+* bootstrap-table - v1.9.0 - 2015-09-30
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2015 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use strict";var b=null,c=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},d=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},e=function(b,c){var d=-1;return a.each(b,function(a,b){return b.field===c?(d=a,!1):!0}),d},f=function(b){var c,d,e,f=0,g=[];for(c=0;c<b[0].length;c++)f+=b[0][c].colspan||1;for(c=0;c<b.length;c++)for(g[c]=[],d=0;f>d;d++)g[c][d]=!1;for(c=0;c<b.length;c++)for(d=0;d<b[c].length;d++){var h=b[c][d],i=h.rowspan||1,j=h.colspan||1,k=a.inArray(!1,g[c]);for(1===j&&(h.fieldIndex=k,"undefined"==typeof h.field&&(h.field=k)),e=0;i>e;e++)g[c+e][k]=!0;for(e=0;j>e;e++)g[c][k+e]=!0}},g=function(){if(null===b){var c,d,e=a("<p/>").addClass("fixed-table-scroll-inner"),f=a("<div/>").addClass("fixed-table-scroll-outer");f.append(e),a("body").append(f),c=e[0].offsetWidth,f.css("overflow","scroll"),d=e[0].offsetWidth,c===d&&(d=f[0].clientWidth),f.remove(),b=c-d}return b},h=function(b,d,e,f){var g=d;if("string"==typeof d){var h=d.split(".");h.length>1?(g=window,a.each(h,function(a,b){g=g[b]})):g=window[d]}return"object"==typeof g?g:"function"==typeof g?g.apply(b,e):!g&&"string"==typeof d&&c.apply(this,[d].concat(e))?c.apply(this,[d].concat(e)):f},i=function(b,c,d){var e=Object.getOwnPropertyNames(b),f=Object.getOwnPropertyNames(c),g="";if(d&&e.length!==f.length)return!1;for(var h=0;h<e.length;h++)if(g=e[h],a.inArray(g,f)>-1&&b[g]!==c[g])return!1;return!0},j=function(a){return"string"==typeof a?a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):a},k=function(b){var c=0;return b.children().each(function(){c<a(this).outerHeight(!0)&&(c=a(this).outerHeight(!0))}),c},l=function(a){for(var b in a){var c=b.split(/(?=[A-Z])/).join("-").toLowerCase();c!==b&&(a[c]=a[b],delete a[b])}return a},m=function(a,b){var c=a;if("string"!=typeof b||a.hasOwnProperty(b))return a[b];var d=b.split(".");for(var e in d)c=c[d[e]];return c},n=function(b,c){this.options=c,this.$el=a(b),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()};n.DEFAULTS={classes:"table table-hover",locale:void 0,height:void 0,undefinedText:"-",sortName:void 0,sortOrder:"asc",striped:!1,columns:[[]],data:[],dataField:"rows",method:"get",url:void 0,ajax:void 0,cache:!0,contentType:"application/json",dataType:"json",ajaxOptions:{},queryParams:function(a){return a},queryParamsType:"limit",responseHandler:function(a){return a},pagination:!1,sidePagination:"client",totalRows:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationFirstText:"&laquo;",paginationPreText:"&lsaquo;",paginationNextText:"&rsaquo;",paginationLastText:"&raquo;",search:!1,strictSearch:!1,searchAlign:"right",selectItemName:"btSelectItem",showHeader:!0,showFooter:!1,showColumns:!1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,buttonsAlign:"right",smartDisplay:!0,minimumCountColumns:1,idField:void 0,uniqueId:void 0,cardView:!1,detailView:!1,detailFormatter:function(){return""},trimOnSearch:!0,clickToSelect:!1,singleSelect:!1,toolbar:void 0,toolbarAlign:"left",checkboxHeader:!0,sortable:!0,silentSort:!0,maintainSelected:!1,searchTimeOut:500,searchText:"",iconSize:void 0,iconsPrefix:"glyphicon",icons:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggle:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus"},rowStyle:function(){return{}},rowAttributes:function(){return{}},onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onResetView:function(){return!1}},n.LOCALES=[],n.LOCALES["en-US"]=n.LOCALES.en={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return c("%s records per page",a)},formatShowingRows:function(a,b,d){return c("Showing %s to %s of %s rows",a,b,d)},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"}},a.extend(n.DEFAULTS,n.LOCALES["en-US"]),n.COLUMN_DEFAULTS={radio:!1,checkbox:!1,checkboxEnabled:!0,field:void 0,title:void 0,titleTooltip:void 0,"class":void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,width:void 0,sortable:!1,order:"asc",visible:!0,switchable:!0,clickToSelect:!0,formatter:void 0,footerFormatter:void 0,events:void 0,sorter:void 0,sortName:void 0,cellStyle:void 0,searchable:!0,searchFormatter:!0,cardVisible:!0},n.EVENTS={"all.bs.table":"onAll","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView"},n.prototype.init=function(){this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initFooter(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()},n.prototype.initLocale=function(){if(this.options.locale){var b=this.options.locale.split(/-|_/);b[0].toLowerCase(),b[1]&&b[1].toUpperCase(),a.fn.bootstrapTable.locales[this.options.locale]?a.extend(this.options,a.fn.bootstrapTable.locales[this.options.locale]):a.fn.bootstrapTable.locales[b.join("-")]?a.extend(this.options,a.fn.bootstrapTable.locales[b.join("-")]):a.fn.bootstrapTable.locales[b[0]]&&a.extend(this.options,a.fn.bootstrapTable.locales[b[0]])}},n.prototype.initContainer=function(){this.$container=a(['<div class="bootstrap-table">','<div class="fixed-table-toolbar"></div>',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination" style="clear: both;"></div>':"",'<div class="fixed-table-container">','<div class="fixed-table-header"><table></table></div>','<div class="fixed-table-body">','<div class="fixed-table-loading">',this.options.formatLoadingMessage(),"</div>","</div>",'<div class="fixed-table-footer"><table><tr></tr></table></div>',"bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination"></div>':"","</div>","</div>"].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('<div class="clearfix"></div>'),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},n.prototype.initTable=function(){var b=this,c=[],d=[];this.$header=this.$el.find("thead"),this.$header.length||(this.$header=a("<thead></thead>").appendTo(this.$el)),this.$header.find("tr").each(function(){var b=[];a(this).find("th").each(function(){b.push(a.extend({},{title:a(this).html(),"class":a(this).attr("class"),titleTooltip:a(this).attr("title"),rowspan:a(this).attr("rowspan")?+a(this).attr("rowspan"):void 0,colspan:a(this).attr("colspan")?+a(this).attr("colspan"):void 0},a(this).data()))}),c.push(b)}),a.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=a.extend(!0,[],c,this.options.columns),this.columns=[],f(this.options.columns),a.each(this.options.columns,function(c,d){a.each(d,function(d,e){e=a.extend({},n.COLUMN_DEFAULTS,e),"undefined"!=typeof e.fieldIndex&&(b.columns[e.fieldIndex]=e),b.options.columns[c][d]=e})}),this.options.data.length||(this.$el.find("tbody tr").each(function(){var c={};c._id=a(this).attr("id"),c._class=a(this).attr("class"),c._data=l(a(this).data()),a(this).find("td").each(function(d){var e=b.columns[d].field;c[e]=a(this).html(),c["_"+e+"_id"]=a(this).attr("id"),c["_"+e+"_class"]=a(this).attr("class"),c["_"+e+"_rowspan"]=a(this).attr("rowspan"),c["_"+e+"_title"]=a(this).attr("title"),c["_"+e+"_data"]=l(a(this).data())}),d.push(c)}),this.options.data=d)},n.prototype.initHeader=function(){var b=this,d={},e=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},a.each(this.options.columns,function(f,g){e.push("<tr>"),0==f&&!b.options.cardView&&b.options.detailView&&e.push(c('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',b.options.columns.length)),a.each(g,function(a,f){var g="",h="",i="",j="",k=c(' class="%s"',f["class"]),l=(b.options.sortOrder||f.order,"px"),m=f.width;if(void 0===f.width||b.options.cardView||"string"==typeof f.width&&-1!==f.width.indexOf("%")&&(l="%"),f.width&&"string"==typeof f.width&&(m=f.width.replace("%","").replace("px","")),h=c("text-align: %s; ",f.halign?f.halign:f.align),i=c("text-align: %s; ",f.align),j=c("vertical-align: %s; ",f.valign),j+=c("width: %s; ",!f.checkbox&&!f.radio||m?m?m+l:void 0:"36px"),"undefined"!=typeof f.fieldIndex){if(b.header.fields[f.fieldIndex]=f.field,b.header.styles[f.fieldIndex]=i+j,b.header.classes[f.fieldIndex]=k,b.header.formatters[f.fieldIndex]=f.formatter,b.header.events[f.fieldIndex]=f.events,b.header.sorters[f.fieldIndex]=f.sorter,b.header.sortNames[f.fieldIndex]=f.sortName,b.header.cellStyles[f.fieldIndex]=f.cellStyle,b.header.searchables[f.fieldIndex]=f.searchable,!f.visible)return;if(b.options.cardView&&!f.cardVisible)return;d[f.field]=f}e.push("<th"+c(' title="%s"',f.titleTooltip),f.checkbox||f.radio?c(' class="bs-checkbox %s"',f["class"]||""):k,c(' style="%s"',h+j),c(' rowspan="%s"',f.rowspan),c(' colspan="%s"',f.colspan),c(' data-field="%s"',f.field),"tabindex='0'",">"),e.push(c('<div class="th-inner %s">',b.options.sortable&&f.sortable?"sortable both":"")),g=f.title,f.checkbox&&(!b.options.singleSelect&&b.options.checkboxHeader&&(g='<input name="btSelectAll" type="checkbox" />'),b.header.stateField=f.field),f.radio&&(g="",b.header.stateField=f.field,b.options.singleSelect=!0),e.push(g),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</th>")}),e.push("</tr>")}),this.$header.html(e.join("")),this.$header.find("th[data-field]").each(function(){a(this).data(d[a(this).data("field")])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(c){b.options.sortable&&a(this).parent().data().sortable&&b.onSort(c)}),this.$header.children().children().off("keypress").on("keypress",function(c){if(b.options.sortable&&a(this).data().sortable){var d=c.keyCode||c.which;13==d&&b.onSort(c)}}),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",this.$header.outerHeight()+1),this.getCaret()),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$container.off("click",'[name="btSelectAll"]').on("click",'[name="btSelectAll"]',function(){var c=a(this).prop("checked");b[c?"checkAll":"uncheckAll"]()})},n.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},n.prototype.initData=function(a,b){this.data="append"===b?this.data.concat(a):"prepend"===b?[].concat(a).concat(this.data):a||this.options.data,this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):this.data,"server"!==this.options.sidePagination&&this.initSort()},n.prototype.initSort=function(){var b=this,c=this.options.sortName,d="desc"===this.options.sortOrder?-1:1,e=a.inArray(this.options.sortName,this.header.fields);-1!==e&&this.data.sort(function(f,g){b.header.sortNames[e]&&(c=b.header.sortNames[e]);var i=m(f,c),j=m(g,c),k=h(b.header,b.header.sorters[e],[i,j]);return void 0!==k?d*k:((void 0===i||null===i)&&(i=""),(void 0===j||null===j)&&(j=""),a.isNumeric(i)&&a.isNumeric(j)?(i=parseFloat(i),j=parseFloat(j),j>i?-1*d:d):i===j?0:("string"!=typeof i&&(i=i.toString()),-1===i.localeCompare(j)?-1*d:d))})},n.prototype.onSort=function(b){var c="keypress"===b.type?a(b.currentTarget):a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder="asc"===c.data("order")?"desc":"asc"),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaret(),"server"===this.options.sidePagination?void this.initServer(this.options.silentSort):(this.initSort(),void this.initBody())},n.prototype.initToolbar=function(){var b,d,f=this,g=[],i=0,j=0;this.$toolbar.html(""),("string"==typeof this.options.toolbar||"object"==typeof this.options.toolbar)&&a(c('<div class="bars pull-%s"></div>',this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),g=[c('<div class="columns columns-%s btn-group pull-%s">',this.options.buttonsAlign,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=h(null,this.options.icons)),this.options.showPaginationSwitch&&g.push(c('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',this.options.formatPaginationSwitch()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.paginationSwitchDown),"</button>"),this.options.showRefresh&&g.push(c('<button class="btn btn-default'+(void 0===this.options.iconSize?"":" btn-"+this.options.iconSize)+'" type="button" name="refresh" title="%s">',this.options.formatRefresh()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.refresh),"</button>"),this.options.showToggle&&g.push(c('<button class="btn btn-default'+(void 0===this.options.iconSize?"":" btn-"+this.options.iconSize)+'" type="button" name="toggle" title="%s">',this.options.formatToggle()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.toggle),"</button>"),this.options.showColumns&&(g.push(c('<div class="keep-open btn-group" title="%s">',this.options.formatColumns()),'<button type="button" class="btn btn-default'+(void 0==this.options.iconSize?"":" btn-"+this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.columns),' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'),a.each(this.columns,function(a,b){if(!(b.radio||b.checkbox||f.options.cardView&&!b.cardVisible)){var d=b.visible?' checked="checked"':"";b.switchable&&(g.push(c('<li><label><input type="checkbox" data-field="%s" value="%s"%s> %s</label></li>',b.field,a,d,b.title)),j++)}}),g.push("</ul>","</div>")),g.push("</div>"),(this.showToolbar||g.length>2)&&this.$toolbar.append(g.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){f.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),j<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);f.toggleColumn(e(f.columns,a(this).data("field")),b.prop("checked"),!1),f.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(g=[],g.push('<div class="pull-'+this.options.searchAlign+' search">',c('<input class="form-control'+(void 0===this.options.iconSize?"":" input-"+this.options.iconSize)+'" type="text" placeholder="%s">',this.options.formatSearch()),"</div>"),this.$toolbar.append(g.join("")),d=this.$toolbar.find(".search input"),d.off("keyup drop").on("keyup drop",function(a){clearTimeout(i),i=setTimeout(function(){f.onSearch(a)},f.options.searchTimeOut)}))},n.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.pageNumber=1,this.initSearch(),this.updatePagination(),this.trigger("search",c))},n.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){var c=this.searchText&&this.searchText.toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(a){for(var b in d)if(a[b]!==d[b])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,f){for(var g in d){g=a.isNumeric(g)?parseInt(g,10):g;var i=d[g],j=b.columns[e(b.columns,g)],k=a.inArray(g,b.header.fields);j&&j.searchFormatter&&(i=h(j,b.header.formatters[k],[i,d,f],i));var l=a.inArray(g,b.header.fields);if(-1!==l&&b.header.searchables[l]&&("string"==typeof i||"number"==typeof i))if(b.options.strictSearch){if((i+"").toLowerCase()===c)return!0}else if(-1!==(i+"").toLowerCase().indexOf(c))return!0}return!1}):this.data}},n.prototype.initPagination=function(){if(!this.options.pagination)return void this.$pagination.hide();this.$pagination.show();var b,d,e,f,g,h,i,j,k,l=this,m=[],n=!1,o=this.getData();if("server"!==this.options.sidePagination&&(this.options.totalRows=o.length),this.totalPages=0,this.options.totalRows){if(this.options.pageSize===this.options.formatAllRows())this.options.pageSize=this.options.totalRows,n=!0;else if(this.options.pageSize===this.options.totalRows){var p="string"==typeof this.options.pageList?this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").toLowerCase().split(","):this.options.pageList;p.indexOf(this.options.formatAllRows().toLowerCase())>-1&&(n=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),m.push('<div class="pull-'+this.options.paginationDetailHAlign+' pagination-detail">','<span class="pagination-info">',this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),"</span>"),m.push('<span class="page-list">');var q=[c('<span class="btn-group %s">',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'<button type="button" class="btn btn-default '+(void 0===this.options.iconSize?"":" btn-"+this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">','<span class="page-size">',n?this.options.formatAllRows():this.options.pageSize,"</span>",' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'],r=this.options.pageList;if("string"==typeof this.options.pageList){var s=this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").split(",");r=[],a.each(s,function(a,b){r.push(b.toUpperCase()===l.options.formatAllRows().toUpperCase()?l.options.formatAllRows():+b)})}for(a.each(r,function(a,b){if(!l.options.smartDisplay||0===a||r[a-1]<=l.options.totalRows){var d;d=n?b===l.options.formatAllRows()?' class="active"':"":b===l.options.pageSize?' class="active"':"",q.push(c('<li%s><a href="javascript:void(0)">%s</a></li>',d,b))}}),q.push("</ul></span>"),m.push(this.options.formatRecordsPerPage(q.join(""))),m.push("</span>"),m.push("</div>",'<div class="pull-'+this.options.paginationHAlign+' pagination">','<ul class="pagination'+(void 0===this.options.iconSize?"":" pagination-"+this.options.iconSize)+'">','<li class="page-first"><a href="javascript:void(0)">'+this.options.paginationFirstText+"</a></li>",'<li class="page-pre"><a href="javascript:void(0)">'+this.options.paginationPreText+"</a></li>"),this.totalPages<5?(d=1,e=this.totalPages):(d=this.options.pageNumber-2,e=d+4,1>d&&(d=1,e=5),e>this.totalPages&&(e=this.totalPages,d=e-4)),b=d;e>=b;b++)m.push('<li class="page-number'+(b===this.options.pageNumber?" active":"")+'">','<a href="javascript:void(0)">',b,"</a>","</li>");m.push('<li class="page-next"><a href="javascript:void(0)">'+this.options.paginationNextText+"</a></li>",'<li class="page-last"><a href="javascript:void(0)">'+this.options.paginationLastText+"</a></li>","</ul>","</div>"),this.$pagination.html(m.join("")),f=this.$pagination.find(".page-list a"),g=this.$pagination.find(".page-first"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-last"),k=this.$pagination.find(".page-number"),this.options.pageNumber<=1&&(g.addClass("disabled"),h.addClass("disabled")),this.options.pageNumber>=this.totalPages&&(i.addClass("disabled"),j.addClass("disabled")),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(r.length<2||this.options.totalRows<=r[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),n&&(this.options.pageSize=this.options.formatAllRows()),f.off("click").on("click",a.proxy(this.onPageListChange,this)),g.off("click").on("click",a.proxy(this.onPageFirst,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageLast,this)),k.off("click").on("click",a.proxy(this.onPageNumber,this))},n.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},n.prototype.onPageListChange=function(b){var c=a(b.currentTarget);c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b)},n.prototype.onPageFirst=function(a){this.options.pageNumber=1,this.updatePagination(a)},n.prototype.onPagePre=function(a){this.options.pageNumber--,this.updatePagination(a)},n.prototype.onPageNext=function(a){this.options.pageNumber++,this.updatePagination(a)},n.prototype.onPageLast=function(a){this.options.pageNumber=this.totalPages,this.updatePagination(a)},n.prototype.onPageNumber=function(b){this.options.pageNumber!==+a(b.currentTarget).text()&&(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b))},n.prototype.initBody=function(b){var f=this,g=[],i=this.getData();this.trigger("pre-body",i),this.$body=this.$el.find("tbody"),this.$body.length||(this.$body=a("<tbody></tbody>").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=i.length);for(var k=this.pageFrom-1;k<this.pageTo;k++){var l,n=i[k],o={},p=[],q="",r={},s=[];if(o=h(this.options,this.options.rowStyle,[n,k],o),o&&o.css)for(l in o.css)p.push(l+": "+o.css[l]);if(r=h(this.options,this.options.rowAttributes,[n,k],r))for(l in r)s.push(c('%s="%s"',l,j(r[l])));n._data&&!a.isEmptyObject(n._data)&&a.each(n._data,function(a,b){"index"!==a&&(q+=c(' data-%s="%s"',a,b))}),g.push("<tr",c(" %s",s.join(" ")),c(' id="%s"',a.isArray(n)?void 0:n._id),c(' class="%s"',o.classes||(a.isArray(n)?void 0:n._class)),c(' data-index="%s"',k),c(' data-uniqueid="%s"',n[this.options.uniqueId]),c("%s",q),">"),this.options.cardView&&g.push(c('<td colspan="%s">',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&g.push("<td>",'<a class="detail-icon" href="javascript:">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.detailOpen),"</a>","</td>"),a.each(this.header.fields,function(b,i){var j="",l=m(n,i),q="",r={},s="",t=f.header.classes[b],u="",v="",w="",x=f.columns[e(f.columns,i)];if(x.visible){if(o=c('style="%s"',p.concat(f.header.styles[b]).join("; ")),l=h(x,f.header.formatters[b],[l,n,k],l),n["_"+i+"_id"]&&(s=c(' id="%s"',n["_"+i+"_id"])),n["_"+i+"_class"]&&(t=c(' class="%s"',n["_"+i+"_class"])),n["_"+i+"_rowspan"]&&(v=c(' rowspan="%s"',n["_"+i+"_rowspan"])),n["_"+i+"_title"]&&(w=c(' title="%s"',n["_"+i+"_title"])),r=h(f.header,f.header.cellStyles[b],[l,n,k],r),r.classes&&(t=c(' class="%s"',r.classes)),r.css){var y=[];for(var z in r.css)y.push(z+": "+r.css[z]);o=c('style="%s"',y.concat(f.header.styles[b]).join("; "))}n["_"+i+"_data"]&&!a.isEmptyObject(n["_"+i+"_data"])&&a.each(n["_"+i+"_data"],function(a,b){"index"!==a&&(u+=c(' data-%s="%s"',a,b))}),x.checkbox||x.radio?(q=x.checkbox?"checkbox":q,q=x.radio?"radio":q,j=[f.options.cardView?'<div class="card-view">':'<td class="bs-checkbox">',"<input"+c(' data-index="%s"',k)+c(' name="%s"',f.options.selectItemName)+c(' type="%s"',q)+c(' value="%s"',n[f.options.idField])+c(' checked="%s"',l===!0||l&&l.checked?"checked":void 0)+c(' disabled="%s"',!x.checkboxEnabled||l&&l.disabled?"disabled":void 0)+" />",f.header.formatters[b]&&"string"==typeof l?l:"",f.options.cardView?"</div>":"</td>"].join(""),n[f.header.stateField]=l===!0||l&&l.checked):(l="undefined"==typeof l||null===l?f.options.undefinedText:l,j=f.options.cardView?['<div class="card-view">',f.options.showHeader?c('<span class="title" %s>%s</span>',o,d(f.columns,"field","title",i)):"",c('<span class="value">%s</span>',l),"</div>"].join(""):[c("<td%s %s %s %s %s %s>",s,t,o,u,v,w),l,"</td>"].join(""),f.options.cardView&&f.options.smartDisplay&&""===l&&(j="")),g.push(j)}}),this.options.cardView&&g.push("</td>"),g.push("</tr>")}g.length||g.push('<tr class="no-records-found">',c('<td colspan="%s">%s</td>',this.$header.find("th").length,this.options.formatNoMatches()),"</tr>"),this.$body.html(g.join("")),b||this.scrollTo(0),this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(b){var d=a(this),g=d.parent(),h=f.data[g.data("index")],i=d[0].cellIndex,j=f.header.fields[f.options.detailView&&!f.options.cardView?i-1:i],k=f.columns[e(f.columns,j)],l=m(h,j);if(!d.find(".detail-icon").length&&(f.trigger("click"===b.type?"click-cell":"dbl-click-cell",j,l,h,d),f.trigger("click"===b.type?"click-row":"dbl-click-row",h,g),"click"===b.type&&f.options.clickToSelect&&k.clickToSelect)){var n=g.find(c('[name="%s"]',f.options.selectItemName));n.length&&n[0].click()}}),this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(){var b=a(this),d=b.parent().parent(),e=d.data("index"),g=i[e];d.next().is("tr.detail-view")?(b.find("i").attr("class",c("%s %s",f.options.iconsPrefix,f.options.icons.detailOpen)),d.next().remove(),f.trigger("collapse-row",e,g)):(b.find("i").attr("class",c("%s %s",f.options.iconsPrefix,f.options.icons.detailClose)),d.after(c('<tr class="detail-view"><td colspan="%s">%s</td></tr>',d.find("td").length,h(f.options,f.options.detailFormatter,[e,g],""))),f.trigger("expand-row",e,g,d.next().find("td"))),f.resetView()}),this.$selectItem=this.$body.find(c('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var c=a(this),d=c.prop("checked"),e=f.data[c.data("index")];f.options.maintainSelected&&a(this).is(":radio")&&a.each(f.options.data,function(a,b){b[f.header.stateField]=!1}),e[f.header.stateField]=d,f.options.singleSelect&&(f.$selectItem.not(this).each(function(){f.data[a(this).data("index")][f.header.stateField]=!1}),f.$selectItem.filter(":checked").not(this).prop("checked",!1)),f.updateSelected(),f.trigger(d?"check":"uncheck",e,c)}),a.each(this.header.events,function(b,c){if(c){"string"==typeof c&&(c=h(null,c));var d=f.header.fields[b],e=a.inArray(d,f.getVisibleFields());f.options.detailView&&!f.options.cardView&&(e+=1);for(var g in c)f.$body.find("tr").each(function(){var b=a(this),h=b.find(f.options.cardView?".card-view":"td").eq(e),i=g.indexOf(" "),j=g.substring(0,i),k=g.substring(i+1),l=c[g];h.find(k).off(j).on(j,function(a){var c=b.data("index"),e=f.data[c],g=e[d];l.apply(this,[a,g,e,c])})})}}),this.updateSelected(),this.resetView(),this.trigger("post-body")},n.prototype.initServer=function(b,c){var d,e=this,f={},g={pageSize:this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,pageNumber:this.options.pageNumber,searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};(this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(g={search:g.searchText,sort:g.sortName,order:g.sortOrder},this.options.pagination&&(g.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,g.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1))),a.isEmptyObject(this.filterColumnsPartial)||(g.filter=JSON.stringify(this.filterColumnsPartial,null)),f=h(this.options,this.options.queryParams,[g],f),a.extend(f,c||{}),f!==!1&&(b||this.$tableLoading.show(),d=a.extend({},h(null,this.options.ajaxOptions),{type:this.options.method,url:this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(f):f,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=h(e.options,e.options.responseHandler,[a],a),e.load(a),e.trigger("load-success",a)},error:function(a){e.trigger("load-error",a.status,a)},complete:function(){b||e.$tableLoading.hide()}}),this.options.ajax?h(this,this.options.ajax,[d],null):a.ajax(d)))},n.prototype.initSearchText=function(){if(this.options.search&&""!==this.options.searchText){var a=this.$toolbar.find(".search input");a.val(this.options.searchText),this.onSearch({
+currentTarget:a})}},n.prototype.getCaret=function(){var b=this;a.each(this.$header.find("th"),function(c,d){a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field")===b.options.sortName?b.options.sortOrder:"both")})},n.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).closest("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},n.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},n.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),b.header.stateField&&(c[b.header.stateField]=!1)})},n.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[n.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},n.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},n.prototype.fitHeader=function(){var b,d,e,f,h=this;if(h.$el.is(":hidden"))return void(h.timeoutId_=setTimeout(a.proxy(h.fitHeader,h),100));if(b=this.$tableBody.get(0),d=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.outerHeight()?g():0,this.$el.css("margin-top",-this.$header.outerHeight()),e=a(":focus"),e.length>0){var i=e.parents("th");if(i.length>0){var j=i.attr("data-field");if(void 0!==j){var k=this.$header.find("[data-field='"+j+"']");k.length>0&&k.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":d}).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_),f=a(".focus-temp:visible:eq(0)"),f.length>0&&(f.focus(),this.$header.find(".focus-temp").removeClass("focus-temp")),this.$header.find("th[data-field]").each(function(){h.$header_.find(c('th[data-field="%s"]',a(this).data("field"))).data(a(this).data())});var l=this.getVisibleFields();this.$body.find("tr:first-child:not(.no-records-found) > *").each(function(b){var d=a(this),e=b;h.options.detailView&&!h.options.cardView&&(0===b&&h.$header_.find("th.detail").find(".fht-cell").width(d.innerWidth()),e=b-1),h.$header_.find(c('th[data-field="%s"]',l[e])).find(".fht-cell").width(d.innerWidth())}),this.$tableBody.off("scroll").on("scroll",function(){h.$tableHeader.scrollLeft(a(this).scrollLeft()),h.options.showFooter&&!h.options.cardView&&h.$tableFooter.scrollLeft(a(this).scrollLeft())}),h.trigger("post-header")},n.prototype.resetFooter=function(){var b=this,d=b.getData(),e=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&e.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>'),a.each(this.columns,function(a,f){var g="",i="",j=c(' class="%s"',f["class"]);f.visible&&(!b.options.cardView||f.cardVisible)&&(g=c("text-align: %s; ",f.falign?f.falign:f.align),i=c("vertical-align: %s; ",f.valign),e.push("<td",j,c(' style="%s"',g+i),">"),e.push('<div class="th-inner">'),e.push(h(f,f.footerFormatter,[d],"&nbsp;")||"&nbsp;"),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</td>"))}),this.$tableFooter.find("tr").html(e.join("")),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},n.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?g():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),void this.$body.find("tr:first-child:not(.no-records-found) > *").each(function(c){var d=a(this);b.eq(c).find(".fht-cell").width(d.innerWidth())}))},n.prototype.toggleColumn=function(a,b,d){if(-1!==a&&(this.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var e=this.$toolbar.find(".keep-open input").prop("disabled",!1);d&&e.filter(c('[value="%s"]',a)).prop("checked",b),e.filter(":checked").length<=this.options.minimumCountColumns&&e.filter(":checked").prop("disabled",!0)}},n.prototype.toggleRow=function(a,b,d){-1!==a&&this.$body.find("undefined"!=typeof a?c('tr[data-index="%s"]',a):c('tr[data-uniqueid="%s"]',b))[d?"show":"hide"]()},n.prototype.getVisibleFields=function(){var b=this,c=[];return a.each(this.header.fields,function(a,d){var f=b.columns[e(b.columns,d)];f.visible&&c.push(d)}),c},n.prototype.resetView=function(a){var b=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var c=k(this.$toolbar),d=k(this.$pagination),e=this.options.height-c-d;this.$tableContainer.css("height",e+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),void this.$tableContainer.css("padding-bottom","0")):(this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),b+=this.$header.outerHeight()):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(b+=this.$tableFooter.outerHeight()+1)),this.getCaret(),this.$tableContainer.css("padding-bottom",b+"px"),void this.trigger("reset-view"))},n.prototype.getData=function(b){return!this.searchText&&a.isEmptyObject(this.filterColumns)&&a.isEmptyObject(this.filterColumnsPartial)?b?this.options.data.slice(this.pageFrom-1,this.pageTo):this.options.data:b?this.data.slice(this.pageFrom-1,this.pageTo):this.data},n.prototype.load=function(b){var c=!1;"server"===this.options.sidePagination?(this.options.totalRows=b.total,c=b.fixedScroll,b=b[this.options.dataField]):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},n.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initBody(!0)},n.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initBody(!0)},n.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&this.options.data.splice(c,1);e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))}},n.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},n.prototype.getRowByUniqueId=function(a){var b,c,d=this.options.uniqueId,e=this.options.data.length,f=null;for(b=e-1;b>=0;b--)if(c=this.options.data[b],c.hasOwnProperty(d)&&("string"==typeof c[d]?a=a.toString():"number"==typeof c[d]&&(Number(c[d])===c[d]&&c[d]%1===0?a=parseInt(a):c[d]===Number(c[d])&&0!==c[d]&&(a=parseFloat(a))),c[d]===a)){f=c;break}return f},n.prototype.removeByUniqueId=function(a){var b=this.options.data.length,c=this.getRowByUniqueId(a);c&&this.options.data.splice(this.options.data.indexOf(c),1),b!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},n.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},n.prototype.updateRow=function(b){b.hasOwnProperty("index")&&b.hasOwnProperty("row")&&(a.extend(this.data[b.index],b.row),this.initSort(),this.initBody(!0))},n.prototype.showRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("uniqueId")&&this.toggleRow(a.index,a.uniqueId,!0)},n.prototype.hideRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("uniqueId")&&this.toggleRow(a.index,a.uniqueId,!1)},n.prototype.getRowsHidden=function(b){var c=a(this.$body[0]).children().filter(":hidden"),d=0;if(b)for(;d<c.length;d++)a(c[d]).show();return c},n.prototype.mergeCells=function(b){var c,d,e,f=b.index,g=a.inArray(b.field,this.getVisibleFields()),h=b.rowspan||1,i=b.colspan||1,j=this.$body.find("tr");if(this.options.detailView&&!this.options.cardView&&(g+=1),e=j.eq(f).find("td").eq(g),!(0>f||0>g||f>=this.data.length)){for(c=f;f+h>c;c++)for(d=g;g+i>d;d++)j.eq(c).find("td").eq(d).hide();e.attr("rowspan",h).attr("colspan",i).show()}},n.prototype.updateCell=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("field")&&a.hasOwnProperty("value")&&(this.data[a.index][a.field]=a.value,this.initSort(),this.initBody(!0))},n.prototype.getOptions=function(){return this.options},n.prototype.getSelections=function(){var b=this;return a.grep(this.data,function(a){return a[b.header.stateField]})},n.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},n.prototype.checkAll=function(){this.checkAll_(!0)},n.prototype.uncheckAll=function(){this.checkAll_(!1)},n.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectAll.add(this.$selectAll_).prop("checked",a),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},n.prototype.check=function(a){this.check_(!0,a)},n.prototype.uncheck=function(a){this.check_(!1,a)},n.prototype.check_=function(a,b){this.$selectItem.filter(c('[data-index="%s"]',b)).prop("checked",a),this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b])},n.prototype.checkBy=function(a){this.checkBy_(!0,a)},n.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},n.prototype.checkBy_=function(b,d){if(d.hasOwnProperty("field")&&d.hasOwnProperty("values")){var e=this,f=[];a.each(this.options.data,function(g,h){return h.hasOwnProperty(d.field)?void(-1!==a.inArray(h[d.field],d.values)&&(e.$selectItem.filter(":enabled").filter(c('[data-index="%s"]',g)).prop("checked",b),h[e.header.stateField]=b,f.push(h),e.trigger(b?"check":"uncheck",h))):!1}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",f)}},n.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},n.prototype.showLoading=function(){this.$tableLoading.show()},n.prototype.hideLoading=function(){this.$tableLoading.hide()},n.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},n.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url,this.options.pageNumber=1),this.initServer(a&&a.silent,a&&a.query)},n.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&this.fitFooter()},n.prototype.showColumn=function(a){this.toggleColumn(e(this.columns,a),!0,!0)},n.prototype.hideColumn=function(a){this.toggleColumn(e(this.columns,a),!1,!0)},n.prototype.getHiddenColumns=function(){return a.grep(this.columns,function(a){return!a.visible})},n.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},n.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},n.prototype.getScrollPosition=function(){return this.scrollTo()},n.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},n.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},n.prototype.nextPage=function(){this.options.pageNumber<this.options.totalPages&&(this.options.pageNumber++,this.updatePagination())},n.prototype.toggleView=function(){this.options.cardView=!this.options.cardView,this.initHeader(),this.initBody(),this.trigger("toggle",this.options.cardView)},n.prototype.refreshOptions=function(b){i(this.options,b,!1)||(this.options=a.extend(this.options,b),this.trigger("refresh-options",this.options),this.destroy(),this.init())},n.prototype.resetSearch=function(a){var b=this.$toolbar.find(".search input");b.val(a||""),this.onSearch({currentTarget:b})},n.prototype.expandRow_=function(a,b){var d=this.$body.find(c('> tr[data-index="%s"]',b));d.next().is("tr.detail-view")===(a?!1:!0)&&d.find("> td > .detail-icon").click()},n.prototype.expandRow=function(a){this.expandRow_(!0,a)},n.prototype.collapseRow=function(a){this.expandRow_(!1,a)},n.prototype.expandAllRows=function(b){if(b){var d=this.$body.find(c('> tr[data-index="%s"]',0)),e=this,f=null,g=!1,h=-1;if(d.next().is("tr.detail-view")?d.next().next().is("tr.detail-view")||(d.next().find(".detail-icon").click(),g=!0):(d.find("> td > .detail-icon").click(),g=!0),g)try{h=setInterval(function(){f=e.$body.find("tr.detail-view").last().find(".detail-icon"),f.length>0?f.click():clearInterval(h)},1)}catch(i){clearInterval(h)}}else for(var j=this.$body.children(),k=0;k<j.length;k++)this.expandRow_(!0,a(j[k]).data("index"))},n.prototype.collapseAllRows=function(b){if(b)this.expandRow_(!1,0);else for(var c=this.$body.children(),d=0;d<c.length;d++)this.expandRow_(!1,a(c[d]).data("index"))};var o=["getOptions","getSelections","getAllSelections","getData","load","append","prepend","remove","removeAll","insertRow","updateRow","updateCell","removeByUniqueId","getRowByUniqueId","showRow","hideRow","getRowsHidden","mergeCells","checkAll","uncheckAll","check","uncheck","checkBy","uncheckBy","refresh","resetView","resetWidth","destroy","showLoading","hideLoading","showColumn","hideColumn","getHiddenColumns","filterBy","scrollTo","getScrollPosition","selectPage","prevPage","nextPage","togglePagination","toggleView","refreshOptions","resetSearch","expandRow","collapseRow","expandAllRows","collapseAllRows"];a.fn.bootstrapTable=function(b){var c,d=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=a(this),f=e.data("bootstrap.table"),g=a.extend({},n.DEFAULTS,e.data(),"object"==typeof b&&b);if("string"==typeof b){if(a.inArray(b,o)<0)throw new Error("Unknown method: "+b);if(!f)return;c=f[b].apply(f,d),"destroy"===b&&e.removeData("bootstrap.table")}f||e.data("bootstrap.table",f=new n(this,g))}),"undefined"==typeof c?this:c},a.fn.bootstrapTable.Constructor=n,a.fn.bootstrapTable.defaults=n.DEFAULTS,a.fn.bootstrapTable.columnDefaults=n.COLUMN_DEFAULTS,a.fn.bootstrapTable.locales=n.LOCALES,a.fn.bootstrapTable.methods=o,a.fn.bootstrapTable.utils={sprintf:c,getFieldIndex:e,compareObjects:i,calculateObjectValue:h},a(function(){a('[data-toggle="table"]').bootstrapTable()})}(jQuery);
\ No newline at end of file
diff --git a/module/javascript/externs/bootstrap-table/tableExport.js b/module/javascript/externs/bootstrap-table/tableExport.js
new file mode 100755
index 0000000000000000000000000000000000000000..6f851136e006321d7b70e47296a509de7b59d998
--- /dev/null
+++ b/module/javascript/externs/bootstrap-table/tableExport.js
@@ -0,0 +1,863 @@
+/*The MIT License (MIT)
+
+ Original work Copyright (c) 2014 https://github.com/kayalshri/
+ Modified work Copyright (c) 2015 https://github.com/hhurz/
+
+ 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.*/
+
+(function ($) {
+  $.fn.extend({
+    tableExport: function (options) {
+      var defaults = {
+        consoleLog: false,
+        csvEnclosure: '"',
+        csvSeparator: ',',
+        csvUseBOM: true,
+        displayTableName: false,
+        escape: false,
+        excelstyles: ['border-bottom', 'border-top', 'border-left', 'border-right'],
+        fileName: 'tableExport',
+        htmlContent: false,
+        ignoreColumn: [],
+        ignoreRow:[],
+        jspdf: {orientation: 'p',
+          unit: 'pt',
+          format: 'a4',
+          margins: {left: 20, right: 10, top: 10, bottom: 10},
+          autotable: {padding: 2,
+            lineHeight: 12,
+            fontSize: 8,
+            tableExport: {onAfterAutotable: null,
+              onBeforeAutotable: null,
+              onTable: null
+            }
+          }
+        },
+        onCellData: null,
+        outputMode: 'file', // file|string|base64
+        tbodySelector: 'tr',
+        theadSelector: 'tr',
+        tableName: 'myTableName',
+        type: 'csv',
+        worksheetName: 'xlsWorksheetName'
+      };
+
+      var el = this;
+      var DownloadEvt = null;
+      var rowIndex = 0;
+      var rowspans = [];
+      var trData = '';
+
+      $.extend(true, defaults, options);
+
+      if (defaults.type == 'csv' || defaults.type == 'txt') {
+
+        // Header
+        var csvData = "";
+        rowIndex = 0;
+        $(el).find('thead').first().find(defaults.theadSelector).each(function () {
+          trData = "";
+          ForEachVisibleCell(this, 'th,td', rowIndex,
+                  function (cell, row, col) {
+                    trData += csvString(cell, row, col) + defaults.csvSeparator;
+                  });
+          trData = $.trim(trData).substring(0, trData.length - 1);
+          if (trData.length > 0) {
+
+            if (csvData.length > 0)
+              csvData += "\n";
+
+            csvData += trData;
+          }
+          rowIndex++;
+        });
+
+        // Row vs Column
+        $(el).find('tbody').first().find(defaults.tbodySelector).each(function () {
+          trData = "";
+          ForEachVisibleCell(this, 'td', rowIndex,
+                  function (cell, row, col) {
+                    trData += csvString(cell, row, col) + defaults.csvSeparator;
+                  });
+          trData = $.trim(trData).substring(0, trData.length - 1);
+          if (trData.length > 0) {
+
+            if (csvData.length > 0)
+              csvData += "\n";
+
+            csvData += trData;
+          }
+          rowIndex++;
+        });
+
+        csvData += "\n";
+
+        //output
+        if (defaults.consoleLog === true)
+          console.log(csvData);
+
+        if (defaults.outputMode === 'string')
+          return csvData;
+
+        if (defaults.outputMode === 'base64')
+          return base64encode(csvData);
+
+        try {
+          var blob = new Blob([((defaults.type == 'csv' && defaults.csvUseBOM)? '\ufeff' : '') + csvData], {type: "text/" + (defaults.type == 'csv' ? 'csv' : 'plain') + ";charset=utf-8"});
+          saveAs(blob, defaults.fileName + '.' + defaults.type);
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.' + defaults.type,
+                  'data:text/' + (defaults.type == 'csv' ? 'csv' : 'plain') + ';charset=utf-8,' + ((defaults.type == 'csv' && defaults.csvUseBOM )? '\ufeff' : '') +
+                  encodeURIComponent(csvData));
+        }
+
+      } else if (defaults.type == 'sql') {
+
+        // Header
+        rowIndex = 0;
+        var tdData = "INSERT INTO `" + defaults.tableName + "` (";
+        $(el).find('thead').first().find(defaults.theadSelector).each(function () {
+
+          ForEachVisibleCell(this, 'th,td', rowIndex,
+                  function (cell, row, col) {
+                    tdData += "'" + parseString(cell, row, col) + "',";
+                  });
+          rowIndex++;
+          tdData = $.trim(tdData);
+          tdData = $.trim(tdData).substring(0, tdData.length - 1);
+        });
+        tdData += ") VALUES ";
+        // Row vs Column
+        $(el).find('tbody').first().find(defaults.tbodySelector).each(function () {
+          trData = "";
+          ForEachVisibleCell(this, 'td', rowIndex,
+                  function (cell, row, col) {
+                    trData += "'" + parseString(cell, row, col) + "',";
+                  });
+          if (trData.length > 3) {
+            tdData += "(" + trData;
+            tdData = $.trim(tdData).substring(0, tdData.length - 1);
+            tdData += "),";
+          }
+          rowIndex++;
+        });
+
+        tdData = $.trim(tdData).substring(0, tdData.length - 1);
+        tdData += ";";
+
+        //output
+        if (defaults.consoleLog === true)
+          console.log(tdData);
+
+        if (defaults.outputMode == 'string')
+          return tdData;
+
+        if (defaults.outputMode == 'base64')
+          return base64encode(tdData);
+
+        try {
+          var blob = new Blob([tdData], {type: "text/plain;charset=utf-8"});
+          saveAs(blob, defaults.fileName + '.sql');
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.sql', 'data:application/sql;charset=utf-8,' + encodeURIComponent(tdData));
+        }
+
+      } else if (defaults.type == 'json') {
+
+        var jsonHeaderArray = [];
+        $(el).find('thead').first().find(defaults.theadSelector).each(function () {
+          var jsonArrayTd = [];
+
+          ForEachVisibleCell(this, 'th,td', rowIndex,
+                  function (cell, row, col) {
+                    jsonArrayTd.push(parseString(cell, row, col));
+                  });
+          jsonHeaderArray.push(jsonArrayTd);
+        });
+
+        var jsonArray = [];
+        $(el).find('tbody').first().find(defaults.tbodySelector).each(function () {
+          var jsonArrayTd = [];
+
+          ForEachVisibleCell(this, 'td', rowIndex,
+                  function (cell, row, col) {
+                    jsonArrayTd.push(parseString(cell, row, col));
+                  });
+
+          if (jsonArrayTd.length > 0 && (jsonArrayTd.length != 1 || jsonArrayTd[0] != ""))
+            jsonArray.push(jsonArrayTd);
+
+          rowIndex++;
+        });
+
+        var jsonExportArray = [];
+        jsonExportArray.push({header: jsonHeaderArray, data: jsonArray});
+
+        var sdata = JSON.stringify(jsonExportArray);
+
+        if (defaults.consoleLog === true)
+          console.log(sdata);
+
+        if (defaults.outputMode == 'string')
+          return sdata;
+
+        var base64data = base64encode(sdata);
+
+        if (defaults.outputMode == 'base64')
+          return base64data;
+
+        try {
+          var blob = new Blob([sdata], {type: "application/json;charset=utf-8"});
+          saveAs(blob, defaults.fileName + '.json');
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.json', 'data:application/json;charset=utf-8;base64,' + base64data);
+        }
+
+      } else if (defaults.type === 'xml') {
+
+        rowIndex = 0;
+        var xml = '<?xml version="1.0" encoding="utf-8"?>';
+        xml += '<tabledata><fields>';
+
+        // Header
+        $(el).find('thead').first().find(defaults.theadSelector).each(function () {
+
+          ForEachVisibleCell(this, 'th,td', rowIndex,
+                  function (cell, row, col) {
+                    xml += "<field>" + parseString(cell, row, col) + "</field>";
+                  });
+          rowIndex++;
+        });
+        xml += '</fields><data>';
+
+        // Row Vs Column
+        var rowCount = 1;
+        $(el).find('tbody').first().find(defaults.tbodySelector).each(function () {
+          var colCount = 1;
+          trData = "";
+          ForEachVisibleCell(this, 'td', rowIndex,
+                  function (cell, row, col) {
+                    trData += "<column-" + colCount + ">" + parseString(cell, row, col) + "</column-" + colCount + ">";
+                    colCount++;
+                  });
+          if (trData.length > 0 && trData != "<column-1></column-1>") {
+            xml += '<row id="' + rowCount + '">' + trData + '</row>';
+            rowCount++;
+          }
+
+          rowIndex++;
+        });
+        xml += '</data></tabledata>';
+
+        //output
+        if (defaults.consoleLog === true)
+          console.log(xml);
+
+        if (defaults.outputMode == 'string')
+          return xml;
+
+        var base64data = base64encode(xml);
+
+        if (defaults.outputMode == 'base64')
+          return base64data;
+
+        try {
+          var blob = new Blob([xml], {type: "application/xml;charset=utf-8"});
+          saveAs(blob, defaults.fileName + '.xml');
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.xml', 'data:application/xml;charset=utf-8;base64,' + base64data);
+        }
+
+      } else if (defaults.type == 'excel' || defaults.type == 'doc') {
+        //console.log($(this).html());
+
+        rowIndex = 0;
+        var excelData = "<table>";
+        // Header
+        $(el).find('thead').first().find(defaults.theadSelector).each(function () {
+          trData = "";
+          ForEachVisibleCell(this, 'th,td', rowIndex,
+                  function (cell, row, col) {
+                    if (cell != null) {
+                      trData += "<td style='";
+                      for (var styles in defaults.excelstyles) {
+                        if (defaults.excelstyles.hasOwnProperty(styles)) {
+                          trData += defaults.excelstyles[styles] + ": " + $(cell).css(defaults.excelstyles[styles]) + ";";
+                        }
+                      }
+                      trData += "'>" + parseString(cell, row, col) + "</td>";
+                    }
+                  });
+          if (trData.length > 0)
+            excelData += "<tr>" + trData + '</tr>';
+          rowIndex++;
+        });
+
+        // Row Vs Column
+        $(el).find('tbody').first().find(defaults.tbodySelector).each(function () {
+          trData = "";
+          ForEachVisibleCell(this, 'td', rowIndex,
+                  function (cell, row, col) {
+                    if (cell != null) {
+                      trData += "<td style='";
+                      for (var styles in defaults.excelstyles) {
+                        if (defaults.excelstyles.hasOwnProperty(styles)) {
+                          trData += defaults.excelstyles[styles] + ": " + $(cell).css(defaults.excelstyles[styles]) + ";";
+                        }
+                      }
+                      if ($(cell).is("[colspan]"))
+                        trData += "' colspan='" + $(cell).attr('colspan');
+                      if ($(cell).is("[rowspan]"))
+                        trData += "' rowspan='" + $(cell).attr('rowspan');
+                      trData += "'>" + parseString(cell, row, col) + "</td>";
+                    }
+                  });
+          if (trData.length > 0)
+            excelData += "<tr>" + trData + '</tr>';
+          rowIndex++;
+        });
+
+        if (defaults.displayTableName)
+          excelData += "<tr><td></td></tr><tr><td></td></tr><tr><td>" + parseString($('<p>' + defaults.tableName + '</p>')) + "</td></tr>";
+
+        excelData += '</table>';
+
+        if (defaults.consoleLog === true)
+          console.log(excelData);
+
+        var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:" + defaults.type + "' xmlns='http://www.w3.org/TR/REC-html40'>";
+        excelFile += '<meta http-equiv="content-type" content="application/vnd.ms-' + defaults.type + '; charset=UTF-8">';
+        excelFile += '<meta http-equiv="content-type" content="application/';
+        excelFile += (defaults.type === 'excel') ? 'vnd.ms-excel' : 'msword';
+        excelFile += '; charset=UTF-8">';
+        excelFile += "<head>";
+        if (defaults.type === 'excel') {
+          excelFile += "<!--[if gte mso 9]>";
+          excelFile += "<xml>";
+          excelFile += "<x:ExcelWorkbook>";
+          excelFile += "<x:ExcelWorksheets>";
+          excelFile += "<x:ExcelWorksheet>";
+          excelFile += "<x:Name>";
+          excelFile += defaults.worksheetName;
+          excelFile += "</x:Name>";
+          excelFile += "<x:WorksheetOptions>";
+          excelFile += "<x:DisplayGridlines/>";
+          excelFile += "</x:WorksheetOptions>";
+          excelFile += "</x:ExcelWorksheet>";
+          excelFile += "</x:ExcelWorksheets>";
+          excelFile += "</x:ExcelWorkbook>";
+          excelFile += "</xml>";
+          excelFile += "<![endif]-->";
+        }
+        excelFile += "</head>";
+        excelFile += "<body>";
+        excelFile += excelData;
+        excelFile += "</body>";
+        excelFile += "</html>";
+
+        if (defaults.outputMode == 'string')
+          return excelFile;
+
+        var base64data = base64encode(excelFile);
+
+        if (defaults.outputMode === 'base64')
+          return base64data;
+
+        var extension = (defaults.type === 'excel') ? 'xls' : 'doc';
+        try {
+          var blob = new Blob([excelFile], {type: 'application/vnd.ms-' + defaults.type});
+          saveAs(blob, defaults.fileName + '.' + extension);
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.' + extension, 'data:application/vnd.ms-' + defaults.type + ';base64,' + base64data);
+        }
+
+      } else if (defaults.type == 'png') {
+        html2canvas($(el), {
+          onrendered: function (canvas) {
+
+            var image = canvas.toDataURL();
+            image = image.substring(22); // remove data stuff
+
+            var byteString = atob(image);
+            var buffer = new ArrayBuffer(byteString.length);
+            var intArray = new Uint8Array(buffer);
+
+            for (var i = 0; i < byteString.length; i++)
+              intArray[i] = byteString.charCodeAt(i);
+
+            try {
+              var blob = new Blob([buffer], {type: "image/png"});
+              saveAs(blob, defaults.fileName + '.png');
+            }
+            catch (e) {
+              downloadFile(defaults.fileName + '.png', 'data:image/png;base64,' + image);
+            }
+          }
+        });
+
+      } else if (defaults.type == 'pdf') {
+        if (defaults.jspdf.autotable === false) {
+          var addHtmlOptions = {
+            dim: {
+              w: getPropertyUnitValue($(el).first().get(0), 'width', 'mm'),
+              h: getPropertyUnitValue($(el).first().get(0), 'height', 'mm')
+            },
+            pagesplit: false
+          };
+
+          var doc = new jsPDF(defaults.jspdf.orientation, defaults.jspdf.unit, defaults.jspdf.format);
+          doc.addHTML($(el).first(),
+                  defaults.jspdf.margins.left,
+                  defaults.jspdf.margins.top,
+                  addHtmlOptions,
+                  function () {
+                    jsPdfOutput(doc);
+                  });
+          //delete doc;
+        }
+        else {
+          // pdf output using jsPDF AutoTable plugin
+          // https://github.com/someatoms/jsPDF-AutoTable
+
+          var teOptions = defaults.jspdf.autotable.tableExport;
+
+          // When setting jspdf.format to 'bestfit' tableExport tries to choose
+          // the minimum required paper format and orientation in which the table
+          // (or tables in multitable mode) completely fit without column adjustment
+          if (typeof defaults.jspdf.format === 'string' && defaults.jspdf.format.toLowerCase() === 'bestfit') {
+            var pageFormats = {
+              'a0': [2383.94, 3370.39], 'a1': [1683.78, 2383.94],
+              'a2': [1190.55, 1683.78], 'a3': [841.89, 1190.55],
+              'a4': [595.28, 841.89]
+            };
+            var rk = '', ro = '';
+            var mw = 0;
+
+            $(el).filter(':visible').each(function () {
+              if ($(this).css('display') != 'none') {
+                var w = getPropertyUnitValue($(this).get(0), 'width', 'pt');
+
+                if (w > mw) {
+                  if (w > pageFormats['a0'][0]) {
+                    rk = 'a0';
+                    ro = 'l';
+                  }
+                  for (var key in pageFormats) {
+                    if (pageFormats.hasOwnProperty(key)) {
+                      if (pageFormats[key][1] > w) {
+                        rk = key;
+                        ro = 'l';
+                        if (pageFormats[key][0] > w)
+                          ro = 'p';
+                      }
+                    }
+                  }
+                  mw = w;
+                }
+              }
+            });
+            defaults.jspdf.format = (rk == '' ? 'a4' : rk);
+            defaults.jspdf.orientation = (ro == '' ? 'w' : ro);
+          }
+
+          // The jsPDF doc object is stored in defaults.jspdf.autotable.tableExport,
+          // thus it can be accessed from any callback function from below
+          teOptions.doc = new jsPDF(defaults.jspdf.orientation,
+                  defaults.jspdf.unit,
+                  defaults.jspdf.format);
+
+          $(el).filter(':visible').each(function () {
+            if ($(this).css('display') != 'none') {
+              var colKey;
+              var rowIndex = 0;
+              var atOptions = {};
+
+              teOptions.columns = [];
+              teOptions.rows = [];
+              teOptions.rowoptions = {};
+
+              // onTable: optional callback function for every matching table that can be used
+              // to modify the tableExport options or to skip the output of a particular table
+              // when the  table selector targets multiple tables
+              if (typeof teOptions.onTable === 'function')
+                if (teOptions.onTable($(this), defaults) === false)
+                  return true; // continue to next iteration step (table)
+
+              // each table works with an own copy of AutoTable options
+              Object.keys(defaults.jspdf.autotable).forEach(function (key) {
+                atOptions[key] = defaults.jspdf.autotable[key];
+              });
+              atOptions.margins = {};
+              $.extend(true, atOptions.margins, defaults.jspdf.margins);
+
+              if (typeof atOptions.renderCell !== 'function') {
+
+                // draw cell text with original <td> alignment
+                atOptions.renderCell = function (x, y, width, height, key, value, row, settings) {
+                  var doc = settings.tableExport.doc;
+                  var xoffset = 0;
+
+                  doc.setFillColor(row % 2 === 0 ? 245 : 255);
+                  doc.setTextColor(50);
+                  doc.rect(x, y, width, height, 'F');
+                  y += settings.lineHeight / 2 + doc.autoTableTextHeight() / 2 - 2.5;
+
+                  if (typeof settings.tableExport.columns [key] != 'undefined') {
+                    var col = settings.tableExport.columns [key];
+                    if (typeof col.style != 'undefined') {
+                      var alignment = col.style.align;
+                      var rowopt = settings.tableExport.rowoptions [(row+1) + ":" + key];
+
+                      if (typeof rowopt != 'undefined')
+                        alignment = rowopt.style.align;
+
+                      if (alignment == 'right')
+                        xoffset = width - doc.getStringUnitWidth(('' + value)) * doc.internal.getFontSize() - settings.padding;
+                      else if (alignment == 'center')
+                        xoffset = (width - doc.getStringUnitWidth(('' + value)) * doc.internal.getFontSize()) / 2;
+                    }
+                  }
+
+                  if (xoffset < settings.padding)
+                    xoffset = settings.padding;
+
+                  doc.text(value, x + xoffset, y);
+                }
+              }
+
+              // collect header and data rows
+              $(this).find('thead').find(defaults.theadSelector).each(function () {
+                colKey = 0;
+
+                ForEachVisibleCell(this, 'th,td', rowIndex,
+                        function (cell, row, col) {
+                          var obj = {
+                            title: parseString(cell, row, col),
+                            key: colKey++,
+                            style: {
+                              align: getStyle(cell, 'text-align'),
+                              bcolor: getStyle(cell, 'background-color')
+                            }
+                          };
+                          teOptions.columns.push(obj);
+                        });
+                rowIndex++;
+              });
+
+              $(this).find('tbody').find(defaults.tbodySelector).each(function () {
+                var rowData = [];
+                var rowCount = 0;
+                colKey = 0;
+
+                ForEachVisibleCell(this, 'td', rowIndex,
+                        function (cell, row, col) {
+                          var obj = {
+                            style: {
+                              align: getStyle(cell, 'text-align'),
+                              bcolor: getStyle(cell, 'background-color')
+                            }
+                          };
+                          teOptions.rowoptions [rowCount + ":" + colKey++] = obj;
+
+                          rowData.push(parseString(cell, row, col));
+                        });
+                if (rowData.length) {
+                  teOptions.rows.push(rowData);
+                  rowCount++
+                }
+                rowIndex++;
+              });
+
+              // onBeforeAutotable: optional callback function before calling
+              // jsPDF AutoTable that can be used to modify the AutoTable options
+              if (typeof teOptions.onBeforeAutotable === 'function')
+                teOptions.onBeforeAutotable($(this), teOptions.columns, teOptions.rows, atOptions);
+
+              teOptions.doc.autoTable(teOptions.columns, teOptions.rows, atOptions);
+
+              // onAfterAutotable: optional callback function after returning
+              // from jsPDF AutoTable that can be used to modify the AutoTable options
+              if (typeof teOptions.onAfterAutotable === 'function')
+                teOptions.onAfterAutotable($(this), atOptions);
+
+              // set the start position for the next table (in case there is one)
+              defaults.jspdf.autotable.startY = teOptions.doc.autoTableEndPosY() + atOptions.margins.top;
+            }
+          });
+
+          jsPdfOutput(teOptions.doc);
+
+          teOptions.columns.length = 0;
+          teOptions.rows.length = 0;
+          delete teOptions.doc;
+          teOptions.doc = null;
+        }
+      }
+      
+      function ForEachVisibleCell(tableRow, selector, rowIndex, cellcallback) {
+        if (defaults.ignoreRow.indexOf(rowIndex) == -1) {
+          $(tableRow).filter(':visible').find(selector).each(function (colIndex) {
+            if ($(this).data("tableexport-display") == 'always' ||
+                ($(this).css('display') != 'none' &&
+                 $(this).css('visibility') != 'hidden' &&
+                 $(this).data("tableexport-display") != 'none')) {
+              if (defaults.ignoreColumn.indexOf(colIndex) == -1) {
+                if (typeof (cellcallback) === "function") {
+                  var cs = 0; // colspan value
+
+                  // handle previously detected rowspans
+                  if (typeof rowspans[rowIndex] != 'undefined' && rowspans[rowIndex].length > 0) {
+                    for (c = 0; c <= colIndex; c++) {
+                      if (typeof rowspans[rowIndex][c] != 'undefined') {
+                        cellcallback(null, rowIndex, c);
+                        delete rowspans[rowIndex][c];
+                        colIndex++;
+                      }
+                    }
+                  }
+
+                  // output content of current cell
+                  cellcallback(this, rowIndex, colIndex);
+
+                  // handle colspan of current cell
+                  if ($(this).is("[colspan]")) {
+                    cs = $(this).attr('colspan');
+                    for (c = 0; c < cs - 1; c++)
+                      cellcallback(null, rowIndex, colIndex + c);
+                  }
+
+                  // store rowspan for following rows
+                  if ($(this).is("[rowspan]")) {
+                    var rs = parseInt($(this).attr('rowspan'));
+
+                    for (r = 1; r < rs; r++) {
+                      if (typeof rowspans[rowIndex + r] == 'undefined')
+                        rowspans[rowIndex + r] = [];
+                      rowspans[rowIndex + r][colIndex] = "";
+
+                      for (c = 1; c < cs; c++)
+                        rowspans[rowIndex + r][colIndex + c] = "";
+                    }
+                  }
+                }
+              }
+            }
+          });
+        }
+      }
+
+      function jsPdfOutput(doc) {
+        if (defaults.consoleLog === true)
+          console.log(doc.output());
+
+        if (defaults.outputMode == 'string')
+          return doc.output();
+
+        if (defaults.outputMode == 'base64')
+          return base64encode(doc.output());
+
+        try {
+          var blob = doc.output('blob');
+          saveAs(blob, defaults.fileName + '.pdf');
+        }
+        catch (e) {
+          downloadFile(defaults.fileName + '.pdf', 'data:application/pdf;base64,' + base64encode(doc.output()));
+        }
+      }
+
+      function escapeRegExp(string) {
+        return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
+      }
+
+      function replaceAll(string, find, replace) {
+        return string.replace(new RegExp(escapeRegExp(find), 'g'), replace);
+      }
+
+      function csvString(cell, rowIndex, colIndex) {
+        var result = '';
+
+        if (cell != null) {
+          var dataString = parseString(cell, rowIndex, colIndex);
+
+          var csvValue = (dataString === null || dataString == '') ? '' : dataString.toString();
+
+          if (dataString instanceof Date)
+            result = defaults.csvEnclosure + dataString.toLocaleString() + defaults.csvEnclosure;
+          else {
+            result = replaceAll(csvValue, defaults.csvEnclosure, defaults.csvEnclosure + defaults.csvEnclosure);
+
+            if (result.indexOf(defaults.csvSeparator) >= 0 || /[\r\n ]/g.test(result))
+              result = defaults.csvEnclosure + result + defaults.csvEnclosure;
+          }
+        }
+
+        return result;
+      }
+
+      function parseString(cell, rowIndex, colIndex) {
+        var result = '';
+
+        if (cell != null) {
+          var $cell = $(cell);
+
+          if (defaults.htmlContent === true) {
+            result = $cell.html().trim();
+          } else {
+            result = $cell.text().trim().replace(/\u00AD/g, ""); // remove soft hyphens
+          }
+
+          if (defaults.escape === true) {
+            result = escape(result);
+          }
+
+          if (typeof defaults.onCellData === 'function') {
+            result = defaults.onCellData($cell, rowIndex, colIndex, result);
+          }
+        }
+
+        return result;
+      }
+
+      function hyphenate(a, b, c) {
+        return b + "-" + c.toLowerCase();
+      }
+
+      // get computed style property
+      function getStyle(target, prop) {
+        try {
+          if (window.getComputedStyle) { // gecko and webkit
+            prop = prop.replace(/([a-z])([A-Z])/, hyphenate);  // requires hyphenated, not camel
+            return window.getComputedStyle(target, null).getPropertyValue(prop);
+          }
+          if (target.currentStyle) { // ie
+            return target.currentStyle[prop];
+          }
+          return target.style[prop];
+        }
+        catch (e) {
+        }
+        return "";
+      }
+
+      function getPropertyUnitValue(target, prop, unit) {
+        var baseline = 100;  // any number serves
+
+        var value = getStyle(target, prop);  // get the computed style value
+
+        var numeric = value.match(/\d+/);  // get the numeric component
+        if (numeric !== null) {
+          numeric = numeric[0];  // get the string
+
+          var temp = document.createElement("div");  // create temporary element
+          temp.style.overflow = "hidden";  // in case baseline is set too low
+          temp.style.visibility = "hidden";  // no need to show it
+
+          target.parentElement.appendChild(temp); // insert it into the parent for em, ex and %
+
+          temp.style.width = baseline + unit;
+          var factor = baseline / temp.offsetWidth;
+
+          target.parentElement.removeChild(temp);  // clean up
+
+          return (numeric * factor);
+        }
+        return 0;
+      }
+
+      function downloadFile(filename, data) {
+        var DownloadLink = document.createElement('a');
+
+        if (DownloadLink) {
+          document.body.appendChild(DownloadLink);
+          DownloadLink.style = 'display: none';
+          DownloadLink.download = filename;
+          DownloadLink.href = data;
+
+          if (document.createEvent) {
+            if (DownloadEvt == null)
+              DownloadEvt = document.createEvent('MouseEvents');
+
+            DownloadEvt.initEvent('click', true, false);
+            DownloadLink.dispatchEvent(DownloadEvt);
+          }
+          else if (document.createEventObject)
+            DownloadLink.fireEvent('onclick');
+          else if (typeof DownloadLink.onclick == 'function')
+            DownloadLink.onclick();
+
+          document.body.removeChild(DownloadLink);
+        }
+      }
+
+      function utf8Encode(string) {
+        string = string.replace(/\x0d\x0a/g, "\x0a");
+        var utftext = "";
+        for (var n = 0; n < string.length; n++) {
+          var c = string.charCodeAt(n);
+          if (c < 128) {
+            utftext += String.fromCharCode(c);
+          }
+          else if ((c > 127) && (c < 2048)) {
+            utftext += String.fromCharCode((c >> 6) | 192);
+            utftext += String.fromCharCode((c & 63) | 128);
+          }
+          else {
+            utftext += String.fromCharCode((c >> 12) | 224);
+            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+            utftext += String.fromCharCode((c & 63) | 128);
+          }
+        }
+        return utftext;
+      }
+
+      function base64encode(input) {
+        var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+        var output = "";
+        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
+        var i = 0;
+        input = utf8Encode(input);
+        while (i < input.length) {
+          chr1 = input.charCodeAt(i++);
+          chr2 = input.charCodeAt(i++);
+          chr3 = input.charCodeAt(i++);
+          enc1 = chr1 >> 2;
+          enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+          enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+          enc4 = chr3 & 63;
+          if (isNaN(chr2)) {
+            enc3 = enc4 = 64;
+          } else if (isNaN(chr3)) {
+            enc4 = 64;
+          }
+          output = output +
+                  keyStr.charAt(enc1) + keyStr.charAt(enc2) +
+                  keyStr.charAt(enc3) + keyStr.charAt(enc4);
+        }
+        return output;
+      }
+
+      return this;
+    }
+  });
+})(jQuery);
\ No newline at end of file
diff --git a/module/javascript/externs/bootstrap-toggle/LICENSE b/module/javascript/externs/bootstrap-toggle/LICENSE
new file mode 100755
index 0000000000000000000000000000000000000000..640bcf30fb7ef36ccd49b8adc306538a3d9bb529
--- /dev/null
+++ b/module/javascript/externs/bootstrap-toggle/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2011-2014 Min Hur, The New York Times Company
+
+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/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js b/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..37113200bff5c01b5b34048aa5b491f78fe30f81
--- /dev/null
+++ b/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js
@@ -0,0 +1,9 @@
+/*! ========================================================================
+ * Bootstrap Toggle: bootstrap-toggle.js v2.2.0
+ * http://www.bootstraptoggle.com
+ * ========================================================================
+ * Copyright 2014 Min Hur, The New York Times Company
+ * Licensed under MIT
+ * ======================================================================== */
++function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery);
+//# sourceMappingURL=bootstrap-toggle.min.js.map
\ No newline at end of file
diff --git a/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js.map b/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js.map
new file mode 100755
index 0000000000000000000000000000000000000000..ac388afd70bd36251d9c8701adb6a23fa6457a82
--- /dev/null
+++ b/module/javascript/externs/bootstrap-toggle/bootstrap-toggle.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"bootstrap-toggle.min.js","sources":["bootstrap-toggle.js"],"names":["$","Plugin","option","this","each","$this","data","options","Toggle","element","$element","extend","defaults","render","VERSION","DEFAULTS","on","off","onstyle","offstyle","size","style","width","height","prototype","attr","_onstyle","_offstyle","$toggleOn","html","addClass","$toggleOff","$toggleHandle","$toggleGroup","append","$toggle","prop","wrap","parent","Math","max","outerWidth","outerHeight","css","update","trigger","toggle","silent","removeClass","enable","removeAttr","disable","change","proxy","destroy","remove","removeData","unwrap","old","fn","bootstrapToggle","Constructor","noConflict","document","e","$checkbox","find","preventDefault","jQuery"],"mappings":";;;;;;;CASE,SAAUA,GACV,YAoID,SAASC,GAAOC,GACf,MAAOC,MAAKC,KAAK,WAChB,GAAIC,GAAUL,EAAEG,MACZG,EAAUD,EAAMC,KAAK,aACrBC,EAA2B,gBAAVL,IAAsBA,CAEtCI,IAAMD,EAAMC,KAAK,YAAcA,EAAO,GAAIE,GAAOL,KAAMI,IACvC,gBAAVL,IAAsBI,EAAKJ,IAASI,EAAKJ,OAtItD,GAAIM,GAAS,SAAUC,EAASF,GAC/BJ,KAAKO,SAAYV,EAAES,GACnBN,KAAKI,QAAYP,EAAEW,UAAWR,KAAKS,WAAYL,GAC/CJ,KAAKU,SAGNL,GAAOM,QAAW,QAElBN,EAAOO,UACNC,GAAI,KACJC,IAAK,MACLC,QAAS,UACTC,SAAU,UACVC,KAAM,SACNC,MAAO,GACPC,MAAO,KACPC,OAAQ,MAGTf,EAAOgB,UAAUZ,SAAW,WAC3B,OACCI,GAAIb,KAAKO,SAASe,KAAK,YAAcjB,EAAOO,SAASC,GACrDC,IAAKd,KAAKO,SAASe,KAAK,aAAejB,EAAOO,SAASE,IACvDC,QAASf,KAAKO,SAASe,KAAK,iBAAmBjB,EAAOO,SAASG,QAC/DC,SAAUhB,KAAKO,SAASe,KAAK,kBAAoBjB,EAAOO,SAASI,SACjEC,KAAMjB,KAAKO,SAASe,KAAK,cAAgBjB,EAAOO,SAASK,KACzDC,MAAOlB,KAAKO,SAASe,KAAK,eAAiBjB,EAAOO,SAASM,MAC3DC,MAAOnB,KAAKO,SAASe,KAAK,eAAiBjB,EAAOO,SAASO,MAC3DC,OAAQpB,KAAKO,SAASe,KAAK,gBAAkBjB,EAAOO,SAASQ,SAI/Df,EAAOgB,UAAUX,OAAS,WACzBV,KAAKuB,SAAW,OAASvB,KAAKI,QAAQW,QACtCf,KAAKwB,UAAY,OAASxB,KAAKI,QAAQY,QACvC,IAAIC,GAA6B,UAAtBjB,KAAKI,QAAQa,KAAmB,SAClB,UAAtBjB,KAAKI,QAAQa,KAAmB,SACV,SAAtBjB,KAAKI,QAAQa,KAAkB,SAC/B,GACCQ,EAAY5B,EAAE,uBAAuB6B,KAAK1B,KAAKI,QAAQS,IACzDc,SAAS3B,KAAKuB,SAAW,IAAMN,GAC7BW,EAAa/B,EAAE,uBAAuB6B,KAAK1B,KAAKI,QAAQU,KAC1Da,SAAS3B,KAAKwB,UAAY,IAAMP,EAAO,WACrCY,EAAgBhC,EAAE,gDACpB8B,SAASV,GACPa,EAAejC,EAAE,8BACnBkC,OAAON,EAAWG,EAAYC,GAC5BG,EAAUnC,EAAE,iDACd8B,SAAU3B,KAAKO,SAAS0B,KAAK,WAAajC,KAAKuB,SAAWvB,KAAKwB,UAAU,QACzEG,SAASV,GAAMU,SAAS3B,KAAKI,QAAQc,MAEvClB,MAAKO,SAAS2B,KAAKF,GACnBnC,EAAEW,OAAOR,MACRgC,QAAShC,KAAKO,SAAS4B,SACvBV,UAAWA,EACXG,WAAYA,EACZE,aAAcA,IAEf9B,KAAKgC,QAAQD,OAAOD,EAEpB,IAAIX,GAAQnB,KAAKI,QAAQe,OAASiB,KAAKC,IAAIZ,EAAUa,aAAcV,EAAWU,cAAeT,EAAcS,aAAa,EACpHlB,EAASpB,KAAKI,QAAQgB,QAAUgB,KAAKC,IAAIZ,EAAUc,cAAeX,EAAWW,cACjFd,GAAUE,SAAS,aACnBC,EAAWD,SAAS,cACpB3B,KAAKgC,QAAQQ,KAAMrB,MAAOA,EAAOC,OAAQA,IACrCpB,KAAKI,QAAQgB,SAChBK,EAAUe,IAAI,cAAef,EAAUL,SAAW,MAClDQ,EAAWY,IAAI,cAAeZ,EAAWR,SAAW,OAErDpB,KAAKyC,QAAO,GACZzC,KAAK0C,SAAQ,IAGdrC,EAAOgB,UAAUsB,OAAS,WACrB3C,KAAKO,SAAS0B,KAAK,WAAYjC,KAAKc,MACnCd,KAAKa,MAGXR,EAAOgB,UAAUR,GAAK,SAAU+B,GAC/B,MAAI5C,MAAKO,SAAS0B,KAAK,aAAoB,GAC3CjC,KAAKgC,QAAQa,YAAY7C,KAAKwB,UAAY,QAAQG,SAAS3B,KAAKuB,UAChEvB,KAAKO,SAAS0B,KAAK,WAAW,QACzBW,GAAQ5C,KAAK0C,aAGnBrC,EAAOgB,UAAUP,IAAM,SAAU8B,GAChC,MAAI5C,MAAKO,SAAS0B,KAAK,aAAoB,GAC3CjC,KAAKgC,QAAQa,YAAY7C,KAAKuB,UAAUI,SAAS3B,KAAKwB,UAAY,QAClExB,KAAKO,SAAS0B,KAAK,WAAW,QACzBW,GAAQ5C,KAAK0C,aAGnBrC,EAAOgB,UAAUyB,OAAS,WACzB9C,KAAKgC,QAAQe,WAAW,YACxB/C,KAAKO,SAAS0B,KAAK,YAAY,IAGhC5B,EAAOgB,UAAU2B,QAAU,WAC1BhD,KAAKgC,QAAQV,KAAK,WAAY,YAC9BtB,KAAKO,SAAS0B,KAAK,YAAY,IAGhC5B,EAAOgB,UAAUoB,OAAS,SAAUG,GAC/B5C,KAAKO,SAAS0B,KAAK,YAAajC,KAAKgD,UACpChD,KAAK8C,SACN9C,KAAKO,SAAS0B,KAAK,WAAYjC,KAAKa,GAAG+B,GACtC5C,KAAKc,IAAI8B,IAGfvC,EAAOgB,UAAUqB,QAAU,SAAUE,GACpC5C,KAAKO,SAASO,IAAI,oBACb8B,GAAQ5C,KAAKO,SAAS0C,SAC3BjD,KAAKO,SAASM,GAAG,mBAAoBhB,EAAEqD,MAAM,WAC5ClD,KAAKyC,UACHzC,QAGJK,EAAOgB,UAAU8B,QAAU,WAC1BnD,KAAKO,SAASO,IAAI,oBAClBd,KAAK8B,aAAasB,SAClBpD,KAAKO,SAAS8C,WAAW,aACzBrD,KAAKO,SAAS+C,SAiBf,IAAIC,GAAM1D,EAAE2D,GAAGC,eAEf5D,GAAE2D,GAAGC,gBAA8B3D,EACnCD,EAAE2D,GAAGC,gBAAgBC,YAAcrD,EAKnCR,EAAE2D,GAAGb,OAAOgB,WAAa,WAExB,MADA9D,GAAE2D,GAAGC,gBAAkBF,EAChBvD,MAMRH,EAAE,WACDA,EAAE,6CAA6C4D,oBAGhD5D,EAAE+D,UAAU/C,GAAG,kBAAmB,2BAA4B,SAASgD,GACtE,GAAIC,GAAYjE,EAAEG,MAAM+D,KAAK,uBAC7BD,GAAUL,gBAAgB,UAC1BI,EAAEG,oBAGFC"}
\ No newline at end of file
diff --git a/module/javascript/externs/html2canvas/LICENSE b/module/javascript/externs/html2canvas/LICENSE
new file mode 100755
index 0000000000000000000000000000000000000000..a02f5dd90a5dafd415e3f4dc83247579a318f902
--- /dev/null
+++ b/module/javascript/externs/html2canvas/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Niklas von Hertzen
+
+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/module/javascript/externs/html2canvas/html2canvas.js b/module/javascript/externs/html2canvas/html2canvas.js
new file mode 100755
index 0000000000000000000000000000000000000000..152316b6368f15e622379fb0e6c3731698c5071b
--- /dev/null
+++ b/module/javascript/externs/html2canvas/html2canvas.js
@@ -0,0 +1,2868 @@
+/*
+  html2canvas 0.4.1 <http://html2canvas.hertzen.com>
+  Copyright (c) 2013 Niklas von Hertzen
+
+  Released under MIT License
+*/
+
+(function(window, document, undefined){
+
+"use strict";
+
+var _html2canvas = {},
+previousElement,
+computedCSS,
+html2canvas;
+
+_html2canvas.Util = {};
+
+_html2canvas.Util.log = function(a) {
+  if (_html2canvas.logging && window.console && window.console.log) {
+    window.console.log(a);
+  }
+};
+
+_html2canvas.Util.trimText = (function(isNative){
+  return function(input) {
+    return isNative ? isNative.apply(input) : ((input || '') + '').replace( /^\s+|\s+$/g , '' );
+  };
+})(String.prototype.trim);
+
+_html2canvas.Util.asFloat = function(v) {
+  return parseFloat(v);
+};
+
+(function() {
+  // TODO: support all possible length values
+  var TEXT_SHADOW_PROPERTY = /((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g;
+  var TEXT_SHADOW_VALUES = /(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g;
+  _html2canvas.Util.parseTextShadows = function (value) {
+    if (!value || value === 'none') {
+      return [];
+    }
+
+    // find multiple shadow declarations
+    var shadows = value.match(TEXT_SHADOW_PROPERTY),
+      results = [];
+    for (var i = 0; shadows && (i < shadows.length); i++) {
+      var s = shadows[i].match(TEXT_SHADOW_VALUES);
+      results.push({
+        color: s[0],
+        offsetX: s[1] ? s[1].replace('px', '') : 0,
+        offsetY: s[2] ? s[2].replace('px', '') : 0,
+        blur: s[3] ? s[3].replace('px', '') : 0
+      });
+    }
+    return results;
+  };
+})();
+
+
+_html2canvas.Util.parseBackgroundImage = function (value) {
+    var whitespace = ' \r\n\t',
+        method, definition, prefix, prefix_i, block, results = [],
+        c, mode = 0, numParen = 0, quote, args;
+
+    var appendResult = function(){
+        if(method) {
+            if(definition.substr( 0, 1 ) === '"') {
+                definition = definition.substr( 1, definition.length - 2 );
+            }
+            if(definition) {
+                args.push(definition);
+            }
+            if(method.substr( 0, 1 ) === '-' &&
+                    (prefix_i = method.indexOf( '-', 1 ) + 1) > 0) {
+                prefix = method.substr( 0, prefix_i);
+                method = method.substr( prefix_i );
+            }
+            results.push({
+                prefix: prefix,
+                method: method.toLowerCase(),
+                value: block,
+                args: args
+            });
+        }
+        args = []; //for some odd reason, setting .length = 0 didn't work in safari
+        method =
+            prefix =
+            definition =
+            block = '';
+    };
+
+    appendResult();
+    for(var i = 0, ii = value.length; i<ii; i++) {
+        c = value[i];
+        if(mode === 0 && whitespace.indexOf( c ) > -1){
+            continue;
+        }
+        switch(c) {
+            case '"':
+                if(!quote) {
+                    quote = c;
+                }
+                else if(quote === c) {
+                    quote = null;
+                }
+                break;
+
+            case '(':
+                if(quote) { break; }
+                else if(mode === 0) {
+                    mode = 1;
+                    block += c;
+                    continue;
+                } else {
+                    numParen++;
+                }
+                break;
+
+            case ')':
+                if(quote) { break; }
+                else if(mode === 1) {
+                    if(numParen === 0) {
+                        mode = 0;
+                        block += c;
+                        appendResult();
+                        continue;
+                    } else {
+                        numParen--;
+                    }
+                }
+                break;
+
+            case ',':
+                if(quote) { break; }
+                else if(mode === 0) {
+                    appendResult();
+                    continue;
+                }
+                else if (mode === 1) {
+                    if(numParen === 0 && !method.match(/^url$/i)) {
+                        args.push(definition);
+                        definition = '';
+                        block += c;
+                        continue;
+                    }
+                }
+                break;
+        }
+
+        block += c;
+        if(mode === 0) { method += c; }
+        else { definition += c; }
+    }
+    appendResult();
+
+    return results;
+};
+
+_html2canvas.Util.Bounds = function (element) {
+  var clientRect, bounds = {};
+
+  if (element.getBoundingClientRect){
+    clientRect = element.getBoundingClientRect();
+
+    // TODO add scroll position to bounds, so no scrolling of window necessary
+    bounds.top = clientRect.top;
+    bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height);
+    bounds.left = clientRect.left;
+
+    bounds.width = element.offsetWidth;
+    bounds.height = element.offsetHeight;
+  }
+
+  return bounds;
+};
+
+// TODO ideally, we'd want everything to go through this function instead of Util.Bounds,
+// but would require further work to calculate the correct positions for elements with offsetParents
+_html2canvas.Util.OffsetBounds = function (element) {
+  var parent = element.offsetParent ? _html2canvas.Util.OffsetBounds(element.offsetParent) : {top: 0, left: 0};
+
+  return {
+    top: element.offsetTop + parent.top,
+    bottom: element.offsetTop + element.offsetHeight + parent.top,
+    left: element.offsetLeft + parent.left,
+    width: element.offsetWidth,
+    height: element.offsetHeight
+  };
+};
+
+function toPX(element, attribute, value ) {
+    var rsLeft = element.runtimeStyle && element.runtimeStyle[attribute],
+        left,
+        style = element.style;
+
+    // Check if we are not dealing with pixels, (Opera has issues with this)
+    // Ported from jQuery css.js
+    // From the awesome hack by Dean Edwards
+    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+    // If we're not dealing with a regular pixel number
+    // but a number that has a weird ending, we need to convert it to pixels
+
+    if ( !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test( value ) && /^-?\d/.test(value) ) {
+        // Remember the original values
+        left = style.left;
+
+        // Put in the new values to get a computed value out
+        if (rsLeft) {
+            element.runtimeStyle.left = element.currentStyle.left;
+        }
+        style.left = attribute === "fontSize" ? "1em" : (value || 0);
+        value = style.pixelLeft + "px";
+
+        // Revert the changed values
+        style.left = left;
+        if (rsLeft) {
+            element.runtimeStyle.left = rsLeft;
+        }
+    }
+
+    if (!/^(thin|medium|thick)$/i.test(value)) {
+        return Math.round(parseFloat(value)) + "px";
+    }
+
+    return value;
+}
+
+function asInt(val) {
+    return parseInt(val, 10);
+}
+
+function parseBackgroundSizePosition(value, element, attribute, index) {
+    value = (value || '').split(',');
+    value = value[index || 0] || value[0] || 'auto';
+    value = _html2canvas.Util.trimText(value).split(' ');
+
+    if(attribute === 'backgroundSize' && (!value[0] || value[0].match(/cover|contain|auto/))) {
+        //these values will be handled in the parent function
+    } else {
+        value[0] = (value[0].indexOf( "%" ) === -1) ? toPX(element, attribute + "X", value[0]) : value[0];
+        if(value[1] === undefined) {
+            if(attribute === 'backgroundSize') {
+                value[1] = 'auto';
+                return value;
+            } else {
+                // IE 9 doesn't return double digit always
+                value[1] = value[0];
+            }
+        }
+        value[1] = (value[1].indexOf("%") === -1) ? toPX(element, attribute + "Y", value[1]) : value[1];
+    }
+    return value;
+}
+
+_html2canvas.Util.getCSS = function (element, attribute, index) {
+    if (previousElement !== element) {
+      computedCSS = document.defaultView.getComputedStyle(element, null);
+    }
+
+    var value = computedCSS[attribute];
+
+    if (/^background(Size|Position)$/.test(attribute)) {
+        return parseBackgroundSizePosition(value, element, attribute, index);
+    } else if (/border(Top|Bottom)(Left|Right)Radius/.test(attribute)) {
+      var arr = value.split(" ");
+      if (arr.length <= 1) {
+          arr[1] = arr[0];
+      }
+      return arr.map(asInt);
+    }
+
+  return value;
+};
+
+_html2canvas.Util.resizeBounds = function( current_width, current_height, target_width, target_height, stretch_mode ){
+  var target_ratio = target_width / target_height,
+    current_ratio = current_width / current_height,
+    output_width, output_height;
+
+  if(!stretch_mode || stretch_mode === 'auto') {
+    output_width = target_width;
+    output_height = target_height;
+  } else if(target_ratio < current_ratio ^ stretch_mode === 'contain') {
+    output_height = target_height;
+    output_width = target_height * current_ratio;
+  } else {
+    output_width = target_width;
+    output_height = target_width / current_ratio;
+  }
+
+  return {
+    width: output_width,
+    height: output_height
+  };
+};
+
+function backgroundBoundsFactory( prop, el, bounds, image, imageIndex, backgroundSize ) {
+    var bgposition =  _html2canvas.Util.getCSS( el, prop, imageIndex ) ,
+    topPos,
+    left,
+    percentage,
+    val;
+
+    if (bgposition.length === 1){
+      val = bgposition[0];
+
+      bgposition = [];
+
+      bgposition[0] = val;
+      bgposition[1] = val;
+    }
+
+    if (bgposition[0].toString().indexOf("%") !== -1){
+      percentage = (parseFloat(bgposition[0])/100);
+      left = bounds.width * percentage;
+      if(prop !== 'backgroundSize') {
+        left -= (backgroundSize || image).width*percentage;
+      }
+    } else {
+      if(prop === 'backgroundSize') {
+        if(bgposition[0] === 'auto') {
+          left = image.width;
+        } else {
+          if (/contain|cover/.test(bgposition[0])) {
+            var resized = _html2canvas.Util.resizeBounds(image.width, image.height, bounds.width, bounds.height, bgposition[0]);
+            left = resized.width;
+            topPos = resized.height;
+          } else {
+            left = parseInt(bgposition[0], 10);
+          }
+        }
+      } else {
+        left = parseInt( bgposition[0], 10);
+      }
+    }
+
+
+    if(bgposition[1] === 'auto') {
+      topPos = left / image.width * image.height;
+    } else if (bgposition[1].toString().indexOf("%") !== -1){
+      percentage = (parseFloat(bgposition[1])/100);
+      topPos =  bounds.height * percentage;
+      if(prop !== 'backgroundSize') {
+        topPos -= (backgroundSize || image).height * percentage;
+      }
+
+    } else {
+      topPos = parseInt(bgposition[1],10);
+    }
+
+    return [left, topPos];
+}
+
+_html2canvas.Util.BackgroundPosition = function( el, bounds, image, imageIndex, backgroundSize ) {
+    var result = backgroundBoundsFactory( 'backgroundPosition', el, bounds, image, imageIndex, backgroundSize );
+    return { left: result[0], top: result[1] };
+};
+
+_html2canvas.Util.BackgroundSize = function( el, bounds, image, imageIndex ) {
+    var result = backgroundBoundsFactory( 'backgroundSize', el, bounds, image, imageIndex );
+    return { width: result[0], height: result[1] };
+};
+
+_html2canvas.Util.Extend = function (options, defaults) {
+  for (var key in options) {
+    if (options.hasOwnProperty(key)) {
+      defaults[key] = options[key];
+    }
+  }
+  return defaults;
+};
+
+
+/*
+ * Derived from jQuery.contents()
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ */
+_html2canvas.Util.Children = function( elem ) {
+  var children;
+  try {
+    children = (elem.nodeName && elem.nodeName.toUpperCase() === "IFRAME") ? elem.contentDocument || elem.contentWindow.document : (function(array) {
+      var ret = [];
+      if (array !== null) {
+        (function(first, second ) {
+          var i = first.length,
+          j = 0;
+
+          if (typeof second.length === "number") {
+            for (var l = second.length; j < l; j++) {
+              first[i++] = second[j];
+            }
+          } else {
+            while (second[j] !== undefined) {
+              first[i++] = second[j++];
+            }
+          }
+
+          first.length = i;
+
+          return first;
+        })(ret, array);
+      }
+      return ret;
+    })(elem.childNodes);
+
+  } catch (ex) {
+    _html2canvas.Util.log("html2canvas.Util.Children failed with exception: " + ex.message);
+    children = [];
+  }
+  return children;
+};
+
+_html2canvas.Util.isTransparent = function(backgroundColor) {
+  return (backgroundColor === "transparent" || backgroundColor === "rgba(0, 0, 0, 0)");
+};
+_html2canvas.Util.Font = (function () {
+
+  var fontData = {};
+
+  return function(font, fontSize, doc) {
+    if (fontData[font + "-" + fontSize] !== undefined) {
+      return fontData[font + "-" + fontSize];
+    }
+
+    var container = doc.createElement('div'),
+    img = doc.createElement('img'),
+    span = doc.createElement('span'),
+    sampleText = 'Hidden Text',
+    baseline,
+    middle,
+    metricsObj;
+
+    container.style.visibility = "hidden";
+    container.style.fontFamily = font;
+    container.style.fontSize = fontSize;
+    container.style.margin = 0;
+    container.style.padding = 0;
+
+    doc.body.appendChild(container);
+
+    // http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever (handtinywhite.gif)
+    img.src = "data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=";
+    img.width = 1;
+    img.height = 1;
+
+    img.style.margin = 0;
+    img.style.padding = 0;
+    img.style.verticalAlign = "baseline";
+
+    span.style.fontFamily = font;
+    span.style.fontSize = fontSize;
+    span.style.margin = 0;
+    span.style.padding = 0;
+
+    span.appendChild(doc.createTextNode(sampleText));
+    container.appendChild(span);
+    container.appendChild(img);
+    baseline = (img.offsetTop - span.offsetTop) + 1;
+
+    container.removeChild(span);
+    container.appendChild(doc.createTextNode(sampleText));
+
+    container.style.lineHeight = "normal";
+    img.style.verticalAlign = "super";
+
+    middle = (img.offsetTop-container.offsetTop) + 1;
+    metricsObj = {
+      baseline: baseline,
+      lineWidth: 1,
+      middle: middle
+    };
+
+    fontData[font + "-" + fontSize] = metricsObj;
+
+    doc.body.removeChild(container);
+
+    return metricsObj;
+  };
+})();
+
+(function(){
+  var Util = _html2canvas.Util,
+    Generate = {};
+
+  _html2canvas.Generate = Generate;
+
+  var reGradients = [
+  /^(-webkit-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/,
+  /^(-o-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/,
+  /^(-webkit-gradient)\((linear|radial),\s((?:\d{1,3}%?)\s(?:\d{1,3}%?),\s(?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)\-]+)\)$/,
+  /^(-moz-linear-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)]+)\)$/,
+  /^(-webkit-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/,
+  /^(-moz-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s?([a-z\-]*)([\w\d\.\s,%\(\)]+)\)$/,
+  /^(-o-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/
+  ];
+
+  /*
+ * TODO: Add IE10 vendor prefix (-ms) support
+ * TODO: Add W3C gradient (linear-gradient) support
+ * TODO: Add old Webkit -webkit-gradient(radial, ...) support
+ * TODO: Maybe some RegExp optimizations are possible ;o)
+ */
+  Generate.parseGradient = function(css, bounds) {
+    var gradient, i, len = reGradients.length, m1, stop, m2, m2Len, step, m3, tl,tr,br,bl;
+
+    for(i = 0; i < len; i+=1){
+      m1 = css.match(reGradients[i]);
+      if(m1) {
+        break;
+      }
+    }
+
+    if(m1) {
+      switch(m1[1]) {
+        case '-webkit-linear-gradient':
+        case '-o-linear-gradient':
+
+          gradient = {
+            type: 'linear',
+            x0: null,
+            y0: null,
+            x1: null,
+            y1: null,
+            colorStops: []
+          };
+
+          // get coordinates
+          m2 = m1[2].match(/\w+/g);
+          if(m2){
+            m2Len = m2.length;
+            for(i = 0; i < m2Len; i+=1){
+              switch(m2[i]) {
+                case 'top':
+                  gradient.y0 = 0;
+                  gradient.y1 = bounds.height;
+                  break;
+
+                case 'right':
+                  gradient.x0 = bounds.width;
+                  gradient.x1 = 0;
+                  break;
+
+                case 'bottom':
+                  gradient.y0 = bounds.height;
+                  gradient.y1 = 0;
+                  break;
+
+                case 'left':
+                  gradient.x0 = 0;
+                  gradient.x1 = bounds.width;
+                  break;
+              }
+            }
+          }
+          if(gradient.x0 === null && gradient.x1 === null){ // center
+            gradient.x0 = gradient.x1 = bounds.width / 2;
+          }
+          if(gradient.y0 === null && gradient.y1 === null){ // center
+            gradient.y0 = gradient.y1 = bounds.height / 2;
+          }
+
+          // get colors and stops
+          m2 = m1[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g);
+          if(m2){
+            m2Len = m2.length;
+            step = 1 / Math.max(m2Len - 1, 1);
+            for(i = 0; i < m2Len; i+=1){
+              m3 = m2[i].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/);
+              if(m3[2]){
+                stop = parseFloat(m3[2]);
+                if(m3[3] === '%'){
+                  stop /= 100;
+                } else { // px - stupid opera
+                  stop /= bounds.width;
+                }
+              } else {
+                stop = i * step;
+              }
+              gradient.colorStops.push({
+                color: m3[1],
+                stop: stop
+              });
+            }
+          }
+          break;
+
+        case '-webkit-gradient':
+
+          gradient = {
+            type: m1[2] === 'radial' ? 'circle' : m1[2], // TODO: Add radial gradient support for older mozilla definitions
+            x0: 0,
+            y0: 0,
+            x1: 0,
+            y1: 0,
+            colorStops: []
+          };
+
+          // get coordinates
+          m2 = m1[3].match(/(\d{1,3})%?\s(\d{1,3})%?,\s(\d{1,3})%?\s(\d{1,3})%?/);
+          if(m2){
+            gradient.x0 = (m2[1] * bounds.width) / 100;
+            gradient.y0 = (m2[2] * bounds.height) / 100;
+            gradient.x1 = (m2[3] * bounds.width) / 100;
+            gradient.y1 = (m2[4] * bounds.height) / 100;
+          }
+
+          // get colors and stops
+          m2 = m1[4].match(/((?:from|to|color-stop)\((?:[0-9\.]+,\s)?(?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)\))+/g);
+          if(m2){
+            m2Len = m2.length;
+            for(i = 0; i < m2Len; i+=1){
+              m3 = m2[i].match(/(from|to|color-stop)\(([0-9\.]+)?(?:,\s)?((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\)/);
+              stop = parseFloat(m3[2]);
+              if(m3[1] === 'from') {
+                stop = 0.0;
+              }
+              if(m3[1] === 'to') {
+                stop = 1.0;
+              }
+              gradient.colorStops.push({
+                color: m3[3],
+                stop: stop
+              });
+            }
+          }
+          break;
+
+        case '-moz-linear-gradient':
+
+          gradient = {
+            type: 'linear',
+            x0: 0,
+            y0: 0,
+            x1: 0,
+            y1: 0,
+            colorStops: []
+          };
+
+          // get coordinates
+          m2 = m1[2].match(/(\d{1,3})%?\s(\d{1,3})%?/);
+
+          // m2[1] == 0%   -> left
+          // m2[1] == 50%  -> center
+          // m2[1] == 100% -> right
+
+          // m2[2] == 0%   -> top
+          // m2[2] == 50%  -> center
+          // m2[2] == 100% -> bottom
+
+          if(m2){
+            gradient.x0 = (m2[1] * bounds.width) / 100;
+            gradient.y0 = (m2[2] * bounds.height) / 100;
+            gradient.x1 = bounds.width - gradient.x0;
+            gradient.y1 = bounds.height - gradient.y0;
+          }
+
+          // get colors and stops
+          m2 = m1[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}%)?)+/g);
+          if(m2){
+            m2Len = m2.length;
+            step = 1 / Math.max(m2Len - 1, 1);
+            for(i = 0; i < m2Len; i+=1){
+              m3 = m2[i].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%)?/);
+              if(m3[2]){
+                stop = parseFloat(m3[2]);
+                if(m3[3]){ // percentage
+                  stop /= 100;
+                }
+              } else {
+                stop = i * step;
+              }
+              gradient.colorStops.push({
+                color: m3[1],
+                stop: stop
+              });
+            }
+          }
+          break;
+
+        case '-webkit-radial-gradient':
+        case '-moz-radial-gradient':
+        case '-o-radial-gradient':
+
+          gradient = {
+            type: 'circle',
+            x0: 0,
+            y0: 0,
+            x1: bounds.width,
+            y1: bounds.height,
+            cx: 0,
+            cy: 0,
+            rx: 0,
+            ry: 0,
+            colorStops: []
+          };
+
+          // center
+          m2 = m1[2].match(/(\d{1,3})%?\s(\d{1,3})%?/);
+          if(m2){
+            gradient.cx = (m2[1] * bounds.width) / 100;
+            gradient.cy = (m2[2] * bounds.height) / 100;
+          }
+
+          // size
+          m2 = m1[3].match(/\w+/);
+          m3 = m1[4].match(/[a-z\-]*/);
+          if(m2 && m3){
+            switch(m3[0]){
+              case 'farthest-corner':
+              case 'cover': // is equivalent to farthest-corner
+              case '': // mozilla removes "cover" from definition :(
+                tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));
+                tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));
+                br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));
+                bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));
+                gradient.rx = gradient.ry = Math.max(tl, tr, br, bl);
+                break;
+              case 'closest-corner':
+                tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));
+                tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));
+                br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));
+                bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));
+                gradient.rx = gradient.ry = Math.min(tl, tr, br, bl);
+                break;
+              case 'farthest-side':
+                if(m2[0] === 'circle'){
+                  gradient.rx = gradient.ry = Math.max(
+                    gradient.cx,
+                    gradient.cy,
+                    gradient.x1 - gradient.cx,
+                    gradient.y1 - gradient.cy
+                    );
+                } else { // ellipse
+
+                  gradient.type = m2[0];
+
+                  gradient.rx = Math.max(
+                    gradient.cx,
+                    gradient.x1 - gradient.cx
+                    );
+                  gradient.ry = Math.max(
+                    gradient.cy,
+                    gradient.y1 - gradient.cy
+                    );
+                }
+                break;
+              case 'closest-side':
+              case 'contain': // is equivalent to closest-side
+                if(m2[0] === 'circle'){
+                  gradient.rx = gradient.ry = Math.min(
+                    gradient.cx,
+                    gradient.cy,
+                    gradient.x1 - gradient.cx,
+                    gradient.y1 - gradient.cy
+                    );
+                } else { // ellipse
+
+                  gradient.type = m2[0];
+
+                  gradient.rx = Math.min(
+                    gradient.cx,
+                    gradient.x1 - gradient.cx
+                    );
+                  gradient.ry = Math.min(
+                    gradient.cy,
+                    gradient.y1 - gradient.cy
+                    );
+                }
+                break;
+
+            // TODO: add support for "30px 40px" sizes (webkit only)
+            }
+          }
+
+          // color stops
+          m2 = m1[5].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g);
+          if(m2){
+            m2Len = m2.length;
+            step = 1 / Math.max(m2Len - 1, 1);
+            for(i = 0; i < m2Len; i+=1){
+              m3 = m2[i].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/);
+              if(m3[2]){
+                stop = parseFloat(m3[2]);
+                if(m3[3] === '%'){
+                  stop /= 100;
+                } else { // px - stupid opera
+                  stop /= bounds.width;
+                }
+              } else {
+                stop = i * step;
+              }
+              gradient.colorStops.push({
+                color: m3[1],
+                stop: stop
+              });
+            }
+          }
+          break;
+      }
+    }
+
+    return gradient;
+  };
+
+  function addScrollStops(grad) {
+    return function(colorStop) {
+      try {
+        grad.addColorStop(colorStop.stop, colorStop.color);
+      }
+      catch(e) {
+        Util.log(['failed to add color stop: ', e, '; tried to add: ', colorStop]);
+      }
+    };
+  }
+
+  Generate.Gradient = function(src, bounds) {
+    if(bounds.width === 0 || bounds.height === 0) {
+      return;
+    }
+
+    var canvas = document.createElement('canvas'),
+    ctx = canvas.getContext('2d'),
+    gradient, grad;
+
+    canvas.width = bounds.width;
+    canvas.height = bounds.height;
+
+    // TODO: add support for multi defined background gradients
+    gradient = _html2canvas.Generate.parseGradient(src, bounds);
+
+    if(gradient) {
+      switch(gradient.type) {
+        case 'linear':
+          grad = ctx.createLinearGradient(gradient.x0, gradient.y0, gradient.x1, gradient.y1);
+          gradient.colorStops.forEach(addScrollStops(grad));
+          ctx.fillStyle = grad;
+          ctx.fillRect(0, 0, bounds.width, bounds.height);
+          break;
+
+        case 'circle':
+          grad = ctx.createRadialGradient(gradient.cx, gradient.cy, 0, gradient.cx, gradient.cy, gradient.rx);
+          gradient.colorStops.forEach(addScrollStops(grad));
+          ctx.fillStyle = grad;
+          ctx.fillRect(0, 0, bounds.width, bounds.height);
+          break;
+
+        case 'ellipse':
+          var canvasRadial = document.createElement('canvas'),
+            ctxRadial = canvasRadial.getContext('2d'),
+            ri = Math.max(gradient.rx, gradient.ry),
+            di = ri * 2;
+
+          canvasRadial.width = canvasRadial.height = di;
+
+          grad = ctxRadial.createRadialGradient(gradient.rx, gradient.ry, 0, gradient.rx, gradient.ry, ri);
+          gradient.colorStops.forEach(addScrollStops(grad));
+
+          ctxRadial.fillStyle = grad;
+          ctxRadial.fillRect(0, 0, di, di);
+
+          ctx.fillStyle = gradient.colorStops[gradient.colorStops.length - 1].color;
+          ctx.fillRect(0, 0, canvas.width, canvas.height);
+          ctx.drawImage(canvasRadial, gradient.cx - gradient.rx, gradient.cy - gradient.ry, 2 * gradient.rx, 2 * gradient.ry);
+          break;
+      }
+    }
+
+    return canvas;
+  };
+
+  Generate.ListAlpha = function(number) {
+    var tmp = "",
+    modulus;
+
+    do {
+      modulus = number % 26;
+      tmp = String.fromCharCode((modulus) + 64) + tmp;
+      number = number / 26;
+    }while((number*26) > 26);
+
+    return tmp;
+  };
+
+  Generate.ListRoman = function(number) {
+    var romanArray = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"],
+    decimal = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
+    roman = "",
+    v,
+    len = romanArray.length;
+
+    if (number <= 0 || number >= 4000) {
+      return number;
+    }
+
+    for (v=0; v < len; v+=1) {
+      while (number >= decimal[v]) {
+        number -= decimal[v];
+        roman += romanArray[v];
+      }
+    }
+
+    return roman;
+  };
+})();
+function h2cRenderContext(width, height) {
+  var storage = [];
+  return {
+    storage: storage,
+    width: width,
+    height: height,
+    clip: function() {
+      storage.push({
+        type: "function",
+        name: "clip",
+        'arguments': arguments
+      });
+    },
+    translate: function() {
+      storage.push({
+        type: "function",
+        name: "translate",
+        'arguments': arguments
+      });
+    },
+    fill: function() {
+      storage.push({
+        type: "function",
+        name: "fill",
+        'arguments': arguments
+      });
+    },
+    save: function() {
+      storage.push({
+        type: "function",
+        name: "save",
+        'arguments': arguments
+      });
+    },
+    restore: function() {
+      storage.push({
+        type: "function",
+        name: "restore",
+        'arguments': arguments
+      });
+    },
+    fillRect: function () {
+      storage.push({
+        type: "function",
+        name: "fillRect",
+        'arguments': arguments
+      });
+    },
+    createPattern: function() {
+      storage.push({
+        type: "function",
+        name: "createPattern",
+        'arguments': arguments
+      });
+    },
+    drawShape: function() {
+
+      var shape = [];
+
+      storage.push({
+        type: "function",
+        name: "drawShape",
+        'arguments': shape
+      });
+
+      return {
+        moveTo: function() {
+          shape.push({
+            name: "moveTo",
+            'arguments': arguments
+          });
+        },
+        lineTo: function() {
+          shape.push({
+            name: "lineTo",
+            'arguments': arguments
+          });
+        },
+        arcTo: function() {
+          shape.push({
+            name: "arcTo",
+            'arguments': arguments
+          });
+        },
+        bezierCurveTo: function() {
+          shape.push({
+            name: "bezierCurveTo",
+            'arguments': arguments
+          });
+        },
+        quadraticCurveTo: function() {
+          shape.push({
+            name: "quadraticCurveTo",
+            'arguments': arguments
+          });
+        }
+      };
+
+    },
+    drawImage: function () {
+      storage.push({
+        type: "function",
+        name: "drawImage",
+        'arguments': arguments
+      });
+    },
+    fillText: function () {
+      storage.push({
+        type: "function",
+        name: "fillText",
+        'arguments': arguments
+      });
+    },
+    setVariable: function (variable, value) {
+      storage.push({
+        type: "variable",
+        name: variable,
+        'arguments': value
+      });
+      return value;
+    }
+  };
+}
+_html2canvas.Parse = function (images, options) {
+  window.scroll(0,0);
+
+  var element = (( options.elements === undefined ) ? document.body : options.elements[0]), // select body by default
+  numDraws = 0,
+  doc = element.ownerDocument,
+  Util = _html2canvas.Util,
+  support = Util.Support(options, doc),
+  ignoreElementsRegExp = new RegExp("(" + options.ignoreElements + ")"),
+  body = doc.body,
+  getCSS = Util.getCSS,
+  pseudoHide = "___html2canvas___pseudoelement",
+  hidePseudoElements = doc.createElement('style');
+
+  hidePseudoElements.innerHTML = '.' + pseudoHide + '-before:before { content: "" !important; display: none !important; }' +
+  '.' + pseudoHide + '-after:after { content: "" !important; display: none !important; }';
+
+  body.appendChild(hidePseudoElements);
+
+  images = images || {};
+
+  function documentWidth () {
+    return Math.max(
+      Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),
+      Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),
+      Math.max(doc.body.clientWidth, doc.documentElement.clientWidth)
+      );
+  }
+
+  function documentHeight () {
+    return Math.max(
+      Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),
+      Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),
+      Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
+      );
+  }
+
+  function getCSSInt(element, attribute) {
+    var val = parseInt(getCSS(element, attribute), 10);
+    return (isNaN(val)) ? 0 : val; // borders in old IE are throwing 'medium' for demo.html
+  }
+
+  function renderRect (ctx, x, y, w, h, bgcolor) {
+    if (bgcolor !== "transparent"){
+      ctx.setVariable("fillStyle", bgcolor);
+      ctx.fillRect(x, y, w, h);
+      numDraws+=1;
+    }
+  }
+
+  function capitalize(m, p1, p2) {
+    if (m.length > 0) {
+      return p1 + p2.toUpperCase();
+    }
+  }
+
+  function textTransform (text, transform) {
+    switch(transform){
+      case "lowercase":
+        return text.toLowerCase();
+      case "capitalize":
+        return text.replace( /(^|\s|:|-|\(|\))([a-z])/g, capitalize);
+      case "uppercase":
+        return text.toUpperCase();
+      default:
+        return text;
+    }
+  }
+
+  function noLetterSpacing(letter_spacing) {
+    return (/^(normal|none|0px)$/.test(letter_spacing));
+  }
+
+  function drawText(currentText, x, y, ctx){
+    if (currentText !== null && Util.trimText(currentText).length > 0) {
+      ctx.fillText(currentText, x, y);
+      numDraws+=1;
+    }
+  }
+
+  function setTextVariables(ctx, el, text_decoration, color) {
+    var align = false,
+    bold = getCSS(el, "fontWeight"),
+    family = getCSS(el, "fontFamily"),
+    size = getCSS(el, "fontSize"),
+    shadows = Util.parseTextShadows(getCSS(el, "textShadow"));
+
+    switch(parseInt(bold, 10)){
+      case 401:
+        bold = "bold";
+        break;
+      case 400:
+        bold = "normal";
+        break;
+    }
+
+    ctx.setVariable("fillStyle", color);
+    ctx.setVariable("font", [getCSS(el, "fontStyle"), getCSS(el, "fontVariant"), bold, size, family].join(" "));
+    ctx.setVariable("textAlign", (align) ? "right" : "left");
+
+    if (shadows.length) {
+      // TODO: support multiple text shadows
+      // apply the first text shadow
+      ctx.setVariable("shadowColor", shadows[0].color);
+      ctx.setVariable("shadowOffsetX", shadows[0].offsetX);
+      ctx.setVariable("shadowOffsetY", shadows[0].offsetY);
+      ctx.setVariable("shadowBlur", shadows[0].blur);
+    }
+
+    if (text_decoration !== "none"){
+      return Util.Font(family, size, doc);
+    }
+  }
+
+  function renderTextDecoration(ctx, text_decoration, bounds, metrics, color) {
+    switch(text_decoration) {
+      case "underline":
+        // Draws a line at the baseline of the font
+        // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size
+        renderRect(ctx, bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, color);
+        break;
+      case "overline":
+        renderRect(ctx, bounds.left, Math.round(bounds.top), bounds.width, 1, color);
+        break;
+      case "line-through":
+        // TODO try and find exact position for line-through
+        renderRect(ctx, bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, color);
+        break;
+    }
+  }
+
+  function getTextBounds(state, text, textDecoration, isLast, transform) {
+    var bounds;
+    if (support.rangeBounds && !transform) {
+      if (textDecoration !== "none" || Util.trimText(text).length !== 0) {
+        bounds = textRangeBounds(text, state.node, state.textOffset);
+      }
+      state.textOffset += text.length;
+    } else if (state.node && typeof state.node.nodeValue === "string" ){
+      var newTextNode = (isLast) ? state.node.splitText(text.length) : null;
+      bounds = textWrapperBounds(state.node, transform);
+      state.node = newTextNode;
+    }
+    return bounds;
+  }
+
+  function textRangeBounds(text, textNode, textOffset) {
+    var range = doc.createRange();
+    range.setStart(textNode, textOffset);
+    range.setEnd(textNode, textOffset + text.length);
+    return range.getBoundingClientRect();
+  }
+
+  function textWrapperBounds(oldTextNode, transform) {
+    var parent = oldTextNode.parentNode,
+    wrapElement = doc.createElement('wrapper'),
+    backupText = oldTextNode.cloneNode(true);
+
+    wrapElement.appendChild(oldTextNode.cloneNode(true));
+    parent.replaceChild(wrapElement, oldTextNode);
+
+    var bounds = transform ? Util.OffsetBounds(wrapElement) : Util.Bounds(wrapElement);
+    parent.replaceChild(backupText, wrapElement);
+    return bounds;
+  }
+
+  function renderText(el, textNode, stack) {
+    var ctx = stack.ctx,
+    color = getCSS(el, "color"),
+    textDecoration = getCSS(el, "textDecoration"),
+    textAlign = getCSS(el, "textAlign"),
+    metrics,
+    textList,
+    state = {
+      node: textNode,
+      textOffset: 0
+    };
+
+    if (Util.trimText(textNode.nodeValue).length > 0) {
+      textNode.nodeValue = textTransform(textNode.nodeValue, getCSS(el, "textTransform"));
+      textAlign = textAlign.replace(["-webkit-auto"],["auto"]);
+
+      textList = (!options.letterRendering && /^(left|right|justify|auto)$/.test(textAlign) && noLetterSpacing(getCSS(el, "letterSpacing"))) ?
+      textNode.nodeValue.split(/(\b| )/)
+      : textNode.nodeValue.split("");
+
+      metrics = setTextVariables(ctx, el, textDecoration, color);
+
+      if (options.chinese) {
+        textList.forEach(function(word, index) {
+          if (/.*[\u4E00-\u9FA5].*$/.test(word)) {
+            word = word.split("");
+            word.unshift(index, 1);
+            textList.splice.apply(textList, word);
+          }
+        });
+      }
+
+      textList.forEach(function(text, index) {
+        var bounds = getTextBounds(state, text, textDecoration, (index < textList.length - 1), stack.transform.matrix);
+        if (bounds) {
+          drawText(text, bounds.left, bounds.bottom, ctx);
+          renderTextDecoration(ctx, textDecoration, bounds, metrics, color);
+        }
+      });
+    }
+  }
+
+  function listPosition (element, val) {
+    var boundElement = doc.createElement( "boundelement" ),
+    originalType,
+    bounds;
+
+    boundElement.style.display = "inline";
+
+    originalType = element.style.listStyleType;
+    element.style.listStyleType = "none";
+
+    boundElement.appendChild(doc.createTextNode(val));
+
+    element.insertBefore(boundElement, element.firstChild);
+
+    bounds = Util.Bounds(boundElement);
+    element.removeChild(boundElement);
+    element.style.listStyleType = originalType;
+    return bounds;
+  }
+
+  function elementIndex(el) {
+    var i = -1,
+    count = 1,
+    childs = el.parentNode.childNodes;
+
+    if (el.parentNode) {
+      while(childs[++i] !== el) {
+        if (childs[i].nodeType === 1) {
+          count++;
+        }
+      }
+      return count;
+    } else {
+      return -1;
+    }
+  }
+
+  function listItemText(element, type) {
+    var currentIndex = elementIndex(element), text;
+    switch(type){
+      case "decimal":
+        text = currentIndex;
+        break;
+      case "decimal-leading-zero":
+        text = (currentIndex.toString().length === 1) ? currentIndex = "0" + currentIndex.toString() : currentIndex.toString();
+        break;
+      case "upper-roman":
+        text = _html2canvas.Generate.ListRoman( currentIndex );
+        break;
+      case "lower-roman":
+        text = _html2canvas.Generate.ListRoman( currentIndex ).toLowerCase();
+        break;
+      case "lower-alpha":
+        text = _html2canvas.Generate.ListAlpha( currentIndex ).toLowerCase();
+        break;
+      case "upper-alpha":
+        text = _html2canvas.Generate.ListAlpha( currentIndex );
+        break;
+    }
+
+    return text + ". ";
+  }
+
+  function renderListItem(element, stack, elBounds) {
+    var x,
+    text,
+    ctx = stack.ctx,
+    type = getCSS(element, "listStyleType"),
+    listBounds;
+
+    if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {
+      text = listItemText(element, type);
+      listBounds = listPosition(element, text);
+      setTextVariables(ctx, element, "none", getCSS(element, "color"));
+
+      if (getCSS(element, "listStylePosition") === "inside") {
+        ctx.setVariable("textAlign", "left");
+        x = elBounds.left;
+      } else {
+        return;
+      }
+
+      drawText(text, x, listBounds.bottom, ctx);
+    }
+  }
+
+  function loadImage (src){
+    var img = images[src];
+    return (img && img.succeeded === true) ? img.img : false;
+  }
+
+  function clipBounds(src, dst){
+    var x = Math.max(src.left, dst.left),
+    y = Math.max(src.top, dst.top),
+    x2 = Math.min((src.left + src.width), (dst.left + dst.width)),
+    y2 = Math.min((src.top + src.height), (dst.top + dst.height));
+
+    return {
+      left:x,
+      top:y,
+      width:x2-x,
+      height:y2-y
+    };
+  }
+
+  function setZ(element, stack, parentStack){
+    var newContext,
+    isPositioned = stack.cssPosition !== 'static',
+    zIndex = isPositioned ? getCSS(element, 'zIndex') : 'auto',
+    opacity = getCSS(element, 'opacity'),
+    isFloated = getCSS(element, 'cssFloat') !== 'none';
+
+    // https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context
+    // When a new stacking context should be created:
+    // the root element (HTML),
+    // positioned (absolutely or relatively) with a z-index value other than "auto",
+    // elements with an opacity value less than 1. (See the specification for opacity),
+    // on mobile WebKit and Chrome 22+, position: fixed always creates a new stacking context, even when z-index is "auto" (See this post)
+
+    stack.zIndex = newContext = h2czContext(zIndex);
+    newContext.isPositioned = isPositioned;
+    newContext.isFloated = isFloated;
+    newContext.opacity = opacity;
+    newContext.ownStacking = (zIndex !== 'auto' || opacity < 1);
+
+    if (parentStack) {
+      parentStack.zIndex.children.push(stack);
+    }
+  }
+
+  function renderImage(ctx, element, image, bounds, borders) {
+
+    var paddingLeft = getCSSInt(element, 'paddingLeft'),
+    paddingTop = getCSSInt(element, 'paddingTop'),
+    paddingRight = getCSSInt(element, 'paddingRight'),
+    paddingBottom = getCSSInt(element, 'paddingBottom');
+
+    drawImage(
+      ctx,
+      image,
+      0, //sx
+      0, //sy
+      image.width, //sw
+      image.height, //sh
+      bounds.left + paddingLeft + borders[3].width, //dx
+      bounds.top + paddingTop + borders[0].width, // dy
+      bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight), //dw
+      bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom) //dh
+      );
+  }
+
+  function getBorderData(element) {
+    return ["Top", "Right", "Bottom", "Left"].map(function(side) {
+      return {
+        width: getCSSInt(element, 'border' + side + 'Width'),
+        color: getCSS(element, 'border' + side + 'Color')
+      };
+    });
+  }
+
+  function getBorderRadiusData(element) {
+    return ["TopLeft", "TopRight", "BottomRight", "BottomLeft"].map(function(side) {
+      return getCSS(element, 'border' + side + 'Radius');
+    });
+  }
+
+  var getCurvePoints = (function(kappa) {
+
+    return function(x, y, r1, r2) {
+      var ox = (r1) * kappa, // control point offset horizontal
+      oy = (r2) * kappa, // control point offset vertical
+      xm = x + r1, // x-middle
+      ym = y + r2; // y-middle
+      return {
+        topLeft: bezierCurve({
+          x:x,
+          y:ym
+        }, {
+          x:x,
+          y:ym - oy
+        }, {
+          x:xm - ox,
+          y:y
+        }, {
+          x:xm,
+          y:y
+        }),
+        topRight: bezierCurve({
+          x:x,
+          y:y
+        }, {
+          x:x + ox,
+          y:y
+        }, {
+          x:xm,
+          y:ym - oy
+        }, {
+          x:xm,
+          y:ym
+        }),
+        bottomRight: bezierCurve({
+          x:xm,
+          y:y
+        }, {
+          x:xm,
+          y:y + oy
+        }, {
+          x:x + ox,
+          y:ym
+        }, {
+          x:x,
+          y:ym
+        }),
+        bottomLeft: bezierCurve({
+          x:xm,
+          y:ym
+        }, {
+          x:xm - ox,
+          y:ym
+        }, {
+          x:x,
+          y:y + oy
+        }, {
+          x:x,
+          y:y
+        })
+      };
+    };
+  })(4 * ((Math.sqrt(2) - 1) / 3));
+
+  function bezierCurve(start, startControl, endControl, end) {
+
+    var lerp = function (a, b, t) {
+      return {
+        x:a.x + (b.x - a.x) * t,
+        y:a.y + (b.y - a.y) * t
+      };
+    };
+
+    return {
+      start: start,
+      startControl: startControl,
+      endControl: endControl,
+      end: end,
+      subdivide: function(t) {
+        var ab = lerp(start, startControl, t),
+        bc = lerp(startControl, endControl, t),
+        cd = lerp(endControl, end, t),
+        abbc = lerp(ab, bc, t),
+        bccd = lerp(bc, cd, t),
+        dest = lerp(abbc, bccd, t);
+        return [bezierCurve(start, ab, abbc, dest), bezierCurve(dest, bccd, cd, end)];
+      },
+      curveTo: function(borderArgs) {
+        borderArgs.push(["bezierCurve", startControl.x, startControl.y, endControl.x, endControl.y, end.x, end.y]);
+      },
+      curveToReversed: function(borderArgs) {
+        borderArgs.push(["bezierCurve", endControl.x, endControl.y, startControl.x, startControl.y, start.x, start.y]);
+      }
+    };
+  }
+
+  function parseCorner(borderArgs, radius1, radius2, corner1, corner2, x, y) {
+    if (radius1[0] > 0 || radius1[1] > 0) {
+      borderArgs.push(["line", corner1[0].start.x, corner1[0].start.y]);
+      corner1[0].curveTo(borderArgs);
+      corner1[1].curveTo(borderArgs);
+    } else {
+      borderArgs.push(["line", x, y]);
+    }
+
+    if (radius2[0] > 0 || radius2[1] > 0) {
+      borderArgs.push(["line", corner2[0].start.x, corner2[0].start.y]);
+    }
+  }
+
+  function drawSide(borderData, radius1, radius2, outer1, inner1, outer2, inner2) {
+    var borderArgs = [];
+
+    if (radius1[0] > 0 || radius1[1] > 0) {
+      borderArgs.push(["line", outer1[1].start.x, outer1[1].start.y]);
+      outer1[1].curveTo(borderArgs);
+    } else {
+      borderArgs.push([ "line", borderData.c1[0], borderData.c1[1]]);
+    }
+
+    if (radius2[0] > 0 || radius2[1] > 0) {
+      borderArgs.push(["line", outer2[0].start.x, outer2[0].start.y]);
+      outer2[0].curveTo(borderArgs);
+      borderArgs.push(["line", inner2[0].end.x, inner2[0].end.y]);
+      inner2[0].curveToReversed(borderArgs);
+    } else {
+      borderArgs.push([ "line", borderData.c2[0], borderData.c2[1]]);
+      borderArgs.push([ "line", borderData.c3[0], borderData.c3[1]]);
+    }
+
+    if (radius1[0] > 0 || radius1[1] > 0) {
+      borderArgs.push(["line", inner1[1].end.x, inner1[1].end.y]);
+      inner1[1].curveToReversed(borderArgs);
+    } else {
+      borderArgs.push([ "line", borderData.c4[0], borderData.c4[1]]);
+    }
+
+    return borderArgs;
+  }
+
+  function calculateCurvePoints(bounds, borderRadius, borders) {
+
+    var x = bounds.left,
+    y = bounds.top,
+    width = bounds.width,
+    height = bounds.height,
+
+    tlh = borderRadius[0][0],
+    tlv = borderRadius[0][1],
+    trh = borderRadius[1][0],
+    trv = borderRadius[1][1],
+    brh = borderRadius[2][0],
+    brv = borderRadius[2][1],
+    blh = borderRadius[3][0],
+    blv = borderRadius[3][1],
+
+    topWidth = width - trh,
+    rightHeight = height - brv,
+    bottomWidth = width - brh,
+    leftHeight = height - blv;
+
+    return {
+      topLeftOuter: getCurvePoints(
+        x,
+        y,
+        tlh,
+        tlv
+        ).topLeft.subdivide(0.5),
+
+      topLeftInner: getCurvePoints(
+        x + borders[3].width,
+        y + borders[0].width,
+        Math.max(0, tlh - borders[3].width),
+        Math.max(0, tlv - borders[0].width)
+        ).topLeft.subdivide(0.5),
+
+      topRightOuter: getCurvePoints(
+        x + topWidth,
+        y,
+        trh,
+        trv
+        ).topRight.subdivide(0.5),
+
+      topRightInner: getCurvePoints(
+        x + Math.min(topWidth, width + borders[3].width),
+        y + borders[0].width,
+        (topWidth > width + borders[3].width) ? 0 :trh - borders[3].width,
+        trv - borders[0].width
+        ).topRight.subdivide(0.5),
+
+      bottomRightOuter: getCurvePoints(
+        x + bottomWidth,
+        y + rightHeight,
+        brh,
+        brv
+        ).bottomRight.subdivide(0.5),
+
+      bottomRightInner: getCurvePoints(
+        x + Math.min(bottomWidth, width + borders[3].width),
+        y + Math.min(rightHeight, height + borders[0].width),
+        Math.max(0, brh - borders[1].width),
+        Math.max(0, brv - borders[2].width)
+        ).bottomRight.subdivide(0.5),
+
+      bottomLeftOuter: getCurvePoints(
+        x,
+        y + leftHeight,
+        blh,
+        blv
+        ).bottomLeft.subdivide(0.5),
+
+      bottomLeftInner: getCurvePoints(
+        x + borders[3].width,
+        y + leftHeight,
+        Math.max(0, blh - borders[3].width),
+        Math.max(0, blv - borders[2].width)
+        ).bottomLeft.subdivide(0.5)
+    };
+  }
+
+  function getBorderClip(element, borderPoints, borders, radius, bounds) {
+    var backgroundClip = getCSS(element, 'backgroundClip'),
+    borderArgs = [];
+
+    switch(backgroundClip) {
+      case "content-box":
+      case "padding-box":
+        parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftInner, borderPoints.topRightInner, bounds.left + borders[3].width, bounds.top + borders[0].width);
+        parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightInner, borderPoints.bottomRightInner, bounds.left + bounds.width - borders[1].width, bounds.top + borders[0].width);
+        parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightInner, borderPoints.bottomLeftInner, bounds.left + bounds.width - borders[1].width, bounds.top + bounds.height - borders[2].width);
+        parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftInner, borderPoints.topLeftInner, bounds.left + borders[3].width, bounds.top + bounds.height - borders[2].width);
+        break;
+
+      default:
+        parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftOuter, borderPoints.topRightOuter, bounds.left, bounds.top);
+        parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightOuter, borderPoints.bottomRightOuter, bounds.left + bounds.width, bounds.top);
+        parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightOuter, borderPoints.bottomLeftOuter, bounds.left + bounds.width, bounds.top + bounds.height);
+        parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftOuter, borderPoints.topLeftOuter, bounds.left, bounds.top + bounds.height);
+        break;
+    }
+
+    return borderArgs;
+  }
+
+  function parseBorders(element, bounds, borders){
+    var x = bounds.left,
+    y = bounds.top,
+    width = bounds.width,
+    height = bounds.height,
+    borderSide,
+    bx,
+    by,
+    bw,
+    bh,
+    borderArgs,
+    // http://www.w3.org/TR/css3-background/#the-border-radius
+    borderRadius = getBorderRadiusData(element),
+    borderPoints = calculateCurvePoints(bounds, borderRadius, borders),
+    borderData = {
+      clip: getBorderClip(element, borderPoints, borders, borderRadius, bounds),
+      borders: []
+    };
+
+    for (borderSide = 0; borderSide < 4; borderSide++) {
+
+      if (borders[borderSide].width > 0) {
+        bx = x;
+        by = y;
+        bw = width;
+        bh = height - (borders[2].width);
+
+        switch(borderSide) {
+          case 0:
+            // top border
+            bh = borders[0].width;
+
+            borderArgs = drawSide({
+              c1: [bx, by],
+              c2: [bx + bw, by],
+              c3: [bx + bw - borders[1].width, by + bh],
+              c4: [bx + borders[3].width, by + bh]
+            }, borderRadius[0], borderRadius[1],
+            borderPoints.topLeftOuter, borderPoints.topLeftInner, borderPoints.topRightOuter, borderPoints.topRightInner);
+            break;
+          case 1:
+            // right border
+            bx = x + width - (borders[1].width);
+            bw = borders[1].width;
+
+            borderArgs = drawSide({
+              c1: [bx + bw, by],
+              c2: [bx + bw, by + bh + borders[2].width],
+              c3: [bx, by + bh],
+              c4: [bx, by + borders[0].width]
+            }, borderRadius[1], borderRadius[2],
+            borderPoints.topRightOuter, borderPoints.topRightInner, borderPoints.bottomRightOuter, borderPoints.bottomRightInner);
+            break;
+          case 2:
+            // bottom border
+            by = (by + height) - (borders[2].width);
+            bh = borders[2].width;
+
+            borderArgs = drawSide({
+              c1: [bx + bw, by + bh],
+              c2: [bx, by + bh],
+              c3: [bx + borders[3].width, by],
+              c4: [bx + bw - borders[3].width, by]
+            }, borderRadius[2], borderRadius[3],
+            borderPoints.bottomRightOuter, borderPoints.bottomRightInner, borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner);
+            break;
+          case 3:
+            // left border
+            bw = borders[3].width;
+
+            borderArgs = drawSide({
+              c1: [bx, by + bh + borders[2].width],
+              c2: [bx, by],
+              c3: [bx + bw, by + borders[0].width],
+              c4: [bx + bw, by + bh]
+            }, borderRadius[3], borderRadius[0],
+            borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner, borderPoints.topLeftOuter, borderPoints.topLeftInner);
+            break;
+        }
+
+        borderData.borders.push({
+          args: borderArgs,
+          color: borders[borderSide].color
+        });
+
+      }
+    }
+
+    return borderData;
+  }
+
+  function createShape(ctx, args) {
+    var shape = ctx.drawShape();
+    args.forEach(function(border, index) {
+      shape[(index === 0) ? "moveTo" : border[0] + "To" ].apply(null, border.slice(1));
+    });
+    return shape;
+  }
+
+  function renderBorders(ctx, borderArgs, color) {
+    if (color !== "transparent") {
+      ctx.setVariable( "fillStyle", color);
+      createShape(ctx, borderArgs);
+      ctx.fill();
+      numDraws+=1;
+    }
+  }
+
+  function renderFormValue (el, bounds, stack){
+
+    var valueWrap = doc.createElement('valuewrap'),
+    cssPropertyArray = ['lineHeight','textAlign','fontFamily','color','fontSize','paddingLeft','paddingTop','width','height','border','borderLeftWidth','borderTopWidth'],
+    textValue,
+    textNode;
+
+    cssPropertyArray.forEach(function(property) {
+      try {
+        valueWrap.style[property] = getCSS(el, property);
+      } catch(e) {
+        // Older IE has issues with "border"
+        Util.log("html2canvas: Parse: Exception caught in renderFormValue: " + e.message);
+      }
+    });
+
+    valueWrap.style.borderColor = "black";
+    valueWrap.style.borderStyle = "solid";
+    valueWrap.style.display = "block";
+    valueWrap.style.position = "absolute";
+
+    if (/^(submit|reset|button|text|password)$/.test(el.type) || el.nodeName === "SELECT"){
+      valueWrap.style.lineHeight = getCSS(el, "height");
+    }
+
+    valueWrap.style.top = bounds.top + "px";
+    valueWrap.style.left = bounds.left + "px";
+
+    textValue = (el.nodeName === "SELECT") ? (el.options[el.selectedIndex] || 0).text : el.value;
+    if(!textValue) {
+      textValue = el.placeholder;
+    }
+
+    textNode = doc.createTextNode(textValue);
+
+    valueWrap.appendChild(textNode);
+    body.appendChild(valueWrap);
+
+    renderText(el, textNode, stack);
+    body.removeChild(valueWrap);
+  }
+
+  function drawImage (ctx) {
+    ctx.drawImage.apply(ctx, Array.prototype.slice.call(arguments, 1));
+    numDraws+=1;
+  }
+
+  function getPseudoElement(el, which) {
+    var elStyle = window.getComputedStyle(el, which);
+    if(!elStyle || !elStyle.content || elStyle.content === "none" || elStyle.content === "-moz-alt-content" || elStyle.display === "none") {
+      return;
+    }
+    var content = elStyle.content + '',
+    first = content.substr( 0, 1 );
+    //strips quotes
+    if(first === content.substr( content.length - 1 ) && first.match(/'|"/)) {
+      content = content.substr( 1, content.length - 2 );
+    }
+
+    var isImage = content.substr( 0, 3 ) === 'url',
+    elps = document.createElement( isImage ? 'img' : 'span' );
+
+    elps.className = pseudoHide + "-before " + pseudoHide + "-after";
+
+    Object.keys(elStyle).filter(indexedProperty).forEach(function(prop) {
+      // Prevent assigning of read only CSS Rules, ex. length, parentRule
+      try {
+        elps.style[prop] = elStyle[prop];
+      } catch (e) {
+        Util.log(['Tried to assign readonly property ', prop, 'Error:', e]);
+      }
+    });
+
+    if(isImage) {
+      elps.src = Util.parseBackgroundImage(content)[0].args[0];
+    } else {
+      elps.innerHTML = content;
+    }
+    return elps;
+  }
+
+  function indexedProperty(property) {
+    return (isNaN(window.parseInt(property, 10)));
+  }
+
+  function injectPseudoElements(el, stack) {
+    var before = getPseudoElement(el, ':before'),
+    after = getPseudoElement(el, ':after');
+    if(!before && !after) {
+      return;
+    }
+
+    if(before) {
+      el.className += " " + pseudoHide + "-before";
+      el.parentNode.insertBefore(before, el);
+      parseElement(before, stack, true);
+      el.parentNode.removeChild(before);
+      el.className = el.className.replace(pseudoHide + "-before", "").trim();
+    }
+
+    if (after) {
+      el.className += " " + pseudoHide + "-after";
+      el.appendChild(after);
+      parseElement(after, stack, true);
+      el.removeChild(after);
+      el.className = el.className.replace(pseudoHide + "-after", "").trim();
+    }
+
+  }
+
+  function renderBackgroundRepeat(ctx, image, backgroundPosition, bounds) {
+    var offsetX = Math.round(bounds.left + backgroundPosition.left),
+    offsetY = Math.round(bounds.top + backgroundPosition.top);
+
+    ctx.createPattern(image);
+    ctx.translate(offsetX, offsetY);
+    ctx.fill();
+    ctx.translate(-offsetX, -offsetY);
+  }
+
+  function backgroundRepeatShape(ctx, image, backgroundPosition, bounds, left, top, width, height) {
+    var args = [];
+    args.push(["line", Math.round(left), Math.round(top)]);
+    args.push(["line", Math.round(left + width), Math.round(top)]);
+    args.push(["line", Math.round(left + width), Math.round(height + top)]);
+    args.push(["line", Math.round(left), Math.round(height + top)]);
+    createShape(ctx, args);
+    ctx.save();
+    ctx.clip();
+    renderBackgroundRepeat(ctx, image, backgroundPosition, bounds);
+    ctx.restore();
+  }
+
+  function renderBackgroundColor(ctx, backgroundBounds, bgcolor) {
+    renderRect(
+      ctx,
+      backgroundBounds.left,
+      backgroundBounds.top,
+      backgroundBounds.width,
+      backgroundBounds.height,
+      bgcolor
+      );
+  }
+
+  function renderBackgroundRepeating(el, bounds, ctx, image, imageIndex) {
+    var backgroundSize = Util.BackgroundSize(el, bounds, image, imageIndex),
+    backgroundPosition = Util.BackgroundPosition(el, bounds, image, imageIndex, backgroundSize),
+    backgroundRepeat = getCSS(el, "backgroundRepeat").split(",").map(Util.trimText);
+
+    image = resizeImage(image, backgroundSize);
+
+    backgroundRepeat = backgroundRepeat[imageIndex] || backgroundRepeat[0];
+
+    switch (backgroundRepeat) {
+      case "repeat-x":
+        backgroundRepeatShape(ctx, image, backgroundPosition, bounds,
+          bounds.left, bounds.top + backgroundPosition.top, 99999, image.height);
+        break;
+
+      case "repeat-y":
+        backgroundRepeatShape(ctx, image, backgroundPosition, bounds,
+          bounds.left + backgroundPosition.left, bounds.top, image.width, 99999);
+        break;
+
+      case "no-repeat":
+        backgroundRepeatShape(ctx, image, backgroundPosition, bounds,
+          bounds.left + backgroundPosition.left, bounds.top + backgroundPosition.top, image.width, image.height);
+        break;
+
+      default:
+        renderBackgroundRepeat(ctx, image, backgroundPosition, {
+          top: bounds.top,
+          left: bounds.left,
+          width: image.width,
+          height: image.height
+        });
+        break;
+    }
+  }
+
+  function renderBackgroundImage(element, bounds, ctx) {
+    var backgroundImage = getCSS(element, "backgroundImage"),
+    backgroundImages = Util.parseBackgroundImage(backgroundImage),
+    image,
+    imageIndex = backgroundImages.length;
+
+    while(imageIndex--) {
+      backgroundImage = backgroundImages[imageIndex];
+
+      if (!backgroundImage.args || backgroundImage.args.length === 0) {
+        continue;
+      }
+
+      var key = backgroundImage.method === 'url' ?
+      backgroundImage.args[0] :
+      backgroundImage.value;
+
+      image = loadImage(key);
+
+      // TODO add support for background-origin
+      if (image) {
+        renderBackgroundRepeating(element, bounds, ctx, image, imageIndex);
+      } else {
+        Util.log("html2canvas: Error loading background:", backgroundImage);
+      }
+    }
+  }
+
+  function resizeImage(image, bounds) {
+    if(image.width === bounds.width && image.height === bounds.height) {
+      return image;
+    }
+
+    var ctx, canvas = doc.createElement('canvas');
+    canvas.width = bounds.width;
+    canvas.height = bounds.height;
+    ctx = canvas.getContext("2d");
+    drawImage(ctx, image, 0, 0, image.width, image.height, 0, 0, bounds.width, bounds.height );
+    return canvas;
+  }
+
+  function setOpacity(ctx, element, parentStack) {
+    return ctx.setVariable("globalAlpha", getCSS(element, "opacity") * ((parentStack) ? parentStack.opacity : 1));
+  }
+
+  function removePx(str) {
+    return str.replace("px", "");
+  }
+
+  var transformRegExp = /(matrix)\((.+)\)/;
+
+  function getTransform(element, parentStack) {
+    var transform = getCSS(element, "transform") || getCSS(element, "-webkit-transform") || getCSS(element, "-moz-transform") || getCSS(element, "-ms-transform") || getCSS(element, "-o-transform");
+    var transformOrigin = getCSS(element, "transform-origin") || getCSS(element, "-webkit-transform-origin") || getCSS(element, "-moz-transform-origin") || getCSS(element, "-ms-transform-origin") || getCSS(element, "-o-transform-origin") || "0px 0px";
+
+    transformOrigin = transformOrigin.split(" ").map(removePx).map(Util.asFloat);
+
+    var matrix;
+    if (transform && transform !== "none") {
+      var match = transform.match(transformRegExp);
+      if (match) {
+        switch(match[1]) {
+          case "matrix":
+            matrix = match[2].split(",").map(Util.trimText).map(Util.asFloat);
+            break;
+        }
+      }
+    }
+
+    return {
+      origin: transformOrigin,
+      matrix: matrix
+    };
+  }
+
+  function createStack(element, parentStack, bounds, transform) {
+    var ctx = h2cRenderContext((!parentStack) ? documentWidth() : bounds.width , (!parentStack) ? documentHeight() : bounds.height),
+    stack = {
+      ctx: ctx,
+      opacity: setOpacity(ctx, element, parentStack),
+      cssPosition: getCSS(element, "position"),
+      borders: getBorderData(element),
+      transform: transform,
+      clip: (parentStack && parentStack.clip) ? Util.Extend( {}, parentStack.clip ) : null
+    };
+
+    setZ(element, stack, parentStack);
+
+    // TODO correct overflow for absolute content residing under a static position
+    if (options.useOverflow === true && /(hidden|scroll|auto)/.test(getCSS(element, "overflow")) === true && /(BODY)/i.test(element.nodeName) === false){
+      stack.clip = (stack.clip) ? clipBounds(stack.clip, bounds) : bounds;
+    }
+
+    return stack;
+  }
+
+  function getBackgroundBounds(borders, bounds, clip) {
+    var backgroundBounds = {
+      left: bounds.left + borders[3].width,
+      top: bounds.top + borders[0].width,
+      width: bounds.width - (borders[1].width + borders[3].width),
+      height: bounds.height - (borders[0].width + borders[2].width)
+    };
+
+    if (clip) {
+      backgroundBounds = clipBounds(backgroundBounds, clip);
+    }
+
+    return backgroundBounds;
+  }
+
+  function getBounds(element, transform) {
+    var bounds = (transform.matrix) ? Util.OffsetBounds(element) : Util.Bounds(element);
+    transform.origin[0] += bounds.left;
+    transform.origin[1] += bounds.top;
+    return bounds;
+  }
+
+  function renderElement(element, parentStack, pseudoElement, ignoreBackground) {
+    var transform = getTransform(element, parentStack),
+    bounds = getBounds(element, transform),
+    image,
+    stack = createStack(element, parentStack, bounds, transform),
+    borders = stack.borders,
+    ctx = stack.ctx,
+    backgroundBounds = getBackgroundBounds(borders, bounds, stack.clip),
+    borderData = parseBorders(element, bounds, borders),
+    backgroundColor = (ignoreElementsRegExp.test(element.nodeName)) ? "#efefef" : getCSS(element, "backgroundColor");
+
+
+    createShape(ctx, borderData.clip);
+
+    ctx.save();
+    ctx.clip();
+
+    if (backgroundBounds.height > 0 && backgroundBounds.width > 0 && !ignoreBackground) {
+      renderBackgroundColor(ctx, bounds, backgroundColor);
+      renderBackgroundImage(element, backgroundBounds, ctx);
+    } else if (ignoreBackground) {
+      stack.backgroundColor =  backgroundColor;
+    }
+
+    ctx.restore();
+
+    borderData.borders.forEach(function(border) {
+      renderBorders(ctx, border.args, border.color);
+    });
+
+    if (!pseudoElement) {
+      injectPseudoElements(element, stack);
+    }
+
+    switch(element.nodeName){
+      case "IMG":
+        if ((image = loadImage(element.getAttribute('src')))) {
+          renderImage(ctx, element, image, bounds, borders);
+        } else {
+          Util.log("html2canvas: Error loading <img>:" + element.getAttribute('src'));
+        }
+        break;
+      case "INPUT":
+        // TODO add all relevant type's, i.e. HTML5 new stuff
+        // todo add support for placeholder attribute for browsers which support it
+        if (/^(text|url|email|submit|button|reset)$/.test(element.type) && (element.value || element.placeholder || "").length > 0){
+          renderFormValue(element, bounds, stack);
+        }
+        break;
+      case "TEXTAREA":
+        if ((element.value || element.placeholder || "").length > 0){
+          renderFormValue(element, bounds, stack);
+        }
+        break;
+      case "SELECT":
+        if ((element.options||element.placeholder || "").length > 0){
+          renderFormValue(element, bounds, stack);
+        }
+        break;
+      case "LI":
+        renderListItem(element, stack, backgroundBounds);
+        break;
+      case "CANVAS":
+        renderImage(ctx, element, element, bounds, borders);
+        break;
+    }
+
+    return stack;
+  }
+
+  function isElementVisible(element) {
+    return (getCSS(element, 'display') !== "none" && getCSS(element, 'visibility') !== "hidden" && !element.hasAttribute("data-html2canvas-ignore"));
+  }
+
+  function parseElement (element, stack, pseudoElement) {
+    if (isElementVisible(element)) {
+      stack = renderElement(element, stack, pseudoElement, false) || stack;
+      if (!ignoreElementsRegExp.test(element.nodeName)) {
+        parseChildren(element, stack, pseudoElement);
+      }
+    }
+  }
+
+  function parseChildren(element, stack, pseudoElement) {
+    Util.Children(element).forEach(function(node) {
+      if (node.nodeType === node.ELEMENT_NODE) {
+        parseElement(node, stack, pseudoElement);
+      } else if (node.nodeType === node.TEXT_NODE) {
+        renderText(element, node, stack);
+      }
+    });
+  }
+
+  function init() {
+    var background = getCSS(document.documentElement, "backgroundColor"),
+      transparentBackground = (Util.isTransparent(background) && element === document.body),
+      stack = renderElement(element, null, false, transparentBackground);
+    parseChildren(element, stack);
+
+    if (transparentBackground) {
+      background = stack.backgroundColor;
+    }
+
+    body.removeChild(hidePseudoElements);
+    return {
+      backgroundColor: background,
+      stack: stack
+    };
+  }
+
+  return init();
+};
+
+function h2czContext(zindex) {
+  return {
+    zindex: zindex,
+    children: []
+  };
+}
+
+_html2canvas.Preload = function( options ) {
+
+  var images = {
+    numLoaded: 0,   // also failed are counted here
+    numFailed: 0,
+    numTotal: 0,
+    cleanupDone: false
+  },
+  pageOrigin,
+  Util = _html2canvas.Util,
+  methods,
+  i,
+  count = 0,
+  element = options.elements[0] || document.body,
+  doc = element.ownerDocument,
+  domImages = element.getElementsByTagName('img'), // Fetch images of the present element only
+  imgLen = domImages.length,
+  link = doc.createElement("a"),
+  supportCORS = (function( img ){
+    return (img.crossOrigin !== undefined);
+  })(new Image()),
+  timeoutTimer;
+
+  link.href = window.location.href;
+  pageOrigin  = link.protocol + link.host;
+
+  function isSameOrigin(url){
+    link.href = url;
+    link.href = link.href; // YES, BELIEVE IT OR NOT, that is required for IE9 - http://jsfiddle.net/niklasvh/2e48b/
+    var origin = link.protocol + link.host;
+    return (origin === pageOrigin);
+  }
+
+  function start(){
+    Util.log("html2canvas: start: images: " + images.numLoaded + " / " + images.numTotal + " (failed: " + images.numFailed + ")");
+    if (!images.firstRun && images.numLoaded >= images.numTotal){
+      Util.log("Finished loading images: # " + images.numTotal + " (failed: " + images.numFailed + ")");
+
+      if (typeof options.complete === "function"){
+        options.complete(images);
+      }
+
+    }
+  }
+
+  // TODO modify proxy to serve images with CORS enabled, where available
+  function proxyGetImage(url, img, imageObj){
+    var callback_name,
+    scriptUrl = options.proxy,
+    script;
+
+    link.href = url;
+    url = link.href; // work around for pages with base href="" set - WARNING: this may change the url
+
+    callback_name = 'html2canvas_' + (count++);
+    imageObj.callbackname = callback_name;
+
+    if (scriptUrl.indexOf("?") > -1) {
+      scriptUrl += "&";
+    } else {
+      scriptUrl += "?";
+    }
+    scriptUrl += 'url=' + encodeURIComponent(url) + '&callback=' + callback_name;
+    script = doc.createElement("script");
+
+    window[callback_name] = function(a){
+      if (a.substring(0,6) === "error:"){
+        imageObj.succeeded = false;
+        images.numLoaded++;
+        images.numFailed++;
+        start();
+      } else {
+        setImageLoadHandlers(img, imageObj);
+        img.src = a;
+      }
+      window[callback_name] = undefined; // to work with IE<9  // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)
+      try {
+        delete window[callback_name];  // for all browser that support this
+      } catch(ex) {}
+      script.parentNode.removeChild(script);
+      script = null;
+      delete imageObj.script;
+      delete imageObj.callbackname;
+    };
+
+    script.setAttribute("type", "text/javascript");
+    script.setAttribute("src", scriptUrl);
+    imageObj.script = script;
+    window.document.body.appendChild(script);
+
+  }
+
+  function loadPseudoElement(element, type) {
+    var style = window.getComputedStyle(element, type),
+    content = style.content;
+    if (content.substr(0, 3) === 'url') {
+      methods.loadImage(_html2canvas.Util.parseBackgroundImage(content)[0].args[0]);
+    }
+    loadBackgroundImages(style.backgroundImage, element);
+  }
+
+  function loadPseudoElementImages(element) {
+    loadPseudoElement(element, ":before");
+    loadPseudoElement(element, ":after");
+  }
+
+  function loadGradientImage(backgroundImage, bounds) {
+    var img = _html2canvas.Generate.Gradient(backgroundImage, bounds);
+
+    if (img !== undefined){
+      images[backgroundImage] = {
+        img: img,
+        succeeded: true
+      };
+      images.numTotal++;
+      images.numLoaded++;
+      start();
+    }
+  }
+
+  function invalidBackgrounds(background_image) {
+    return (background_image && background_image.method && background_image.args && background_image.args.length > 0 );
+  }
+
+  function loadBackgroundImages(background_image, el) {
+    var bounds;
+
+    _html2canvas.Util.parseBackgroundImage(background_image).filter(invalidBackgrounds).forEach(function(background_image) {
+      if (background_image.method === 'url') {
+        methods.loadImage(background_image.args[0]);
+      } else if(background_image.method.match(/\-?gradient$/)) {
+        if(bounds === undefined) {
+          bounds = _html2canvas.Util.Bounds(el);
+        }
+        loadGradientImage(background_image.value, bounds);
+      }
+    });
+  }
+
+  function getImages (el) {
+    var elNodeType = false;
+
+    // Firefox fails with permission denied on pages with iframes
+    try {
+      Util.Children(el).forEach(getImages);
+    }
+    catch( e ) {}
+
+    try {
+      elNodeType = el.nodeType;
+    } catch (ex) {
+      elNodeType = false;
+      Util.log("html2canvas: failed to access some element's nodeType - Exception: " + ex.message);
+    }
+
+    if (elNodeType === 1 || elNodeType === undefined) {
+      loadPseudoElementImages(el);
+      try {
+        loadBackgroundImages(Util.getCSS(el, 'backgroundImage'), el);
+      } catch(e) {
+        Util.log("html2canvas: failed to get background-image - Exception: " + e.message);
+      }
+      loadBackgroundImages(el);
+    }
+  }
+
+  function setImageLoadHandlers(img, imageObj) {
+    img.onload = function() {
+      if ( imageObj.timer !== undefined ) {
+        // CORS succeeded
+        window.clearTimeout( imageObj.timer );
+      }
+
+      images.numLoaded++;
+      imageObj.succeeded = true;
+      img.onerror = img.onload = null;
+      start();
+    };
+    img.onerror = function() {
+      if (img.crossOrigin === "anonymous") {
+        // CORS failed
+        window.clearTimeout( imageObj.timer );
+
+        // let's try with proxy instead
+        if ( options.proxy ) {
+          var src = img.src;
+          img = new Image();
+          imageObj.img = img;
+          img.src = src;
+
+          proxyGetImage( img.src, img, imageObj );
+          return;
+        }
+      }
+
+      images.numLoaded++;
+      images.numFailed++;
+      imageObj.succeeded = false;
+      img.onerror = img.onload = null;
+      start();
+    };
+  }
+
+  methods = {
+    loadImage: function( src ) {
+      var img, imageObj;
+      if ( src && images[src] === undefined ) {
+        img = new Image();
+        if ( src.match(/data:image\/.*;base64,/i) ) {
+          img.src = src.replace(/url\(['"]{0,}|['"]{0,}\)$/ig, '');
+          imageObj = images[src] = {
+            img: img
+          };
+          images.numTotal++;
+          setImageLoadHandlers(img, imageObj);
+        } else if ( isSameOrigin( src ) || options.allowTaint ===  true ) {
+          imageObj = images[src] = {
+            img: img
+          };
+          images.numTotal++;
+          setImageLoadHandlers(img, imageObj);
+          img.src = src;
+        } else if ( supportCORS && !options.allowTaint && options.useCORS ) {
+          // attempt to load with CORS
+
+          img.crossOrigin = "anonymous";
+          imageObj = images[src] = {
+            img: img
+          };
+          images.numTotal++;
+          setImageLoadHandlers(img, imageObj);
+          img.src = src;
+        } else if ( options.proxy ) {
+          imageObj = images[src] = {
+            img: img
+          };
+          images.numTotal++;
+          proxyGetImage( src, img, imageObj );
+        }
+      }
+
+    },
+    cleanupDOM: function(cause) {
+      var img, src;
+      if (!images.cleanupDone) {
+        if (cause && typeof cause === "string") {
+          Util.log("html2canvas: Cleanup because: " + cause);
+        } else {
+          Util.log("html2canvas: Cleanup after timeout: " + options.timeout + " ms.");
+        }
+
+        for (src in images) {
+          if (images.hasOwnProperty(src)) {
+            img = images[src];
+            if (typeof img === "object" && img.callbackname && img.succeeded === undefined) {
+              // cancel proxy image request
+              window[img.callbackname] = undefined; // to work with IE<9  // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)
+              try {
+                delete window[img.callbackname];  // for all browser that support this
+              } catch(ex) {}
+              if (img.script && img.script.parentNode) {
+                img.script.setAttribute("src", "about:blank");  // try to cancel running request
+                img.script.parentNode.removeChild(img.script);
+              }
+              images.numLoaded++;
+              images.numFailed++;
+              Util.log("html2canvas: Cleaned up failed img: '" + src + "' Steps: " + images.numLoaded + " / " + images.numTotal);
+            }
+          }
+        }
+
+        // cancel any pending requests
+        if(window.stop !== undefined) {
+          window.stop();
+        } else if(document.execCommand !== undefined) {
+          document.execCommand("Stop", false);
+        }
+        if (document.close !== undefined) {
+          document.close();
+        }
+        images.cleanupDone = true;
+        if (!(cause && typeof cause === "string")) {
+          start();
+        }
+      }
+    },
+
+    renderingDone: function() {
+      if (timeoutTimer) {
+        window.clearTimeout(timeoutTimer);
+      }
+    }
+  };
+
+  if (options.timeout > 0) {
+    timeoutTimer = window.setTimeout(methods.cleanupDOM, options.timeout);
+  }
+
+  Util.log('html2canvas: Preload starts: finding background-images');
+  images.firstRun = true;
+
+  getImages(element);
+
+  Util.log('html2canvas: Preload: Finding images');
+  // load <img> images
+  for (i = 0; i < imgLen; i+=1){
+    methods.loadImage( domImages[i].getAttribute( "src" ) );
+  }
+
+  images.firstRun = false;
+  Util.log('html2canvas: Preload: Done.');
+  if (images.numTotal === images.numLoaded) {
+    start();
+  }
+
+  return methods;
+};
+
+_html2canvas.Renderer = function(parseQueue, options){
+
+  // http://www.w3.org/TR/CSS21/zindex.html
+  function createRenderQueue(parseQueue) {
+    var queue = [],
+    rootContext;
+
+    rootContext = (function buildStackingContext(rootNode) {
+      var rootContext = {};
+      function insert(context, node, specialParent) {
+        var zi = (node.zIndex.zindex === 'auto') ? 0 : Number(node.zIndex.zindex),
+        contextForChildren = context, // the stacking context for children
+        isPositioned = node.zIndex.isPositioned,
+        isFloated = node.zIndex.isFloated,
+        stub = {node: node},
+        childrenDest = specialParent; // where children without z-index should be pushed into
+
+        if (node.zIndex.ownStacking) {
+          // '!' comes before numbers in sorted array
+          contextForChildren = stub.context = { '!': [{node:node, children: []}]};
+          childrenDest = undefined;
+        } else if (isPositioned || isFloated) {
+          childrenDest = stub.children = [];
+        }
+
+        if (zi === 0 && specialParent) {
+          specialParent.push(stub);
+        } else {
+          if (!context[zi]) { context[zi] = []; }
+          context[zi].push(stub);
+        }
+
+        node.zIndex.children.forEach(function(childNode) {
+          insert(contextForChildren, childNode, childrenDest);
+        });
+      }
+      insert(rootContext, rootNode);
+      return rootContext;
+    })(parseQueue);
+
+    function sortZ(context) {
+      Object.keys(context).sort().forEach(function(zi) {
+        var nonPositioned = [],
+        floated = [],
+        positioned = [],
+        list = [];
+
+        // positioned after static
+        context[zi].forEach(function(v) {
+          if (v.node.zIndex.isPositioned || v.node.zIndex.opacity < 1) {
+            // http://www.w3.org/TR/css3-color/#transparency
+            // non-positioned element with opactiy < 1 should be stacked as if it were a positioned element with ‘z-index: 0’ and ‘opacity: 1’.
+            positioned.push(v);
+          } else if (v.node.zIndex.isFloated) {
+            floated.push(v);
+          } else {
+            nonPositioned.push(v);
+          }
+        });
+
+        (function walk(arr) {
+          arr.forEach(function(v) {
+            list.push(v);
+            if (v.children) { walk(v.children); }
+          });
+        })(nonPositioned.concat(floated, positioned));
+
+        list.forEach(function(v) {
+          if (v.context) {
+            sortZ(v.context);
+          } else {
+            queue.push(v.node);
+          }
+        });
+      });
+    }
+
+    sortZ(rootContext);
+
+    return queue;
+  }
+
+  function getRenderer(rendererName) {
+    var renderer;
+
+    if (typeof options.renderer === "string" && _html2canvas.Renderer[rendererName] !== undefined) {
+      renderer = _html2canvas.Renderer[rendererName](options);
+    } else if (typeof rendererName === "function") {
+      renderer = rendererName(options);
+    } else {
+      throw new Error("Unknown renderer");
+    }
+
+    if ( typeof renderer !== "function" ) {
+      throw new Error("Invalid renderer defined");
+    }
+    return renderer;
+  }
+
+  return getRenderer(options.renderer)(parseQueue, options, document, createRenderQueue(parseQueue.stack), _html2canvas);
+};
+
+_html2canvas.Util.Support = function (options, doc) {
+
+  function supportSVGRendering() {
+    var img = new Image(),
+    canvas = doc.createElement("canvas"),
+    ctx = (canvas.getContext === undefined) ? false : canvas.getContext("2d");
+    if (ctx === false) {
+      return false;
+    }
+    canvas.width = canvas.height = 10;
+    img.src = [
+    "data:image/svg+xml,",
+    "<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'>",
+    "<foreignObject width='10' height='10'>",
+    "<div xmlns='http://www.w3.org/1999/xhtml' style='width:10;height:10;'>",
+    "sup",
+    "</div>",
+    "</foreignObject>",
+    "</svg>"
+    ].join("");
+    try {
+      ctx.drawImage(img, 0, 0);
+      canvas.toDataURL();
+    } catch(e) {
+      return false;
+    }
+    _html2canvas.Util.log('html2canvas: Parse: SVG powered rendering available');
+    return true;
+  }
+
+  // Test whether we can use ranges to measure bounding boxes
+  // Opera doesn't provide valid bounds.height/bottom even though it supports the method.
+
+  function supportRangeBounds() {
+    var r, testElement, rangeBounds, rangeHeight, support = false;
+
+    if (doc.createRange) {
+      r = doc.createRange();
+      if (r.getBoundingClientRect) {
+        testElement = doc.createElement('boundtest');
+        testElement.style.height = "123px";
+        testElement.style.display = "block";
+        doc.body.appendChild(testElement);
+
+        r.selectNode(testElement);
+        rangeBounds = r.getBoundingClientRect();
+        rangeHeight = rangeBounds.height;
+
+        if (rangeHeight === 123) {
+          support = true;
+        }
+        doc.body.removeChild(testElement);
+      }
+    }
+
+    return support;
+  }
+
+  return {
+    rangeBounds: supportRangeBounds(),
+    svgRendering: options.svgRendering && supportSVGRendering()
+  };
+};
+window.html2canvas = function(elements, opts) {
+  elements = (elements.length) ? elements : [elements];
+  var queue,
+  canvas,
+  options = {
+    // general
+    logging: false,
+    elements: elements,
+    background: "#fff",
+
+    // preload options
+    proxy: null,
+    timeout: 0,    // no timeout
+    useCORS: false, // try to load images as CORS (where available), before falling back to proxy
+    allowTaint: false, // whether to allow images to taint the canvas, won't need proxy if set to true
+
+    // parse options
+    svgRendering: false, // use svg powered rendering where available (FF11+)
+    ignoreElements: "IFRAME|OBJECT|PARAM",
+    useOverflow: true,
+    letterRendering: false,
+    chinese: false,
+
+    // render options
+
+    width: null,
+    height: null,
+    taintTest: true, // do a taint test with all images before applying to canvas
+    renderer: "Canvas"
+  };
+
+  options = _html2canvas.Util.Extend(opts, options);
+
+  _html2canvas.logging = options.logging;
+  options.complete = function( images ) {
+
+    if (typeof options.onpreloaded === "function") {
+      if ( options.onpreloaded( images ) === false ) {
+        return;
+      }
+    }
+    queue = _html2canvas.Parse( images, options );
+
+    if (typeof options.onparsed === "function") {
+      if ( options.onparsed( queue ) === false ) {
+        return;
+      }
+    }
+
+    canvas = _html2canvas.Renderer( queue, options );
+
+    if (typeof options.onrendered === "function") {
+      options.onrendered( canvas );
+    }
+
+
+  };
+
+  // for pages without images, we still want this to be async, i.e. return methods before executing
+  window.setTimeout( function(){
+    _html2canvas.Preload( options );
+  }, 0 );
+
+  return {
+    render: function( queue, opts ) {
+      return _html2canvas.Renderer( queue, _html2canvas.Util.Extend(opts, options) );
+    },
+    parse: function( images, opts ) {
+      return _html2canvas.Parse( images, _html2canvas.Util.Extend(opts, options) );
+    },
+    preload: function( opts ) {
+      return _html2canvas.Preload( _html2canvas.Util.Extend(opts, options) );
+    },
+    log: _html2canvas.Util.log
+  };
+};
+
+window.html2canvas.log = _html2canvas.Util.log; // for renderers
+window.html2canvas.Renderer = {
+  Canvas: undefined // We are assuming this will be used
+};
+_html2canvas.Renderer.Canvas = function(options) {
+  options = options || {};
+
+  var doc = document,
+  safeImages = [],
+  testCanvas = document.createElement("canvas"),
+  testctx = testCanvas.getContext("2d"),
+  Util = _html2canvas.Util,
+  canvas = options.canvas || doc.createElement('canvas');
+
+  function createShape(ctx, args) {
+    ctx.beginPath();
+    args.forEach(function(arg) {
+      ctx[arg.name].apply(ctx, arg['arguments']);
+    });
+    ctx.closePath();
+  }
+
+  function safeImage(item) {
+    if (safeImages.indexOf(item['arguments'][0].src ) === -1) {
+      testctx.drawImage(item['arguments'][0], 0, 0);
+      try {
+        testctx.getImageData(0, 0, 1, 1);
+      } catch(e) {
+        testCanvas = doc.createElement("canvas");
+        testctx = testCanvas.getContext("2d");
+        return false;
+      }
+      safeImages.push(item['arguments'][0].src);
+    }
+    return true;
+  }
+
+  function renderItem(ctx, item) {
+    switch(item.type){
+      case "variable":
+        ctx[item.name] = item['arguments'];
+        break;
+      case "function":
+        switch(item.name) {
+          case "createPattern":
+            if (item['arguments'][0].width > 0 && item['arguments'][0].height > 0) {
+              try {
+                ctx.fillStyle = ctx.createPattern(item['arguments'][0], "repeat");
+              }
+              catch(e) {
+                Util.log("html2canvas: Renderer: Error creating pattern", e.message);
+              }
+            }
+            break;
+          case "drawShape":
+            createShape(ctx, item['arguments']);
+            break;
+          case "drawImage":
+            if (item['arguments'][8] > 0 && item['arguments'][7] > 0) {
+              if (!options.taintTest || (options.taintTest && safeImage(item))) {
+                ctx.drawImage.apply( ctx, item['arguments'] );
+              }
+            }
+            break;
+          default:
+            ctx[item.name].apply(ctx, item['arguments']);
+        }
+        break;
+    }
+  }
+
+  return function(parsedData, options, document, queue, _html2canvas) {
+    var ctx = canvas.getContext("2d"),
+    newCanvas,
+    bounds,
+    fstyle,
+    zStack = parsedData.stack;
+
+    canvas.width = canvas.style.width =  options.width || zStack.ctx.width;
+    canvas.height = canvas.style.height = options.height || zStack.ctx.height;
+
+    fstyle = ctx.fillStyle;
+    ctx.fillStyle = (Util.isTransparent(zStack.backgroundColor) && options.background !== undefined) ? options.background : parsedData.backgroundColor;
+    ctx.fillRect(0, 0, canvas.width, canvas.height);
+    ctx.fillStyle = fstyle;
+
+    queue.forEach(function(storageContext) {
+      // set common settings for canvas
+      ctx.textBaseline = "bottom";
+      ctx.save();
+
+      if (storageContext.transform.matrix) {
+        ctx.translate(storageContext.transform.origin[0], storageContext.transform.origin[1]);
+        ctx.transform.apply(ctx, storageContext.transform.matrix);
+        ctx.translate(-storageContext.transform.origin[0], -storageContext.transform.origin[1]);
+      }
+
+      if (storageContext.clip){
+        ctx.beginPath();
+        ctx.rect(storageContext.clip.left, storageContext.clip.top, storageContext.clip.width, storageContext.clip.height);
+        ctx.clip();
+      }
+
+      if (storageContext.ctx.storage) {
+        storageContext.ctx.storage.forEach(function(item) {
+          renderItem(ctx, item);
+        });
+      }
+
+      ctx.restore();
+    });
+
+    Util.log("html2canvas: Renderer: Canvas renderer done - returning canvas obj");
+
+    if (options.elements.length === 1) {
+      if (typeof options.elements[0] === "object" && options.elements[0].nodeName !== "BODY") {
+        // crop image to the bounds of selected (single) element
+        bounds = _html2canvas.Util.Bounds(options.elements[0]);
+        newCanvas = document.createElement('canvas');
+        newCanvas.width = Math.ceil(bounds.width);
+        newCanvas.height = Math.ceil(bounds.height);
+        ctx = newCanvas.getContext("2d");
+
+        ctx.drawImage(canvas, bounds.left, bounds.top, bounds.width, bounds.height, 0, 0, bounds.width, bounds.height);
+        canvas = null;
+        return newCanvas;
+      }
+    }
+
+    return canvas;
+  };
+};
+})(window,document);
\ No newline at end of file
diff --git a/module/javascript/externs/jquery-sortable/LICENSE b/module/javascript/externs/jquery-sortable/LICENSE
new file mode 100755
index 0000000000000000000000000000000000000000..ce2c75d730222bccf5425d3757bf9a1e54f2b3bc
--- /dev/null
+++ b/module/javascript/externs/jquery-sortable/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2012 Jonas von Andrian
+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.
+    * The name of the author may not 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 <COPYRIGHT HOLDER> 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
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/module/javascript/externs/jquery-sortable/jquery-sortable.js b/module/javascript/externs/jquery-sortable/jquery-sortable.js
new file mode 100755
index 0000000000000000000000000000000000000000..5eba439d2d9264b9254b71543e20b0cce34432ad
--- /dev/null
+++ b/module/javascript/externs/jquery-sortable/jquery-sortable.js
@@ -0,0 +1,693 @@
+/* ===================================================
+ *  jquery-sortable.js v0.9.13
+ *  http://johnny.github.com/jquery-sortable/
+ * ===================================================
+ *  Copyright (c) 2012 Jonas von Andrian
+ *  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.
+ *  * The name of the author may not 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 <COPYRIGHT HOLDER> 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
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ========================================================== */
+
+
+!function ( $, window, pluginName, undefined){
+  var containerDefaults = {
+    // If true, items can be dragged from this container
+    drag: true,
+    // If true, items can be droped onto this container
+    drop: true,
+    // Exclude items from being draggable, if the
+    // selector matches the item
+    exclude: "",
+    // If true, search for nested containers within an item.If you nest containers,
+    // either the original selector with which you call the plugin must only match the top containers,
+    // or you need to specify a group (see the bootstrap nav example)
+    nested: true,
+    // If true, the items are assumed to be arranged vertically
+    vertical: true
+  }, // end container defaults
+  groupDefaults = {
+    // This is executed after the placeholder has been moved.
+    // $closestItemOrContainer contains the closest item, the placeholder
+    // has been put at or the closest empty Container, the placeholder has
+    // been appended to.
+    afterMove: function ($placeholder, container, $closestItemOrContainer) {
+    },
+    // The exact css path between the container and its items, e.g. "> tbody"
+    containerPath: "",
+    // The css selector of the containers
+    containerSelector: "ol, ul",
+    // Distance the mouse has to travel to start dragging
+    distance: 0,
+    // Time in milliseconds after mousedown until dragging should start.
+    // This option can be used to prevent unwanted drags when clicking on an element.
+    delay: 0,
+    // The css selector of the drag handle
+    handle: "",
+    // The exact css path between the item and its subcontainers.
+    // It should only match the immediate items of a container.
+    // No item of a subcontainer should be matched. E.g. for ol>div>li the itemPath is "> div"
+    itemPath: "",
+    // The css selector of the items
+    itemSelector: "li",
+    // The class given to "body" while an item is being dragged
+    bodyClass: "dragging",
+    // The class giving to an item while being dragged
+    draggedClass: "dragged",
+    // Check if the dragged item may be inside the container.
+    // Use with care, since the search for a valid container entails a depth first search
+    // and may be quite expensive.
+    isValidTarget: function ($item, container) {
+      return true
+    },
+    // Executed before onDrop if placeholder is detached.
+    // This happens if pullPlaceholder is set to false and the drop occurs outside a container.
+    onCancel: function ($item, container, _super, event) {
+    },
+    // Executed at the beginning of a mouse move event.
+    // The Placeholder has not been moved yet.
+    onDrag: function ($item, position, _super, event) {
+      $item.css(position)
+    },
+    // Called after the drag has been started,
+    // that is the mouse button is being held down and
+    // the mouse is moving.
+    // The container is the closest initialized container.
+    // Therefore it might not be the container, that actually contains the item.
+    onDragStart: function ($item, container, _super, event) {
+      $item.css({
+        height: $item.outerHeight(),
+        width: $item.outerWidth()
+      })
+      $item.addClass(container.group.options.draggedClass)
+      $("body").addClass(container.group.options.bodyClass)
+    },
+    // Called when the mouse button is being released
+    onDrop: function ($item, container, _super, event) {
+      $item.removeClass(container.group.options.draggedClass).removeAttr("style")
+      $("body").removeClass(container.group.options.bodyClass)
+    },
+    // Called on mousedown. If falsy value is returned, the dragging will not start.
+    // Ignore if element clicked is input, select or textarea
+    onMousedown: function ($item, _super, event) {
+      if (!event.target.nodeName.match(/^(input|select|textarea)$/i)) {
+        event.preventDefault()
+        return true
+      }
+    },
+    // The class of the placeholder (must match placeholder option markup)
+    placeholderClass: "placeholder",
+    // Template for the placeholder. Can be any valid jQuery input
+    // e.g. a string, a DOM element.
+    // The placeholder must have the class "placeholder"
+    placeholder: '<li class="placeholder"></li>',
+    // If true, the position of the placeholder is calculated on every mousemove.
+    // If false, it is only calculated when the mouse is above a container.
+    pullPlaceholder: true,
+    // Specifies serialization of the container group.
+    // The pair $parent/$children is either container/items or item/subcontainers.
+    serialize: function ($parent, $children, parentIsContainer) {
+      var result = $.extend({}, $parent.data())
+
+      if(parentIsContainer)
+        return [$children]
+      else if ($children[0]){
+        result.children = $children
+      }
+
+      delete result.subContainers
+      delete result.sortable
+
+      return result
+    },
+    // Set tolerance while dragging. Positive values decrease sensitivity,
+    // negative values increase it.
+    tolerance: 0
+  }, // end group defaults
+  containerGroups = {},
+  groupCounter = 0,
+  emptyBox = {
+    left: 0,
+    top: 0,
+    bottom: 0,
+    right:0
+  },
+  eventNames = {
+    start: "touchstart.sortable mousedown.sortable",
+    drop: "touchend.sortable touchcancel.sortable mouseup.sortable",
+    drag: "touchmove.sortable mousemove.sortable",
+    scroll: "scroll.sortable"
+  },
+  subContainerKey = "subContainers"
+
+  /*
+   * a is Array [left, right, top, bottom]
+   * b is array [left, top]
+   */
+  function d(a,b) {
+    var x = Math.max(0, a[0] - b[0], b[0] - a[1]),
+    y = Math.max(0, a[2] - b[1], b[1] - a[3])
+    return x+y;
+  }
+
+  function setDimensions(array, dimensions, tolerance, useOffset) {
+    var i = array.length,
+    offsetMethod = useOffset ? "offset" : "position"
+    tolerance = tolerance || 0
+
+    while(i--){
+      var el = array[i].el ? array[i].el : $(array[i]),
+      // use fitting method
+      pos = el[offsetMethod]()
+      pos.left += parseInt(el.css('margin-left'), 10)
+      pos.top += parseInt(el.css('margin-top'),10)
+      dimensions[i] = [
+        pos.left - tolerance,
+        pos.left + el.outerWidth() + tolerance,
+        pos.top - tolerance,
+        pos.top + el.outerHeight() + tolerance
+      ]
+    }
+  }
+
+  function getRelativePosition(pointer, element) {
+    var offset = element.offset()
+    return {
+      left: pointer.left - offset.left,
+      top: pointer.top - offset.top
+    }
+  }
+
+  function sortByDistanceDesc(dimensions, pointer, lastPointer) {
+    pointer = [pointer.left, pointer.top]
+    lastPointer = lastPointer && [lastPointer.left, lastPointer.top]
+
+    var dim,
+    i = dimensions.length,
+    distances = []
+
+    while(i--){
+      dim = dimensions[i]
+      distances[i] = [i,d(dim,pointer), lastPointer && d(dim, lastPointer)]
+    }
+    distances = distances.sort(function  (a,b) {
+      return b[1] - a[1] || b[2] - a[2] || b[0] - a[0]
+    })
+
+    // last entry is the closest
+    return distances
+  }
+
+  function ContainerGroup(options) {
+    this.options = $.extend({}, groupDefaults, options)
+    this.containers = []
+
+    if(!this.options.rootGroup){
+      this.scrollProxy = $.proxy(this.scroll, this)
+      this.dragProxy = $.proxy(this.drag, this)
+      this.dropProxy = $.proxy(this.drop, this)
+      this.placeholder = $(this.options.placeholder)
+
+      if(!options.isValidTarget)
+        this.options.isValidTarget = undefined
+    }
+  }
+
+  ContainerGroup.get = function  (options) {
+    if(!containerGroups[options.group]) {
+      if(options.group === undefined)
+        options.group = groupCounter ++
+
+      containerGroups[options.group] = new ContainerGroup(options)
+    }
+
+    return containerGroups[options.group]
+  }
+
+  ContainerGroup.prototype = {
+    dragInit: function  (e, itemContainer) {
+      this.$document = $(itemContainer.el[0].ownerDocument)
+
+      // get item to drag
+      var closestItem = $(e.target).closest(this.options.itemSelector);
+      // using the length of this item, prevents the plugin from being started if there is no handle being clicked on.
+      // this may also be helpful in instantiating multidrag.
+      if (closestItem.length) {
+        this.item = closestItem;
+        this.itemContainer = itemContainer;
+        if (this.item.is(this.options.exclude) || !this.options.onMousedown(this.item, groupDefaults.onMousedown, e)) {
+            return;
+        }
+        this.setPointer(e);
+        this.toggleListeners('on');
+        this.setupDelayTimer();
+        this.dragInitDone = true;
+      }
+    },
+    drag: function  (e) {
+      if(!this.dragging){
+        if(!this.distanceMet(e) || !this.delayMet)
+          return
+
+        this.options.onDragStart(this.item, this.itemContainer, groupDefaults.onDragStart, e)
+        this.item.before(this.placeholder)
+        this.dragging = true
+      }
+
+      this.setPointer(e)
+      // place item under the cursor
+      this.options.onDrag(this.item,
+                          getRelativePosition(this.pointer, this.item.offsetParent()),
+                          groupDefaults.onDrag,
+                          e)
+
+      var p = this.getPointer(e),
+      box = this.sameResultBox,
+      t = this.options.tolerance
+
+      if(!box || box.top - t > p.top || box.bottom + t < p.top || box.left - t > p.left || box.right + t < p.left)
+        if(!this.searchValidTarget()){
+          this.placeholder.detach()
+          this.lastAppendedItem = undefined
+        }
+    },
+    drop: function  (e) {
+      this.toggleListeners('off')
+
+      this.dragInitDone = false
+
+      if(this.dragging){
+        // processing Drop, check if placeholder is detached
+        if(this.placeholder.closest("html")[0]){
+          this.placeholder.before(this.item).detach()
+        } else {
+          this.options.onCancel(this.item, this.itemContainer, groupDefaults.onCancel, e)
+        }
+        this.options.onDrop(this.item, this.getContainer(this.item), groupDefaults.onDrop, e)
+
+        // cleanup
+        this.clearDimensions()
+        this.clearOffsetParent()
+        this.lastAppendedItem = this.sameResultBox = undefined
+        this.dragging = false
+      }
+    },
+    searchValidTarget: function  (pointer, lastPointer) {
+      if(!pointer){
+        pointer = this.relativePointer || this.pointer
+        lastPointer = this.lastRelativePointer || this.lastPointer
+      }
+
+      var distances = sortByDistanceDesc(this.getContainerDimensions(),
+                                         pointer,
+                                         lastPointer),
+      i = distances.length
+
+      while(i--){
+        var index = distances[i][0],
+        distance = distances[i][1]
+
+        if(!distance || this.options.pullPlaceholder){
+          var container = this.containers[index]
+          if(!container.disabled){
+            if(!this.$getOffsetParent()){
+              var offsetParent = container.getItemOffsetParent()
+              pointer = getRelativePosition(pointer, offsetParent)
+              lastPointer = getRelativePosition(lastPointer, offsetParent)
+            }
+            if(container.searchValidTarget(pointer, lastPointer))
+              return true
+          }
+        }
+      }
+      if(this.sameResultBox)
+        this.sameResultBox = undefined
+    },
+    movePlaceholder: function  (container, item, method, sameResultBox) {
+      var lastAppendedItem = this.lastAppendedItem
+      if(!sameResultBox && lastAppendedItem && lastAppendedItem[0] === item[0])
+        return;
+
+      item[method](this.placeholder)
+      this.lastAppendedItem = item
+      this.sameResultBox = sameResultBox
+      this.options.afterMove(this.placeholder, container, item)
+    },
+    getContainerDimensions: function  () {
+      if(!this.containerDimensions)
+        setDimensions(this.containers, this.containerDimensions = [], this.options.tolerance, !this.$getOffsetParent())
+      return this.containerDimensions
+    },
+    getContainer: function  (element) {
+      return element.closest(this.options.containerSelector).data(pluginName)
+    },
+    $getOffsetParent: function  () {
+      if(this.offsetParent === undefined){
+        var i = this.containers.length - 1,
+        offsetParent = this.containers[i].getItemOffsetParent()
+
+        if(!this.options.rootGroup){
+          while(i--){
+            if(offsetParent[0] != this.containers[i].getItemOffsetParent()[0]){
+              // If every container has the same offset parent,
+              // use position() which is relative to this parent,
+              // otherwise use offset()
+              // compare #setDimensions
+              offsetParent = false
+              break;
+            }
+          }
+        }
+
+        this.offsetParent = offsetParent
+      }
+      return this.offsetParent
+    },
+    setPointer: function (e) {
+      var pointer = this.getPointer(e)
+
+      if(this.$getOffsetParent()){
+        var relativePointer = getRelativePosition(pointer, this.$getOffsetParent())
+        this.lastRelativePointer = this.relativePointer
+        this.relativePointer = relativePointer
+      }
+
+      this.lastPointer = this.pointer
+      this.pointer = pointer
+    },
+    distanceMet: function (e) {
+      var currentPointer = this.getPointer(e)
+      return (Math.max(
+        Math.abs(this.pointer.left - currentPointer.left),
+        Math.abs(this.pointer.top - currentPointer.top)
+      ) >= this.options.distance)
+    },
+    getPointer: function(e) {
+      var o = e.originalEvent || e.originalEvent.touches && e.originalEvent.touches[0]
+      return {
+        left: e.pageX || o.pageX,
+        top: e.pageY || o.pageY
+      }
+    },
+    setupDelayTimer: function () {
+      var that = this
+      this.delayMet = !this.options.delay
+
+      // init delay timer if needed
+      if (!this.delayMet) {
+        clearTimeout(this._mouseDelayTimer);
+        this._mouseDelayTimer = setTimeout(function() {
+          that.delayMet = true
+        }, this.options.delay)
+      }
+    },
+    scroll: function  (e) {
+      this.clearDimensions()
+      this.clearOffsetParent() // TODO is this needed?
+    },
+    toggleListeners: function (method) {
+      var that = this,
+      events = ['drag','drop','scroll']
+
+      $.each(events,function  (i,event) {
+        that.$document[method](eventNames[event], that[event + 'Proxy'])
+      })
+    },
+    clearOffsetParent: function () {
+      this.offsetParent = undefined
+    },
+    // Recursively clear container and item dimensions
+    clearDimensions: function  () {
+      this.traverse(function(object){
+        object._clearDimensions()
+      })
+    },
+    traverse: function(callback) {
+      callback(this)
+      var i = this.containers.length
+      while(i--){
+        this.containers[i].traverse(callback)
+      }
+    },
+    _clearDimensions: function(){
+      this.containerDimensions = undefined
+    },
+    _destroy: function () {
+      containerGroups[this.options.group] = undefined
+    }
+  }
+
+  function Container(element, options) {
+    this.el = element
+    this.options = $.extend( {}, containerDefaults, options)
+
+    this.group = ContainerGroup.get(this.options)
+    this.rootGroup = this.options.rootGroup || this.group
+    this.handle = this.rootGroup.options.handle || this.rootGroup.options.itemSelector
+
+    var itemPath = this.rootGroup.options.itemPath
+    this.target = itemPath ? this.el.find(itemPath) : this.el
+
+    this.target.on(eventNames.start, this.handle, $.proxy(this.dragInit, this))
+
+    if(this.options.drop)
+      this.group.containers.push(this)
+  }
+
+  Container.prototype = {
+    dragInit: function  (e) {
+      var rootGroup = this.rootGroup
+
+      if( !this.disabled &&
+          !rootGroup.dragInitDone &&
+          this.options.drag &&
+          this.isValidDrag(e)) {
+        rootGroup.dragInit(e, this)
+      }
+    },
+    isValidDrag: function(e) {
+      return e.which == 1 ||
+        e.type == "touchstart" && e.originalEvent.touches.length == 1
+    },
+    searchValidTarget: function  (pointer, lastPointer) {
+      var distances = sortByDistanceDesc(this.getItemDimensions(),
+                                         pointer,
+                                         lastPointer),
+      i = distances.length,
+      rootGroup = this.rootGroup,
+      validTarget = !rootGroup.options.isValidTarget ||
+        rootGroup.options.isValidTarget(rootGroup.item, this)
+
+      if(!i && validTarget){
+        rootGroup.movePlaceholder(this, this.target, "append")
+        return true
+      } else
+        while(i--){
+          var index = distances[i][0],
+          distance = distances[i][1]
+          if(!distance && this.hasChildGroup(index)){
+            var found = this.getContainerGroup(index).searchValidTarget(pointer, lastPointer)
+            if(found)
+              return true
+          }
+          else if(validTarget){
+            this.movePlaceholder(index, pointer)
+            return true
+          }
+        }
+    },
+    movePlaceholder: function  (index, pointer) {
+      var item = $(this.items[index]),
+      dim = this.itemDimensions[index],
+      method = "after",
+      width = item.outerWidth(),
+      height = item.outerHeight(),
+      offset = item.offset(),
+      sameResultBox = {
+        left: offset.left,
+        right: offset.left + width,
+        top: offset.top,
+        bottom: offset.top + height
+      }
+      if(this.options.vertical){
+        var yCenter = (dim[2] + dim[3]) / 2,
+        inUpperHalf = pointer.top <= yCenter
+        if(inUpperHalf){
+          method = "before"
+          sameResultBox.bottom -= height / 2
+        } else
+          sameResultBox.top += height / 2
+      } else {
+        var xCenter = (dim[0] + dim[1]) / 2,
+        inLeftHalf = pointer.left <= xCenter
+        if(inLeftHalf){
+          method = "before"
+          sameResultBox.right -= width / 2
+        } else
+          sameResultBox.left += width / 2
+      }
+      if(this.hasChildGroup(index))
+        sameResultBox = emptyBox
+      this.rootGroup.movePlaceholder(this, item, method, sameResultBox)
+    },
+    getItemDimensions: function  () {
+      if(!this.itemDimensions){
+        this.items = this.$getChildren(this.el, "item").filter(
+          ":not(." + this.group.options.placeholderClass + ", ." + this.group.options.draggedClass + ")"
+        ).get()
+        setDimensions(this.items, this.itemDimensions = [], this.options.tolerance)
+      }
+      return this.itemDimensions
+    },
+    getItemOffsetParent: function  () {
+      var offsetParent,
+      el = this.el
+      // Since el might be empty we have to check el itself and
+      // can not do something like el.children().first().offsetParent()
+      if(el.css("position") === "relative" || el.css("position") === "absolute"  || el.css("position") === "fixed")
+        offsetParent = el
+      else
+        offsetParent = el.offsetParent()
+      return offsetParent
+    },
+    hasChildGroup: function (index) {
+      return this.options.nested && this.getContainerGroup(index)
+    },
+    getContainerGroup: function  (index) {
+      var childGroup = $.data(this.items[index], subContainerKey)
+      if( childGroup === undefined){
+        var childContainers = this.$getChildren(this.items[index], "container")
+        childGroup = false
+
+        if(childContainers[0]){
+          var options = $.extend({}, this.options, {
+            rootGroup: this.rootGroup,
+            group: groupCounter ++
+          })
+          childGroup = childContainers[pluginName](options).data(pluginName).group
+        }
+        $.data(this.items[index], subContainerKey, childGroup)
+      }
+      return childGroup
+    },
+    $getChildren: function (parent, type) {
+      var options = this.rootGroup.options,
+      path = options[type + "Path"],
+      selector = options[type + "Selector"]
+
+      parent = $(parent)
+      if(path)
+        parent = parent.find(path)
+
+      return parent.children(selector)
+    },
+    _serialize: function (parent, isContainer) {
+      var that = this,
+      childType = isContainer ? "item" : "container",
+
+      children = this.$getChildren(parent, childType).not(this.options.exclude).map(function () {
+        return that._serialize($(this), !isContainer)
+      }).get()
+
+      return this.rootGroup.options.serialize(parent, children, isContainer)
+    },
+    traverse: function(callback) {
+      $.each(this.items || [], function(item){
+        var group = $.data(this, subContainerKey)
+        if(group)
+          group.traverse(callback)
+      });
+
+      callback(this)
+    },
+    _clearDimensions: function  () {
+      this.itemDimensions = undefined
+    },
+    _destroy: function() {
+      var that = this;
+
+      this.target.off(eventNames.start, this.handle);
+      this.el.removeData(pluginName)
+
+      if(this.options.drop)
+        this.group.containers = $.grep(this.group.containers, function(val){
+          return val != that
+        })
+
+      $.each(this.items || [], function(){
+        $.removeData(this, subContainerKey)
+      })
+    }
+  }
+
+  var API = {
+    enable: function() {
+      this.traverse(function(object){
+        object.disabled = false
+      })
+    },
+    disable: function (){
+      this.traverse(function(object){
+        object.disabled = true
+      })
+    },
+    serialize: function () {
+      return this._serialize(this.el, true)
+    },
+    refresh: function() {
+      this.traverse(function(object){
+        object._clearDimensions()
+      })
+    },
+    destroy: function () {
+      this.traverse(function(object){
+        object._destroy();
+      })
+    }
+  }
+
+  $.extend(Container.prototype, API)
+
+  /**
+   * jQuery API
+   *
+   * Parameters are
+   *   either options on init
+   *   or a method name followed by arguments to pass to the method
+   */
+  $.fn[pluginName] = function(methodOrOptions) {
+    var args = Array.prototype.slice.call(arguments, 1)
+
+    return this.map(function(){
+      var $t = $(this),
+      object = $t.data(pluginName)
+
+      if(object && API[methodOrOptions])
+        return API[methodOrOptions].apply(object, args) || this
+      else if(!object && (methodOrOptions === undefined ||
+                          typeof methodOrOptions === "object"))
+        $t.data(pluginName, new Container($t, methodOrOptions))
+
+      return this
+    });
+  };
+
+}(jQuery, window, 'sortable');
\ No newline at end of file
diff --git a/module/javascript/externs/jspdf/MIT-LICENSE.txt b/module/javascript/externs/jspdf/MIT-LICENSE.txt
new file mode 100755
index 0000000000000000000000000000000000000000..89ff582f0fc2eaea51142863316e645ac18fa751
--- /dev/null
+++ b/module/javascript/externs/jspdf/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2010-2016 James Hall, https://github.com/MrRio/jsPDF
+
+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/module/javascript/externs/jspdf/jspdf.debug.js b/module/javascript/externs/jspdf/jspdf.debug.js
new file mode 100755
index 0000000000000000000000000000000000000000..cbf500c96067166a4c62412b02a83a9df1b1ddb0
--- /dev/null
+++ b/module/javascript/externs/jspdf/jspdf.debug.js
@@ -0,0 +1,9363 @@
+/** @preserve
+ * jsPDF - PDF Document creation from JavaScript
+ * Version 1.0.272-git Built on 2014-09-29T15:09
+ *                           CommitID d4770725ca
+ *
+ * Copyright (c) 2010-2014 James Hall, https://github.com/MrRio/jsPDF
+ *               2010 Aaron Spike, https://github.com/acspike
+ *               2012 Willow Systems Corporation, willow-systems.com
+ *               2012 Pablo Hess, https://github.com/pablohess
+ *               2012 Florian Jenett, https://github.com/fjenett
+ *               2013 Warren Weckesser, https://github.com/warrenweckesser
+ *               2013 Youssef Beddad, https://github.com/lifof
+ *               2013 Lee Driscoll, https://github.com/lsdriscoll
+ *               2013 Stefan Slonevskiy, https://github.com/stefslon
+ *               2013 Jeremy Morel, https://github.com/jmorel
+ *               2013 Christoph Hartmann, https://github.com/chris-rock
+ *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
+ *               2014 James Makes, https://github.com/dollaruw
+ *               2014 Diego Casorran, https://github.com/diegocrf
+ *
+ * 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.
+ *
+ * Contributor(s):
+ *    siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango,
+ *    kim3er, mfo, alnorth,
+ */
+
+/**
+ * Creates new jsPDF document object instance.
+ *
+ * @class
+ * @param orientation One of "portrait" or "landscape" (or shortcuts "p" (Default), "l")
+ * @param unit        Measurement unit to be used when coordinates are specified.
+ *                    One of "pt" (points), "mm" (Default), "cm", "in"
+ * @param format      One of 'pageFormats' as shown below, default: a4
+ * @returns {jsPDF}
+ * @name jsPDF
+ */
+var jsPDF = (function(global) {
+	'use strict';
+	var pdfVersion = '1.3',
+		pageFormats = { // Size in pt of various paper formats
+			'a0'  : [2383.94, 3370.39], 'a1'  : [1683.78, 2383.94],
+			'a2'  : [1190.55, 1683.78], 'a3'  : [ 841.89, 1190.55],
+			'a4'  : [ 595.28,  841.89], 'a5'  : [ 419.53,  595.28],
+			'a6'  : [ 297.64,  419.53], 'a7'  : [ 209.76,  297.64],
+			'a8'  : [ 147.40,  209.76], 'a9'  : [ 104.88,  147.40],
+			'a10' : [  73.70,  104.88], 'b0'  : [2834.65, 4008.19],
+			'b1'  : [2004.09, 2834.65], 'b2'  : [1417.32, 2004.09],
+			'b3'  : [1000.63, 1417.32], 'b4'  : [ 708.66, 1000.63],
+			'b5'  : [ 498.90,  708.66], 'b6'  : [ 354.33,  498.90],
+			'b7'  : [ 249.45,  354.33], 'b8'  : [ 175.75,  249.45],
+			'b9'  : [ 124.72,  175.75], 'b10' : [  87.87,  124.72],
+			'c0'  : [2599.37, 3676.54], 'c1'  : [1836.85, 2599.37],
+			'c2'  : [1298.27, 1836.85], 'c3'  : [ 918.43, 1298.27],
+			'c4'  : [ 649.13,  918.43], 'c5'  : [ 459.21,  649.13],
+			'c6'  : [ 323.15,  459.21], 'c7'  : [ 229.61,  323.15],
+			'c8'  : [ 161.57,  229.61], 'c9'  : [ 113.39,  161.57],
+			'c10' : [  79.37,  113.39], 'dl'  : [ 311.81,  623.62],
+			'letter'            : [612,   792],
+			'government-letter' : [576,   756],
+			'legal'             : [612,  1008],
+			'junior-legal'      : [576,   360],
+			'ledger'            : [1224,  792],
+			'tabloid'           : [792,  1224],
+			'credit-card'       : [153,   243]
+		};
+
+	/**
+	 * jsPDF's Internal PubSub Implementation.
+	 * See mrrio.github.io/jsPDF/doc/symbols/PubSub.html
+	 * Backward compatible rewritten on 2014 by
+	 * Diego Casorran, https://github.com/diegocr
+	 *
+	 * @class
+	 * @name PubSub
+	 */
+	function PubSub(context) {
+		var topics = {};
+
+		this.subscribe = function(topic, callback, once) {
+			if(typeof callback !== 'function') {
+				return false;
+			}
+
+			if(!topics.hasOwnProperty(topic)) {
+				topics[topic] = {};
+			}
+
+			var id = Math.random().toString(35);
+			topics[topic][id] = [callback,!!once];
+
+			return id;
+		};
+
+		this.unsubscribe = function(token) {
+			for(var topic in topics) {
+				if(topics[topic][token]) {
+					delete topics[topic][token];
+					return true;
+				}
+			}
+			return false;
+		};
+
+		this.publish = function(topic) {
+			if(topics.hasOwnProperty(topic)) {
+				var args = Array.prototype.slice.call(arguments, 1), idr = [];
+
+				for(var id in topics[topic]) {
+					var sub = topics[topic][id];
+					try {
+						sub[0].apply(context, args);
+					} catch(ex) {
+						if(global.console) {
+							console.error('jsPDF PubSub Error', ex.message, ex);
+						}
+					}
+					if(sub[1]) idr.push(id);
+				}
+				if(idr.length) idr.forEach(this.unsubscribe);
+			}
+		};
+	}
+
+	/**
+	 * @constructor
+	 * @private
+	 */
+	function jsPDF(orientation, unit, format, compressPdf) {
+		var options = {};
+
+		if (typeof orientation === 'object') {
+			options = orientation;
+
+			orientation = options.orientation;
+			unit = options.unit || unit;
+			format = options.format || format;
+			compressPdf = options.compress || options.compressPdf || compressPdf;
+		}
+
+		// Default options
+		unit        = unit || 'mm';
+		format      = format || 'a4';
+		orientation = ('' + (orientation || 'P')).toLowerCase();
+
+		var format_as_string = ('' + format).toLowerCase(),
+			compress = !!compressPdf && typeof Uint8Array === 'function',
+			textColor            = options.textColor  || '0 g',
+			drawColor            = options.drawColor  || '0 G',
+			activeFontSize       = options.fontSize   || 16,
+			lineHeightProportion = options.lineHeight || 1.15,
+			lineWidth            = options.lineWidth  || 0.200025, // 2mm
+			objectNumber =  2,  // 'n' Current object number
+			outToPages   = !1,  // switches where out() prints. outToPages true = push to pages obj. outToPages false = doc builder content
+			offsets      = [],  // List of offsets. Activated and reset by buildDocument(). Pupulated by various calls buildDocument makes.
+			fonts        = {},  // collection of font objects, where key is fontKey - a dynamically created label for a given font.
+			fontmap      = {},  // mapping structure fontName > fontStyle > font key - performance layer. See addFont()
+			activeFontKey,      // will be string representing the KEY of the font as combination of fontName + fontStyle
+			k,                  // Scale factor
+			tmp,
+			page = 0,
+			currentPage,
+			pages = [],
+			pagedim = {},
+			content = [],
+			lineCapID = 0,
+			lineJoinID = 0,
+			content_length = 0,
+			pageWidth,
+			pageHeight,
+			pageMode,
+			zoomMode,
+			layoutMode,
+			documentProperties = {
+				'title'    : '',
+				'subject'  : '',
+				'author'   : '',
+				'keywords' : '',
+				'creator'  : ''
+			},
+			API = {},
+			events = new PubSub(API),
+
+		/////////////////////
+		// Private functions
+		/////////////////////
+		f2 = function(number) {
+			return number.toFixed(2); // Ie, %.2f
+		},
+		f3 = function(number) {
+			return number.toFixed(3); // Ie, %.3f
+		},
+		padd2 = function(number) {
+			return ('0' + parseInt(number)).slice(-2);
+		},
+		out = function(string) {
+			if (outToPages) {
+				/* set by beginPage */
+				pages[currentPage].push(string);
+			} else {
+				// +1 for '\n' that will be used to join 'content'
+				content_length += string.length + 1;
+				content.push(string);
+			}
+		},
+		newObject = function() {
+			// Begin a new object
+			objectNumber++;
+			offsets[objectNumber] = content_length;
+			out(objectNumber + ' 0 obj');
+			return objectNumber;
+		},
+		putStream = function(str) {
+			out('stream');
+			out(str);
+			out('endstream');
+		},
+		putPages = function() {
+			var n,p,arr,i,deflater,adler32,adler32cs,wPt,hPt;
+
+			adler32cs = global.adler32cs || jsPDF.adler32cs;
+			if (compress && typeof adler32cs === 'undefined') {
+				compress = false;
+			}
+
+			// outToPages = false as set in endDocument(). out() writes to content.
+
+			for (n = 1; n <= page; n++) {
+				newObject();
+				wPt = (pageWidth = pagedim[n].width) * k;
+				hPt = (pageHeight = pagedim[n].height) * k;
+				out('<</Type /Page');
+				out('/Parent 1 0 R');
+				out('/Resources 2 0 R');
+				out('/MediaBox [0 0 ' + f2(wPt) + ' ' + f2(hPt) + ']');
+				out('/Contents ' + (objectNumber + 1) + ' 0 R>>');
+				out('endobj');
+
+				// Page content
+				p = pages[n].join('\n');
+				newObject();
+				if (compress) {
+					arr = [];
+					i = p.length;
+					while(i--) {
+						arr[i] = p.charCodeAt(i);
+					}
+					adler32 = adler32cs.from(p);
+					deflater = new Deflater(6);
+					deflater.append(new Uint8Array(arr));
+					p = deflater.flush();
+					arr = new Uint8Array(p.length + 6);
+					arr.set(new Uint8Array([120, 156])),
+					arr.set(p, 2);
+					arr.set(new Uint8Array([adler32 & 0xFF, (adler32 >> 8) & 0xFF, (adler32 >> 16) & 0xFF, (adler32 >> 24) & 0xFF]), p.length+2);
+					p = String.fromCharCode.apply(null, arr);
+					out('<</Length ' + p.length + ' /Filter [/FlateDecode]>>');
+				} else {
+					out('<</Length ' + p.length + '>>');
+				}
+				putStream(p);
+				out('endobj');
+			}
+			offsets[1] = content_length;
+			out('1 0 obj');
+			out('<</Type /Pages');
+			var kids = '/Kids [';
+			for (i = 0; i < page; i++) {
+				kids += (3 + 2 * i) + ' 0 R ';
+			}
+			out(kids + ']');
+			out('/Count ' + page);
+			out('>>');
+			out('endobj');
+		},
+		putFont = function(font) {
+			font.objectNumber = newObject();
+			out('<</BaseFont/' + font.PostScriptName + '/Type/Font');
+			if (typeof font.encoding === 'string') {
+				out('/Encoding/' + font.encoding);
+			}
+			out('/Subtype/Type1>>');
+			out('endobj');
+		},
+		putFonts = function() {
+			for (var fontKey in fonts) {
+				if (fonts.hasOwnProperty(fontKey)) {
+					putFont(fonts[fontKey]);
+				}
+			}
+		},
+		putXobjectDict = function() {
+			// Loop through images, or other data objects
+			events.publish('putXobjectDict');
+		},
+		putResourceDictionary = function() {
+			out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+			out('/Font <<');
+
+			// Do this for each font, the '1' bit is the index of the font
+			for (var fontKey in fonts) {
+				if (fonts.hasOwnProperty(fontKey)) {
+					out('/' + fontKey + ' ' + fonts[fontKey].objectNumber + ' 0 R');
+				}
+			}
+			out('>>');
+			out('/XObject <<');
+			putXobjectDict();
+			out('>>');
+		},
+		putResources = function() {
+			putFonts();
+			events.publish('putResources');
+			// Resource dictionary
+			offsets[2] = content_length;
+			out('2 0 obj');
+			out('<<');
+			putResourceDictionary();
+			out('>>');
+			out('endobj');
+			events.publish('postPutResources');
+		},
+		addToFontDictionary = function(fontKey, fontName, fontStyle) {
+			// this is mapping structure for quick font key lookup.
+			// returns the KEY of the font (ex: "F1") for a given
+			// pair of font name and type (ex: "Arial". "Italic")
+			if (!fontmap.hasOwnProperty(fontName)) {
+				fontmap[fontName] = {};
+			}
+			fontmap[fontName][fontStyle] = fontKey;
+		},
+		/**
+		 * FontObject describes a particular font as member of an instnace of jsPDF
+		 *
+		 * It's a collection of properties like 'id' (to be used in PDF stream),
+		 * 'fontName' (font's family name), 'fontStyle' (font's style variant label)
+		 *
+		 * @class
+		 * @public
+		 * @property id {String} PDF-document-instance-specific label assinged to the font.
+		 * @property PostScriptName {String} PDF specification full name for the font
+		 * @property encoding {Object} Encoding_name-to-Font_metrics_object mapping.
+		 * @name FontObject
+		 */
+		addFont = function(PostScriptName, fontName, fontStyle, encoding) {
+			var fontKey = 'F' + (Object.keys(fonts).length + 1).toString(10),
+			// This is FontObject
+			font = fonts[fontKey] = {
+				'id'             : fontKey,
+				'PostScriptName' : PostScriptName,
+				'fontName'       : fontName,
+				'fontStyle'      : fontStyle,
+				'encoding'       : encoding,
+				'metadata'       : {}
+			};
+			addToFontDictionary(fontKey, fontName, fontStyle);
+			events.publish('addFont', font);
+
+			return fontKey;
+		},
+		addFonts = function() {
+
+			var HELVETICA     = "helvetica",
+				TIMES         = "times",
+				COURIER       = "courier",
+				NORMAL        = "normal",
+				BOLD          = "bold",
+				ITALIC        = "italic",
+				BOLD_ITALIC   = "bolditalic",
+				encoding      = 'StandardEncoding',
+				standardFonts = [
+					['Helvetica', HELVETICA, NORMAL],
+					['Helvetica-Bold', HELVETICA, BOLD],
+					['Helvetica-Oblique', HELVETICA, ITALIC],
+					['Helvetica-BoldOblique', HELVETICA, BOLD_ITALIC],
+					['Courier', COURIER, NORMAL],
+					['Courier-Bold', COURIER, BOLD],
+					['Courier-Oblique', COURIER, ITALIC],
+					['Courier-BoldOblique', COURIER, BOLD_ITALIC],
+					['Times-Roman', TIMES, NORMAL],
+					['Times-Bold', TIMES, BOLD],
+					['Times-Italic', TIMES, ITALIC],
+					['Times-BoldItalic', TIMES, BOLD_ITALIC]
+				];
+
+			for (var i = 0, l = standardFonts.length; i < l; i++) {
+				var fontKey = addFont(
+						standardFonts[i][0],
+						standardFonts[i][1],
+						standardFonts[i][2],
+						encoding);
+
+				// adding aliases for standard fonts, this time matching the capitalization
+				var parts = standardFonts[i][0].split('-');
+				addToFontDictionary(fontKey, parts[0], parts[1] || '');
+			}
+			events.publish('addFonts', { fonts : fonts, dictionary : fontmap });
+		},
+		SAFE = function __safeCall(fn) {
+			fn.foo = function __safeCallWrapper() {
+				try {
+					return fn.apply(this, arguments);
+				} catch (e) {
+					var stack = e.stack || '';
+					if(~stack.indexOf(' at ')) stack = stack.split(" at ")[1];
+					var m = "Error in function " + stack.split("\n")[0].split('<')[0] + ": " + e.message;
+					if(global.console) {
+						global.console.error(m, e);
+						if(global.alert) alert(m);
+					} else {
+						throw new Error(m);
+					}
+				}
+			};
+			fn.foo.bar = fn;
+			return fn.foo;
+		},
+		to8bitStream = function(text, flags) {
+		/**
+		 * PDF 1.3 spec:
+		 * "For text strings encoded in Unicode, the first two bytes must be 254 followed by
+		 * 255, representing the Unicode byte order marker, U+FEFF. (This sequence conflicts
+		 * with the PDFDocEncoding character sequence thorn ydieresis, which is unlikely
+		 * to be a meaningful beginning of a word or phrase.) The remainder of the
+		 * string consists of Unicode character codes, according to the UTF-16 encoding
+		 * specified in the Unicode standard, version 2.0. Commonly used Unicode values
+		 * are represented as 2 bytes per character, with the high-order byte appearing first
+		 * in the string."
+		 *
+		 * In other words, if there are chars in a string with char code above 255, we
+		 * recode the string to UCS2 BE - string doubles in length and BOM is prepended.
+		 *
+		 * HOWEVER!
+		 * Actual *content* (body) text (as opposed to strings used in document properties etc)
+		 * does NOT expect BOM. There, it is treated as a literal GID (Glyph ID)
+		 *
+		 * Because of Adobe's focus on "you subset your fonts!" you are not supposed to have
+		 * a font that maps directly Unicode (UCS2 / UTF16BE) code to font GID, but you could
+		 * fudge it with "Identity-H" encoding and custom CIDtoGID map that mimics Unicode
+		 * code page. There, however, all characters in the stream are treated as GIDs,
+		 * including BOM, which is the reason we need to skip BOM in content text (i.e. that
+		 * that is tied to a font).
+		 *
+		 * To signal this "special" PDFEscape / to8bitStream handling mode,
+		 * API.text() function sets (unless you overwrite it with manual values
+		 * given to API.text(.., flags) )
+		 * flags.autoencode = true
+		 * flags.noBOM = true
+		 *
+		 * ===================================================================================
+		 * `flags` properties relied upon:
+		 *   .sourceEncoding = string with encoding label.
+		 *                     "Unicode" by default. = encoding of the incoming text.
+		 *                     pass some non-existing encoding name
+		 *                     (ex: 'Do not touch my strings! I know what I am doing.')
+		 *                     to make encoding code skip the encoding step.
+		 *   .outputEncoding = Either valid PDF encoding name
+		 *                     (must be supported by jsPDF font metrics, otherwise no encoding)
+		 *                     or a JS object, where key = sourceCharCode, value = outputCharCode
+		 *                     missing keys will be treated as: sourceCharCode === outputCharCode
+		 *   .noBOM
+		 *       See comment higher above for explanation for why this is important
+		 *   .autoencode
+		 *       See comment higher above for explanation for why this is important
+		 */
+
+			var i,l,sourceEncoding,encodingBlock,outputEncoding,newtext,isUnicode,ch,bch;
+
+			flags = flags || {};
+			sourceEncoding = flags.sourceEncoding || 'Unicode';
+			outputEncoding = flags.outputEncoding;
+
+			// This 'encoding' section relies on font metrics format
+			// attached to font objects by, among others,
+			// "Willow Systems' standard_font_metrics plugin"
+			// see jspdf.plugin.standard_font_metrics.js for format
+			// of the font.metadata.encoding Object.
+			// It should be something like
+			//   .encoding = {'codePages':['WinANSI....'], 'WinANSI...':{code:code, ...}}
+			//   .widths = {0:width, code:width, ..., 'fof':divisor}
+			//   .kerning = {code:{previous_char_code:shift, ..., 'fof':-divisor},...}
+			if ((flags.autoencode || outputEncoding) &&
+				fonts[activeFontKey].metadata &&
+				fonts[activeFontKey].metadata[sourceEncoding] &&
+				fonts[activeFontKey].metadata[sourceEncoding].encoding) {
+				encodingBlock = fonts[activeFontKey].metadata[sourceEncoding].encoding;
+
+				// each font has default encoding. Some have it clearly defined.
+				if (!outputEncoding && fonts[activeFontKey].encoding) {
+					outputEncoding = fonts[activeFontKey].encoding;
+				}
+
+				// Hmmm, the above did not work? Let's try again, in different place.
+				if (!outputEncoding && encodingBlock.codePages) {
+					outputEncoding = encodingBlock.codePages[0]; // let's say, first one is the default
+				}
+
+				if (typeof outputEncoding === 'string') {
+					outputEncoding = encodingBlock[outputEncoding];
+				}
+				// we want output encoding to be a JS Object, where
+				// key = sourceEncoding's character code and
+				// value = outputEncoding's character code.
+				if (outputEncoding) {
+					isUnicode = false;
+					newtext = [];
+					for (i = 0, l = text.length; i < l; i++) {
+						ch = outputEncoding[text.charCodeAt(i)];
+						if (ch) {
+							newtext.push(
+								String.fromCharCode(ch));
+						} else {
+							newtext.push(
+								text[i]);
+						}
+
+						// since we are looping over chars anyway, might as well
+						// check for residual unicodeness
+						if (newtext[i].charCodeAt(0) >> 8) {
+							/* more than 255 */
+							isUnicode = true;
+						}
+					}
+					text = newtext.join('');
+				}
+			}
+
+			i = text.length;
+			// isUnicode may be set to false above. Hence the triple-equal to undefined
+			while (isUnicode === undefined && i !== 0) {
+				if (text.charCodeAt(i - 1) >> 8) {
+					/* more than 255 */
+					isUnicode = true;
+				}
+				i--;
+			}
+			if (!isUnicode) {
+				return text;
+			}
+
+			newtext = flags.noBOM ? [] : [254, 255];
+			for (i = 0, l = text.length; i < l; i++) {
+				ch = text.charCodeAt(i);
+				bch = ch >> 8; // divide by 256
+				if (bch >> 8) {
+					/* something left after dividing by 256 second time */
+					throw new Error("Character at position " + i + " of string '"
+						+ text + "' exceeds 16bits. Cannot be encoded into UCS-2 BE");
+				}
+				newtext.push(bch);
+				newtext.push(ch - (bch << 8));
+			}
+			return String.fromCharCode.apply(undefined, newtext);
+		},
+		pdfEscape = function(text, flags) {
+			/**
+			 * Replace '/', '(', and ')' with pdf-safe versions
+			 *
+			 * Doing to8bitStream does NOT make this PDF display unicode text. For that
+			 * we also need to reference a unicode font and embed it - royal pain in the rear.
+			 *
+			 * There is still a benefit to to8bitStream - PDF simply cannot handle 16bit chars,
+			 * which JavaScript Strings are happy to provide. So, while we still cannot display
+			 * 2-byte characters property, at least CONDITIONALLY converting (entire string containing)
+			 * 16bit chars to (USC-2-BE) 2-bytes per char + BOM streams we ensure that entire PDF
+			 * is still parseable.
+			 * This will allow immediate support for unicode in document properties strings.
+			 */
+			return to8bitStream(text, flags).replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
+		},
+		putInfo = function() {
+			out('/Producer (jsPDF ' + jsPDF.version + ')');
+			for(var key in documentProperties) {
+				if(documentProperties.hasOwnProperty(key) && documentProperties[key]) {
+					out('/'+key.substr(0,1).toUpperCase() + key.substr(1)
+						+' (' + pdfEscape(documentProperties[key]) + ')');
+				}
+			}
+			var created  = new Date(),
+				tzoffset = created.getTimezoneOffset(),
+				tzsign   = tzoffset < 0 ? '+' : '-',
+				tzhour   = Math.floor(Math.abs(tzoffset / 60)),
+				tzmin    = Math.abs(tzoffset % 60),
+				tzstr    = [tzsign, padd2(tzhour), "'", padd2(tzmin), "'"].join('');
+			out(['/CreationDate (D:',
+					created.getFullYear(),
+					padd2(created.getMonth() + 1),
+					padd2(created.getDate()),
+					padd2(created.getHours()),
+					padd2(created.getMinutes()),
+					padd2(created.getSeconds()), tzstr, ')'].join(''));
+		},
+		putCatalog = function() {
+			out('/Type /Catalog');
+			out('/Pages 1 0 R');
+			// PDF13ref Section 7.2.1
+			if (!zoomMode) zoomMode = 'fullwidth';
+			switch(zoomMode) {
+				case 'fullwidth'  : out('/OpenAction [3 0 R /FitH null]');       break;
+				case 'fullheight' : out('/OpenAction [3 0 R /FitV null]');       break;
+				case 'fullpage'   : out('/OpenAction [3 0 R /Fit]');             break;
+				case 'original'   : out('/OpenAction [3 0 R /XYZ null null 1]'); break;
+				default:
+					var pcn = '' + zoomMode;
+					if (pcn.substr(pcn.length-1) === '%')
+						zoomMode = parseInt(zoomMode) / 100;
+					if (typeof zoomMode === 'number') {
+						out('/OpenAction [3 0 R /XYZ null null '+f2(zoomMode)+']');
+					}
+			}
+			if (!layoutMode) layoutMode = 'continuous';
+			switch(layoutMode) {
+				case 'continuous' : out('/PageLayout /OneColumn');      break;
+				case 'single'     : out('/PageLayout /SinglePage');     break;
+				case 'two':
+				case 'twoleft'    : out('/PageLayout /TwoColumnLeft');  break;
+				case 'tworight'   : out('/PageLayout /TwoColumnRight'); break;
+			}
+			if (pageMode) {
+				/**
+				 * A name object specifying how the document should be displayed when opened:
+				 * UseNone      : Neither document outline nor thumbnail images visible -- DEFAULT
+				 * UseOutlines  : Document outline visible
+				 * UseThumbs    : Thumbnail images visible
+				 * FullScreen   : Full-screen mode, with no menu bar, window controls, or any other window visible
+				 */
+				out('/PageMode /' + pageMode);
+			}
+			events.publish('putCatalog');
+		},
+		putTrailer = function() {
+			out('/Size ' + (objectNumber + 1));
+			out('/Root ' + objectNumber + ' 0 R');
+			out('/Info ' + (objectNumber - 1) + ' 0 R');
+		},
+		beginPage = function(width,height) {
+			// Dimensions are stored as user units and converted to points on output
+			var orientation = typeof height === 'string' && height.toLowerCase();
+			if (typeof width === 'string') {
+				var format = width.toLowerCase();
+				if (pageFormats.hasOwnProperty(format)) {
+					width  = pageFormats[format][0] / k;
+					height = pageFormats[format][1] / k;
+				}
+			}
+			if (Array.isArray(width)) {
+				height = width[1];
+				width = width[0];
+			}
+			if (orientation) {
+				switch(orientation.substr(0,1)) {
+					case 'l': if (height > width ) orientation = 's'; break;
+					case 'p': if (width > height ) orientation = 's'; break;
+				}
+				if (orientation === 's') { tmp = width; width = height; height = tmp; }
+			}
+			outToPages = true;
+			pages[++page] = [];
+			pagedim[page] = {
+				width  : Number(width)  || pageWidth,
+				height : Number(height) || pageHeight
+			};
+			_setPage(page);
+		},
+		_addPage = function() {
+			beginPage.apply(this, arguments);
+			// Set line width
+			out(f2(lineWidth * k) + ' w');
+			// Set draw color
+			out(drawColor);
+			// resurrecting non-default line caps, joins
+			if (lineCapID !== 0) {
+				out(lineCapID + ' J');
+			}
+			if (lineJoinID !== 0) {
+				out(lineJoinID + ' j');
+			}
+			events.publish('addPage', { pageNumber : page });
+		},
+		_setPage = function(n) {
+			if (n > 0 && n <= page) {
+				currentPage = n;
+				pageWidth = pagedim[n].width;
+				pageHeight = pagedim[n].height;
+			}
+		},
+		/**
+		 * Returns a document-specific font key - a label assigned to a
+		 * font name + font type combination at the time the font was added
+		 * to the font inventory.
+		 *
+		 * Font key is used as label for the desired font for a block of text
+		 * to be added to the PDF document stream.
+		 * @private
+		 * @function
+		 * @param fontName {String} can be undefined on "falthy" to indicate "use current"
+		 * @param fontStyle {String} can be undefined on "falthy" to indicate "use current"
+		 * @returns {String} Font key.
+		 */
+		getFont = function(fontName, fontStyle) {
+			var key;
+
+			fontName  = fontName  !== undefined ? fontName  : fonts[activeFontKey].fontName;
+			fontStyle = fontStyle !== undefined ? fontStyle : fonts[activeFontKey].fontStyle;
+
+			try {
+			 // get a string like 'F3' - the KEY corresponding tot he font + type combination.
+				key = fontmap[fontName][fontStyle];
+			} catch (e) {}
+
+			if (!key) {
+				throw new Error("Unable to look up font label for font '" + fontName + "', '"
+					+ fontStyle + "'. Refer to getFontList() for available fonts.");
+			}
+			return key;
+		},
+		buildDocument = function() {
+
+			outToPages = false; // switches out() to content
+			objectNumber = 2;
+			content = [];
+			offsets = [];
+
+			// putHeader()
+			out('%PDF-' + pdfVersion);
+
+			putPages();
+
+			putResources();
+
+			// Info
+			newObject();
+			out('<<');
+			putInfo();
+			out('>>');
+			out('endobj');
+
+			// Catalog
+			newObject();
+			out('<<');
+			putCatalog();
+			out('>>');
+			out('endobj');
+
+			// Cross-ref
+			var o = content_length, i, p = "0000000000";
+			out('xref');
+			out('0 ' + (objectNumber + 1));
+			out(p+' 65535 f ');
+			for (i = 1; i <= objectNumber; i++) {
+				out((p + offsets[i]).slice(-10) + ' 00000 n ');
+			}
+			// Trailer
+			out('trailer');
+			out('<<');
+			putTrailer();
+			out('>>');
+			out('startxref');
+			out(o);
+			out('%%EOF');
+
+			outToPages = true;
+
+			return content.join('\n');
+		},
+		getStyle = function(style) {
+			// see path-painting operators in PDF spec
+			var op = 'S'; // stroke
+			if (style === 'F') {
+				op = 'f'; // fill
+			} else if (style === 'FD' || style === 'DF') {
+				op = 'B'; // both
+			} else if (style === 'f' || style === 'f*' || style === 'B' || style === 'B*') {
+				/*
+				Allow direct use of these PDF path-painting operators:
+				- f	fill using nonzero winding number rule
+				- f*	fill using even-odd rule
+				- B	fill then stroke with fill using non-zero winding number rule
+				- B*	fill then stroke with fill using even-odd rule
+				*/
+				op = style;
+			}
+			return op;
+		},
+		getArrayBuffer = function() {
+			var data = buildDocument(), len = data.length,
+				ab = new ArrayBuffer(len), u8 = new Uint8Array(ab);
+
+			while(len--) u8[len] = data.charCodeAt(len);
+			return ab;
+		},
+		getBlob = function() {
+			return new Blob([getArrayBuffer()], { type : "application/pdf" });
+		},
+		/**
+		 * Generates the PDF document.
+		 *
+		 * If `type` argument is undefined, output is raw body of resulting PDF returned as a string.
+		 *
+		 * @param {String} type A string identifying one of the possible output types.
+		 * @param {Object} options An object providing some additional signalling to PDF generator.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name output
+		 */
+		output = SAFE(function(type, options) {
+			var datauri = ('' + type).substr(0,6) === 'dataur'
+				? 'data:application/pdf;base64,'+btoa(buildDocument()):0;
+
+			switch (type) {
+				case undefined:
+					return buildDocument();
+				case 'save':
+					if (navigator.getUserMedia) {
+						if (global.URL === undefined
+						|| global.URL.createObjectURL === undefined) {
+							return API.output('dataurlnewwindow');
+						}
+					}
+					saveAs(getBlob(), options);
+					if(typeof saveAs.unload === 'function') {
+						if(global.setTimeout) {
+							setTimeout(saveAs.unload,911);
+						}
+					}
+					break;
+				case 'arraybuffer':
+					return getArrayBuffer();
+				case 'blob':
+					return getBlob();
+				case 'bloburi':
+				case 'bloburl':
+					// User is responsible of calling revokeObjectURL
+					return global.URL && global.URL.createObjectURL(getBlob()) || void 0;
+				case 'datauristring':
+				case 'dataurlstring':
+					return datauri;
+				case 'dataurlnewwindow':
+					var nW = global.open(datauri);
+					if (nW || typeof safari === "undefined") return nW;
+					/* pass through */
+				case 'datauri':
+				case 'dataurl':
+					return global.document.location.href = datauri;
+				default:
+					throw new Error('Output type "' + type + '" is not supported.');
+			}
+			// @TODO: Add different output options
+		});
+
+		switch (unit) {
+			case 'pt':  k = 1;          break;
+			case 'mm':  k = 72 / 25.4;  break;
+			case 'cm':  k = 72 / 2.54;  break;
+			case 'in':  k = 72;         break;
+			case 'px':  k = 96 / 72;    break;
+			case 'pc':  k = 12;         break;
+			case 'em':  k = 12;         break;
+			case 'ex':  k = 6;          break;
+			default:
+				throw ('Invalid unit: ' + unit);
+		}
+
+		//---------------------------------------
+		// Public API
+
+		/**
+		 * Object exposing internal API to plugins
+		 * @public
+		 */
+		API.internal = {
+			'pdfEscape' : pdfEscape,
+			'getStyle' : getStyle,
+			/**
+			 * Returns {FontObject} describing a particular font.
+			 * @public
+			 * @function
+			 * @param fontName {String} (Optional) Font's family name
+			 * @param fontStyle {String} (Optional) Font's style variation name (Example:"Italic")
+			 * @returns {FontObject}
+			 */
+			'getFont' : function() {
+				return fonts[getFont.apply(API, arguments)];
+			},
+			'getFontSize' : function() {
+				return activeFontSize;
+			},
+			'getLineHeight' : function() {
+				return activeFontSize * lineHeightProportion;
+			},
+			'write' : function(string1 /*, string2, string3, etc */) {
+				out(arguments.length === 1 ? string1 : Array.prototype.join.call(arguments, ' '));
+			},
+			'getCoordinateString' : function(value) {
+				return f2(value * k);
+			},
+			'getVerticalCoordinateString' : function(value) {
+				return f2((pageHeight - value) * k);
+			},
+			'collections' : {},
+			'newObject' : newObject,
+			'putStream' : putStream,
+			'events' : events,
+			// ratio that you use in multiplication of a given "size" number to arrive to 'point'
+			// units of measurement.
+			// scaleFactor is set at initialization of the document and calculated against the stated
+			// default measurement units for the document.
+			// If default is "mm", k is the number that will turn number in 'mm' into 'points' number.
+			// through multiplication.
+			'scaleFactor' : k,
+			'pageSize' : {
+				get width() {
+					return pageWidth
+				},
+				get height() {
+					return pageHeight
+				}
+			},
+			'output' : function(type, options) {
+				return output(type, options);
+			},
+			'getNumberOfPages' : function() {
+				return pages.length - 1;
+			},
+			'pages' : pages
+		};
+
+		/**
+		 * Adds (and transfers the focus to) new page to the PDF document.
+		 * @function
+		 * @returns {jsPDF}
+		 *
+		 * @methodOf jsPDF#
+		 * @name addPage
+		 */
+		API.addPage = function() {
+			_addPage.apply(this, arguments);
+			return this;
+		};
+		API.setPage = function() {
+			_setPage.apply(this, arguments);
+			return this;
+		};
+		API.setDisplayMode = function(zoom, layout, pmode) {
+			zoomMode   = zoom;
+			layoutMode = layout;
+			pageMode   = pmode;
+			return this;
+		},
+
+		/**
+		 * Adds text to page. Supports adding multiline text when 'text' argument is an Array of Strings.
+		 *
+		 * @function
+		 * @param {String|Array} text String or array of strings to be added to the page. Each line is shifted one line down per font, spacing settings declared before this call.
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Object} flags Collection of settings signalling how the text must be encoded. Defaults are sane. If you think you want to pass some flags, you likely can read the source.
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name text
+		 */
+		API.text = function(text, x, y, flags, angle) {
+			/**
+			 * Inserts something like this into PDF
+			 *   BT
+			 *    /F1 16 Tf  % Font name + size
+			 *    16 TL % How many units down for next line in multiline text
+			 *    0 g % color
+			 *    28.35 813.54 Td % position
+			 *    (line one) Tj
+			 *    T* (line two) Tj
+			 *    T* (line three) Tj
+			 *   ET
+			 */
+			function ESC(s) {
+				s = s.split("\t").join(Array(options.TabLen||9).join(" "));
+				return pdfEscape(s, flags);
+			}
+
+			// Pre-August-2012 the order of arguments was function(x, y, text, flags)
+			// in effort to make all calls have similar signature like
+			//   function(data, coordinates... , miscellaneous)
+			// this method had its args flipped.
+			// code below allows backward compatibility with old arg order.
+			if (typeof text === 'number') {
+				tmp = y;
+				y = x;
+				x = text;
+				text = tmp;
+			}
+
+			// If there are any newlines in text, we assume
+			// the user wanted to print multiple lines, so break the
+			// text up into an array.  If the text is already an array,
+			// we assume the user knows what they are doing.
+			if (typeof text === 'string' && text.match(/[\n\r]/)) {
+				text = text.split(/\r\n|\r|\n/g);
+			}
+			if (typeof flags === 'number') {
+				angle = flags;
+				flags = null;
+			}
+			var xtra = '',mode = 'Td', todo;
+			if (angle) {
+				angle *= (Math.PI / 180);
+				var c = Math.cos(angle),
+				s = Math.sin(angle);
+				xtra = [f2(c), f2(s), f2(s * -1), f2(c), ''].join(" ");
+				mode = 'Tm';
+			}
+			flags = flags || {};
+			if (!('noBOM' in flags))
+				flags.noBOM = true;
+			if (!('autoencode' in flags))
+				flags.autoencode = true;
+
+			if (typeof text === 'string') {
+				text = ESC(text);
+			} else if (text instanceof Array) {
+				// we don't want to destroy  original text array, so cloning it
+				var sa = text.concat(), da = [], len = sa.length;
+				// we do array.join('text that must not be PDFescaped")
+				// thus, pdfEscape each component separately
+				while (len--) {
+					da.push(ESC(sa.shift()));
+				}
+				var linesLeft = Math.ceil((pageHeight - y) * k / (activeFontSize * lineHeightProportion));
+				if (0 <= linesLeft && linesLeft < da.length + 1) {
+					todo = da.splice(linesLeft-1);
+				}
+				text = da.join(") Tj\nT* (");
+			} else {
+				throw new Error('Type of text must be string or Array. "' + text + '" is not recognized.');
+			}
+			// Using "'" ("go next line and render text" mark) would save space but would complicate our rendering code, templates
+
+			// BT .. ET does NOT have default settings for Tf. You must state that explicitely every time for BT .. ET
+			// if you want text transformation matrix (+ multiline) to work reliably (which reads sizes of things from font declarations)
+			// Thus, there is NO useful, *reliable* concept of "default" font for a page.
+			// The fact that "default" (reuse font used before) font worked before in basic cases is an accident
+			// - readers dealing smartly with brokenness of jsPDF's markup.
+			out(
+				'BT\n/' +
+				activeFontKey + ' ' + activeFontSize + ' Tf\n' +     // font face, style, size
+				(activeFontSize * lineHeightProportion) + ' TL\n' +  // line spacing
+				textColor +
+				'\n' + xtra + f2(x * k) + ' ' + f2((pageHeight - y) * k) + ' ' + mode + '\n(' +
+				text +
+				') Tj\nET');
+
+			if (todo) {
+				this.addPage();
+				this.text( todo, x, activeFontSize * 1.7 / k);
+			}
+
+			return this;
+		};
+
+		API.lstext = function(text, x, y, spacing) {
+			for (var i = 0, len = text.length ; i < len; i++, x += spacing) this.text(text[i], x, y);
+		};
+
+		API.line = function(x1, y1, x2, y2) {
+			return this.lines([[x2 - x1, y2 - y1]], x1, y1);
+		};
+
+		API.clip = function() {
+			// By patrick-roberts, github.com/MrRio/jsPDF/issues/328
+			// Call .clip() after calling .rect() with a style argument of null
+			out('W') // clip
+			out('S') // stroke path; necessary for clip to work
+		};
+
+		/**
+		 * Adds series of curves (straight lines or cubic bezier curves) to canvas, starting at `x`, `y` coordinates.
+		 * All data points in `lines` are relative to last line origin.
+		 * `x`, `y` become x1,y1 for first line / curve in the set.
+		 * For lines you only need to specify [x2, y2] - (ending point) vector against x1, y1 starting point.
+		 * For bezier curves you need to specify [x2,y2,x3,y3,x4,y4] - vectors to control points 1, 2, ending point. All vectors are against the start of the curve - x1,y1.
+		 *
+		 * @example .lines([[2,2],[-2,2],[1,1,2,2,3,3],[2,1]], 212,110, 10) // line, line, bezier curve, line
+		 * @param {Array} lines Array of *vector* shifts as pairs (lines) or sextets (cubic bezier curves).
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} scale (Defaults to [1.0,1.0]) x,y Scaling factor for all vectors. Elements can be any floating number Sub-one makes drawing smaller. Over-one grows the drawing. Negative flips the direction.
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @param {Boolean} closed If true, the path is closed with a straight line from the end of the last curve to the starting point.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name lines
+		 */
+		API.lines = function(lines, x, y, scale, style, closed) {
+			var scalex,scaley,i,l,leg,x2,y2,x3,y3,x4,y4;
+
+			// Pre-August-2012 the order of arguments was function(x, y, lines, scale, style)
+			// in effort to make all calls have similar signature like
+			//   function(content, coordinateX, coordinateY , miscellaneous)
+			// this method had its args flipped.
+			// code below allows backward compatibility with old arg order.
+			if (typeof lines === 'number') {
+				tmp = y;
+				y = x;
+				x = lines;
+				lines = tmp;
+			}
+
+			scale = scale || [1, 1];
+
+			// starting point
+			out(f3(x * k) + ' ' + f3((pageHeight - y) * k) + ' m ');
+
+			scalex = scale[0];
+			scaley = scale[1];
+			l = lines.length;
+			//, x2, y2 // bezier only. In page default measurement "units", *after* scaling
+			//, x3, y3 // bezier only. In page default measurement "units", *after* scaling
+			// ending point for all, lines and bezier. . In page default measurement "units", *after* scaling
+			x4 = x; // last / ending point = starting point for first item.
+			y4 = y; // last / ending point = starting point for first item.
+
+			for (i = 0; i < l; i++) {
+				leg = lines[i];
+				if (leg.length === 2) {
+					// simple line
+					x4 = leg[0] * scalex + x4; // here last x4 was prior ending point
+					y4 = leg[1] * scaley + y4; // here last y4 was prior ending point
+					out(f3(x4 * k) + ' ' + f3((pageHeight - y4) * k) + ' l');
+				} else {
+					// bezier curve
+					x2 = leg[0] * scalex + x4; // here last x4 is prior ending point
+					y2 = leg[1] * scaley + y4; // here last y4 is prior ending point
+					x3 = leg[2] * scalex + x4; // here last x4 is prior ending point
+					y3 = leg[3] * scaley + y4; // here last y4 is prior ending point
+					x4 = leg[4] * scalex + x4; // here last x4 was prior ending point
+					y4 = leg[5] * scaley + y4; // here last y4 was prior ending point
+					out(
+						f3(x2 * k) + ' ' +
+						f3((pageHeight - y2) * k) + ' ' +
+						f3(x3 * k) + ' ' +
+						f3((pageHeight - y3) * k) + ' ' +
+						f3(x4 * k) + ' ' +
+						f3((pageHeight - y4) * k) + ' c');
+				}
+			}
+
+			if (closed) {
+				out(' h');
+			}
+
+			// stroking / filling / both the path
+			if (style !== null) {
+				out(getStyle(style));
+			}
+			return this;
+		};
+
+		/**
+		 * Adds a rectangle to PDF
+		 *
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} w Width (in units declared at inception of PDF document)
+		 * @param {Number} h Height (in units declared at inception of PDF document)
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name rect
+		 */
+		API.rect = function(x, y, w, h, style) {
+			var op = getStyle(style);
+			out([
+					f2(x * k),
+					f2((pageHeight - y) * k),
+					f2(w * k),
+					f2(-h * k),
+					're'
+				].join(' '));
+
+			if (style !== null) {
+				out(getStyle(style));
+			}
+
+			return this;
+		};
+
+		/**
+		 * Adds a triangle to PDF
+		 *
+		 * @param {Number} x1 Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y1 Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} x2 Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y2 Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} x3 Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y3 Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name triangle
+		 */
+		API.triangle = function(x1, y1, x2, y2, x3, y3, style) {
+			this.lines(
+				[
+					[x2 - x1, y2 - y1], // vector to point 2
+					[x3 - x2, y3 - y2], // vector to point 3
+					[x1 - x3, y1 - y3]// closing vector back to point 1
+				],
+				x1,
+				y1, // start of path
+				[1, 1],
+				style,
+				true);
+			return this;
+		};
+
+		/**
+		 * Adds a rectangle with rounded corners to PDF
+		 *
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} w Width (in units declared at inception of PDF document)
+		 * @param {Number} h Height (in units declared at inception of PDF document)
+		 * @param {Number} rx Radius along x axis (in units declared at inception of PDF document)
+		 * @param {Number} rx Radius along y axis (in units declared at inception of PDF document)
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name roundedRect
+		 */
+		API.roundedRect = function(x, y, w, h, rx, ry, style) {
+			var MyArc = 4 / 3 * (Math.SQRT2 - 1);
+			this.lines(
+				[
+					[(w - 2 * rx), 0],
+					[(rx * MyArc), 0, rx, ry - (ry * MyArc), rx, ry],
+					[0, (h - 2 * ry)],
+					[0, (ry * MyArc),  - (rx * MyArc), ry, -rx, ry],
+					[(-w + 2 * rx), 0],
+					[ - (rx * MyArc), 0, -rx,  - (ry * MyArc), -rx, -ry],
+					[0, (-h + 2 * ry)],
+					[0,  - (ry * MyArc), (rx * MyArc), -ry, rx, -ry]
+				],
+				x + rx,
+				y, // start of path
+				[1, 1],
+				style);
+			return this;
+		};
+
+		/**
+		 * Adds an ellipse to PDF
+		 *
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} rx Radius along x axis (in units declared at inception of PDF document)
+		 * @param {Number} rx Radius along y axis (in units declared at inception of PDF document)
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name ellipse
+		 */
+		API.ellipse = function(x, y, rx, ry, style) {
+			var lx = 4 / 3 * (Math.SQRT2 - 1) * rx,
+				ly = 4 / 3 * (Math.SQRT2 - 1) * ry;
+
+			out([
+					f2((x + rx) * k),
+					f2((pageHeight - y) * k),
+					'm',
+					f2((x + rx) * k),
+					f2((pageHeight - (y - ly)) * k),
+					f2((x + lx) * k),
+					f2((pageHeight - (y - ry)) * k),
+					f2(x * k),
+					f2((pageHeight - (y - ry)) * k),
+					'c'
+				].join(' '));
+			out([
+					f2((x - lx) * k),
+					f2((pageHeight - (y - ry)) * k),
+					f2((x - rx) * k),
+					f2((pageHeight - (y - ly)) * k),
+					f2((x - rx) * k),
+					f2((pageHeight - y) * k),
+					'c'
+				].join(' '));
+			out([
+					f2((x - rx) * k),
+					f2((pageHeight - (y + ly)) * k),
+					f2((x - lx) * k),
+					f2((pageHeight - (y + ry)) * k),
+					f2(x * k),
+					f2((pageHeight - (y + ry)) * k),
+					'c'
+				].join(' '));
+			out([
+					f2((x + lx) * k),
+					f2((pageHeight - (y + ry)) * k),
+					f2((x + rx) * k),
+					f2((pageHeight - (y + ly)) * k),
+					f2((x + rx) * k),
+					f2((pageHeight - y) * k),
+					'c'
+				].join(' '));
+
+			if (style !== null) {
+				out(getStyle(style));
+			}
+
+			return this;
+		};
+
+		/**
+		 * Adds an circle to PDF
+		 *
+		 * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page
+		 * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page
+		 * @param {Number} r Radius (in units declared at inception of PDF document)
+		 * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name circle
+		 */
+		API.circle = function(x, y, r, style) {
+			return this.ellipse(x, y, r, r, style);
+		};
+
+		/**
+		 * Adds a properties to the PDF document
+		 *
+		 * @param {Object} A property_name-to-property_value object structure.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setProperties
+		 */
+		API.setProperties = function(properties) {
+			// copying only those properties we can render.
+			for (var property in documentProperties) {
+				if (documentProperties.hasOwnProperty(property) && properties[property]) {
+					documentProperties[property] = properties[property];
+				}
+			}
+			return this;
+		};
+
+		/**
+		 * Sets font size for upcoming text elements.
+		 *
+		 * @param {Number} size Font size in points.
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setFontSize
+		 */
+		API.setFontSize = function(size) {
+			activeFontSize = size;
+			return this;
+		};
+
+		/**
+		 * Sets text font face, variant for upcoming text elements.
+		 * See output of jsPDF.getFontList() for possible font names, styles.
+		 *
+		 * @param {String} fontName Font name or family. Example: "times"
+		 * @param {String} fontStyle Font style or variant. Example: "italic"
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setFont
+		 */
+		API.setFont = function(fontName, fontStyle) {
+			activeFontKey = getFont(fontName, fontStyle);
+			// if font is not found, the above line blows up and we never go further
+			return this;
+		};
+
+		/**
+		 * Switches font style or variant for upcoming text elements,
+		 * while keeping the font face or family same.
+		 * See output of jsPDF.getFontList() for possible font names, styles.
+		 *
+		 * @param {String} style Font style or variant. Example: "italic"
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setFontStyle
+		 */
+		API.setFontStyle = API.setFontType = function(style) {
+			activeFontKey = getFont(undefined, style);
+			// if font is not found, the above line blows up and we never go further
+			return this;
+		};
+
+		/**
+		 * Returns an object - a tree of fontName to fontStyle relationships available to
+		 * active PDF document.
+		 *
+		 * @public
+		 * @function
+		 * @returns {Object} Like {'times':['normal', 'italic', ... ], 'arial':['normal', 'bold', ... ], ... }
+		 * @methodOf jsPDF#
+		 * @name getFontList
+		 */
+		API.getFontList = function() {
+			// TODO: iterate over fonts array or return copy of fontmap instead in case more are ever added.
+			var list = {},fontName,fontStyle,tmp;
+
+			for (fontName in fontmap) {
+				if (fontmap.hasOwnProperty(fontName)) {
+					list[fontName] = tmp = [];
+					for (fontStyle in fontmap[fontName]) {
+						if (fontmap[fontName].hasOwnProperty(fontStyle)) {
+							tmp.push(fontStyle);
+						}
+					}
+				}
+			}
+
+			return list;
+		};
+
+		/**
+		 * Sets line width for upcoming lines.
+		 *
+		 * @param {Number} width Line width (in units declared at inception of PDF document)
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setLineWidth
+		 */
+		API.setLineWidth = function(width) {
+			out((width * k).toFixed(2) + ' w');
+			return this;
+		};
+
+		/**
+		 * Sets the stroke color for upcoming elements.
+		 *
+		 * Depending on the number of arguments given, Gray, RGB, or CMYK
+		 * color space is implied.
+		 *
+		 * When only ch1 is given, "Gray" color space is implied and it
+		 * must be a value in the range from 0.00 (solid black) to to 1.00 (white)
+		 * if values are communicated as String types, or in range from 0 (black)
+		 * to 255 (white) if communicated as Number type.
+		 * The RGB-like 0-255 range is provided for backward compatibility.
+		 *
+		 * When only ch1,ch2,ch3 are given, "RGB" color space is implied and each
+		 * value must be in the range from 0.00 (minimum intensity) to to 1.00
+		 * (max intensity) if values are communicated as String types, or
+		 * from 0 (min intensity) to to 255 (max intensity) if values are communicated
+		 * as Number types.
+		 * The RGB-like 0-255 range is provided for backward compatibility.
+		 *
+		 * When ch1,ch2,ch3,ch4 are given, "CMYK" color space is implied and each
+		 * value must be a in the range from 0.00 (0% concentration) to to
+		 * 1.00 (100% concentration)
+		 *
+		 * Because JavaScript treats fixed point numbers badly (rounds to
+		 * floating point nearest to binary representation) it is highly advised to
+		 * communicate the fractional numbers as String types, not JavaScript Number type.
+		 *
+		 * @param {Number|String} ch1 Color channel value
+		 * @param {Number|String} ch2 Color channel value
+		 * @param {Number|String} ch3 Color channel value
+		 * @param {Number|String} ch4 Color channel value
+		 *
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setDrawColor
+		 */
+		API.setDrawColor = function(ch1, ch2, ch3, ch4) {
+			var color;
+			if (ch2 === undefined || (ch4 === undefined && ch1 === ch2 === ch3)) {
+				// Gray color space.
+				if (typeof ch1 === 'string') {
+					color = ch1 + ' G';
+				} else {
+					color = f2(ch1 / 255) + ' G';
+				}
+			} else if (ch4 === undefined) {
+				// RGB
+				if (typeof ch1 === 'string') {
+					color = [ch1, ch2, ch3, 'RG'].join(' ');
+				} else {
+					color = [f2(ch1 / 255), f2(ch2 / 255), f2(ch3 / 255), 'RG'].join(' ');
+				}
+			} else {
+				// CMYK
+				if (typeof ch1 === 'string') {
+					color = [ch1, ch2, ch3, ch4, 'K'].join(' ');
+				} else {
+					color = [f2(ch1), f2(ch2), f2(ch3), f2(ch4), 'K'].join(' ');
+				}
+			}
+
+			out(color);
+			return this;
+		};
+
+		/**
+		 * Sets the fill color for upcoming elements.
+		 *
+		 * Depending on the number of arguments given, Gray, RGB, or CMYK
+		 * color space is implied.
+		 *
+		 * When only ch1 is given, "Gray" color space is implied and it
+		 * must be a value in the range from 0.00 (solid black) to to 1.00 (white)
+		 * if values are communicated as String types, or in range from 0 (black)
+		 * to 255 (white) if communicated as Number type.
+		 * The RGB-like 0-255 range is provided for backward compatibility.
+		 *
+		 * When only ch1,ch2,ch3 are given, "RGB" color space is implied and each
+		 * value must be in the range from 0.00 (minimum intensity) to to 1.00
+		 * (max intensity) if values are communicated as String types, or
+		 * from 0 (min intensity) to to 255 (max intensity) if values are communicated
+		 * as Number types.
+		 * The RGB-like 0-255 range is provided for backward compatibility.
+		 *
+		 * When ch1,ch2,ch3,ch4 are given, "CMYK" color space is implied and each
+		 * value must be a in the range from 0.00 (0% concentration) to to
+		 * 1.00 (100% concentration)
+		 *
+		 * Because JavaScript treats fixed point numbers badly (rounds to
+		 * floating point nearest to binary representation) it is highly advised to
+		 * communicate the fractional numbers as String types, not JavaScript Number type.
+		 *
+		 * @param {Number|String} ch1 Color channel value
+		 * @param {Number|String} ch2 Color channel value
+		 * @param {Number|String} ch3 Color channel value
+		 * @param {Number|String} ch4 Color channel value
+		 *
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setFillColor
+		 */
+		API.setFillColor = function(ch1, ch2, ch3, ch4) {
+			var color;
+
+			if (ch2 === undefined || (ch4 === undefined && ch1 === ch2 === ch3)) {
+				// Gray color space.
+				if (typeof ch1 === 'string') {
+					color = ch1 + ' g';
+				} else {
+					color = f2(ch1 / 255) + ' g';
+				}
+			} else if (ch4 === undefined) {
+				// RGB
+				if (typeof ch1 === 'string') {
+					color = [ch1, ch2, ch3, 'rg'].join(' ');
+				} else {
+					color = [f2(ch1 / 255), f2(ch2 / 255), f2(ch3 / 255), 'rg'].join(' ');
+				}
+			} else {
+				// CMYK
+				if (typeof ch1 === 'string') {
+					color = [ch1, ch2, ch3, ch4, 'k'].join(' ');
+				} else {
+					color = [f2(ch1), f2(ch2), f2(ch3), f2(ch4), 'k'].join(' ');
+				}
+			}
+
+			out(color);
+			return this;
+		};
+
+		/**
+		 * Sets the text color for upcoming elements.
+		 * If only one, first argument is given,
+		 * treats the value as gray-scale color value.
+		 *
+		 * @param {Number} r Red channel color value in range 0-255 or {String} r color value in hexadecimal, example: '#FFFFFF'
+		 * @param {Number} g Green channel color value in range 0-255
+		 * @param {Number} b Blue channel color value in range 0-255
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setTextColor
+		 */
+		API.setTextColor = function(r, g, b) {
+			if ((typeof r === 'string') && /^#[0-9A-Fa-f]{6}$/.test(r)) {
+				var hex = parseInt(r.substr(1), 16);
+				r = (hex >> 16) & 255;
+				g = (hex >> 8) & 255;
+				b = (hex & 255);
+			}
+
+			if ((r === 0 && g === 0 && b === 0) || (typeof g === 'undefined')) {
+				textColor = f3(r / 255) + ' g';
+			} else {
+				textColor = [f3(r / 255), f3(g / 255), f3(b / 255), 'rg'].join(' ');
+			}
+			return this;
+		};
+
+		/**
+		 * Is an Object providing a mapping from human-readable to
+		 * integer flag values designating the varieties of line cap
+		 * and join styles.
+		 *
+		 * @returns {Object}
+		 * @fieldOf jsPDF#
+		 * @name CapJoinStyles
+		 */
+		API.CapJoinStyles = {
+			0 : 0,
+			'butt' : 0,
+			'but' : 0,
+			'miter' : 0,
+			1 : 1,
+			'round' : 1,
+			'rounded' : 1,
+			'circle' : 1,
+			2 : 2,
+			'projecting' : 2,
+			'project' : 2,
+			'square' : 2,
+			'bevel' : 2
+		};
+
+		/**
+		 * Sets the line cap styles
+		 * See {jsPDF.CapJoinStyles} for variants
+		 *
+		 * @param {String|Number} style A string or number identifying the type of line cap
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setLineCap
+		 */
+		API.setLineCap = function(style) {
+			var id = this.CapJoinStyles[style];
+			if (id === undefined) {
+				throw new Error("Line cap style of '" + style + "' is not recognized. See or extend .CapJoinStyles property for valid styles");
+			}
+			lineCapID = id;
+			out(id + ' J');
+
+			return this;
+		};
+
+		/**
+		 * Sets the line join styles
+		 * See {jsPDF.CapJoinStyles} for variants
+		 *
+		 * @param {String|Number} style A string or number identifying the type of line join
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name setLineJoin
+		 */
+		API.setLineJoin = function(style) {
+			var id = this.CapJoinStyles[style];
+			if (id === undefined) {
+				throw new Error("Line join style of '" + style + "' is not recognized. See or extend .CapJoinStyles property for valid styles");
+			}
+			lineJoinID = id;
+			out(id + ' j');
+
+			return this;
+		};
+
+		// Output is both an internal (for plugins) and external function
+		API.output = output;
+
+		/**
+		 * Saves as PDF document. An alias of jsPDF.output('save', 'filename.pdf')
+		 * @param  {String} filename The filename including extension.
+		 *
+		 * @function
+		 * @returns {jsPDF}
+		 * @methodOf jsPDF#
+		 * @name save
+		 */
+		API.save = function(filename) {
+			API.output('save', filename);
+		};
+
+		// applying plugins (more methods) ON TOP of built-in API.
+		// this is intentional as we allow plugins to override
+		// built-ins
+		for (var plugin in jsPDF.API) {
+			if (jsPDF.API.hasOwnProperty(plugin)) {
+				if (plugin === 'events' && jsPDF.API.events.length) {
+					(function(events, newEvents) {
+
+						// jsPDF.API.events is a JS Array of Arrays
+						// where each Array is a pair of event name, handler
+						// Events were added by plugins to the jsPDF instantiator.
+						// These are always added to the new instance and some ran
+						// during instantiation.
+						var eventname,handler_and_args,i;
+
+						for (i = newEvents.length - 1; i !== -1; i--) {
+							// subscribe takes 3 args: 'topic', function, runonce_flag
+							// if undefined, runonce is false.
+							// users can attach callback directly,
+							// or they can attach an array with [callback, runonce_flag]
+							// that's what the "apply" magic is for below.
+							eventname = newEvents[i][0];
+							handler_and_args = newEvents[i][1];
+							events.subscribe.apply(
+								events,
+								[eventname].concat(
+									typeof handler_and_args === 'function' ?
+										[handler_and_args] : handler_and_args));
+						}
+					}(events, jsPDF.API.events));
+				} else {
+					API[plugin] = jsPDF.API[plugin];
+				}
+			}
+		}
+
+		//////////////////////////////////////////////////////
+		// continuing initialization of jsPDF Document object
+		//////////////////////////////////////////////////////
+		// Add the first page automatically
+		addFonts();
+		activeFontKey = 'F1';
+		_addPage(format, orientation);
+
+		events.publish('initialized');
+		return API;
+	}
+
+	/**
+	 * jsPDF.API is a STATIC property of jsPDF class.
+	 * jsPDF.API is an object you can add methods and properties to.
+	 * The methods / properties you add will show up in new jsPDF objects.
+	 *
+	 * One property is prepopulated. It is the 'events' Object. Plugin authors can add topics,
+	 * callbacks to this object. These will be reassigned to all new instances of jsPDF.
+	 * Examples:
+	 * jsPDF.API.events['initialized'] = function(){ 'this' is API object }
+	 * jsPDF.API.events['addFont'] = function(added_font_object){ 'this' is API object }
+	 *
+	 * @static
+	 * @public
+	 * @memberOf jsPDF
+	 * @name API
+	 *
+	 * @example
+	 * jsPDF.API.mymethod = function(){
+	 *   // 'this' will be ref to internal API object. see jsPDF source
+	 *   // , so you can refer to built-in methods like so:
+	 *   //     this.line(....)
+	 *   //     this.text(....)
+	 * }
+	 * var pdfdoc = new jsPDF()
+	 * pdfdoc.mymethod() // <- !!!!!!
+	 */
+	jsPDF.API = {events:[]};
+	jsPDF.version = "1.0.272-debug 2014-09-29T15:09:diegocr";
+
+	if (typeof define === 'function' && define.amd) {
+		define('jsPDF', function() {
+			return jsPDF;
+		});
+	} else {
+		global.jsPDF = jsPDF;
+	}
+	return jsPDF;
+}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this));
+/**
+ * jsPDF addHTML PlugIn
+ * Copyright (c) 2014 Diego Casorran
+ *
+ * Licensed under the MIT License.
+ * http://opensource.org/licenses/mit-license
+ */
+
+(function (jsPDFAPI) {
+	'use strict';
+
+	/**
+	 * Renders an HTML element to canvas object which added as an image to the PDF
+	 *
+	 * This PlugIn requires html2canvas: https://github.com/niklasvh/html2canvas
+	 *            OR rasterizeHTML: https://github.com/cburgmer/rasterizeHTML.js
+	 *
+	 * @public
+	 * @function
+	 * @param element {Mixed} HTML Element, or anything supported by html2canvas.
+	 * @param x {Number} starting X coordinate in jsPDF instance's declared units.
+	 * @param y {Number} starting Y coordinate in jsPDF instance's declared units.
+	 * @param options {Object} Additional options, check the code below.
+	 * @param callback {Function} to call when the rendering has finished.
+	 *
+	 * NOTE: Every parameter is optional except 'element' and 'callback', in such
+	 *       case the image is positioned at 0x0 covering the whole PDF document
+	 *       size. Ie, to easily take screenshoots of webpages saving them to PDF.
+	 */
+	jsPDFAPI.addHTML = function (element, x, y, options, callback) {
+		'use strict';
+
+		if(typeof html2canvas === 'undefined' && typeof rasterizeHTML === 'undefined')
+			throw new Error('You need either '
+				+'https://github.com/niklasvh/html2canvas'
+				+' or https://github.com/cburgmer/rasterizeHTML.js');
+
+		if(typeof x !== 'number') {
+			options = x;
+			callback = y;
+		}
+
+		if(typeof options === 'function') {
+			callback = options;
+			options = null;
+		}
+
+		var I = this.internal, K = I.scaleFactor, W = I.pageSize.width, H = I.pageSize.height;
+
+		options = options || {};
+		options.onrendered = function(obj) {
+			
+			K = 1 / 0.2645833;	
+
+			x = parseInt(x) || 0;
+			y = parseInt(y) || 0;
+			var dim = options.dim || {};
+			var h = dim.h || 0;
+			var w = dim.w || Math.min(W,obj.width/K) - x;
+			
+			var format = 'JPEG';
+			if(options.format)
+				format = options.format;
+
+			if(obj.height > H*K+1 && options.pagesplit) {
+				var crop = function() {
+					var cy = 0;
+					while(1) {
+						var canvas = document.createElement('canvas');
+						canvas.width = Math.min(W*K,obj.width);
+						canvas.height = Math.min((H-10)*K,obj.height-cy);
+						var ctx = canvas.getContext('2d');
+						ctx.drawImage(obj,0,cy,obj.width,canvas.height,0,0,canvas.width,canvas.height);
+						var args = [canvas, x,cy?10:y,canvas.width/K,canvas.height/K, format,null,'SLOW'];
+						this.addImage.apply(this, args);
+						cy += canvas.height;
+						if(cy >= obj.height) break;
+						this.addPage();
+					}
+					callback(w,cy,null,args);
+				}.bind(this);
+				if(obj.nodeName === 'CANVAS') {
+					var img = new Image();
+					img.onload = crop;
+					img.src = obj.toDataURL("image/png");
+					obj = img;
+				} else {
+					crop();
+				}
+			} else {
+				var alias = Math.random().toString(35);
+				var args = [obj, x,y,w,h, format,alias,'SLOW'];
+				this.addImage.apply(this, args);
+				callback(w,h,alias,args);
+			}
+		}.bind(this);
+
+		if(typeof html2canvas !== 'undefined' && !options.rstz) {
+			return html2canvas(element, options);
+		}
+
+		if(typeof rasterizeHTML !== 'undefined') {
+			var meth = 'drawDocument';
+			if(typeof element === 'string') {
+				meth = /^http/.test(element) ? 'drawURL' : 'drawHTML';
+			}
+			options.width = options.width || (W*K);
+			return rasterizeHTML[meth](element, void 0, options).then(function(r) {
+				options.onrendered(r.image);
+			}, function(e) {
+				callback(null,e);
+			});
+		}
+
+		return null;
+	};
+})(jsPDF.API);
+/** @preserve
+ * jsPDF addImage plugin
+ * Copyright (c) 2012 Jason Siefken, https://github.com/siefkenj/
+ *               2013 Chris Dowling, https://github.com/gingerchris
+ *               2013 Trinh Ho, https://github.com/ineedfat
+ *               2013 Edwin Alejandro Perez, https://github.com/eaparango
+ *               2013 Norah Smith, https://github.com/burnburnrocket
+ *               2014 Diego Casorran, https://github.com/diegocr
+ *               2014 James Robb, https://github.com/jamesbrobb
+ *
+ * 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.
+ */
+
+;(function(jsPDFAPI) {
+	'use strict'
+
+	var namespace = 'addImage_',
+		supported_image_types = ['jpeg', 'jpg', 'png'];
+
+	// Image functionality ported from pdf.js
+	var putImage = function(img) {
+
+		var objectNumber = this.internal.newObject()
+		, out = this.internal.write
+		, putStream = this.internal.putStream
+
+		img['n'] = objectNumber
+
+		out('<</Type /XObject')
+		out('/Subtype /Image')
+		out('/Width ' + img['w'])
+		out('/Height ' + img['h'])
+		if (img['cs'] === this.color_spaces.INDEXED) {
+			out('/ColorSpace [/Indexed /DeviceRGB '
+					// if an indexed png defines more than one colour with transparency, we've created a smask
+					+ (img['pal'].length / 3 - 1) + ' ' + ('smask' in img ? objectNumber + 2 : objectNumber + 1)
+					+ ' 0 R]');
+		} else {
+			out('/ColorSpace /' + img['cs']);
+			if (img['cs'] === this.color_spaces.DEVICE_CMYK) {
+				out('/Decode [1 0 1 0 1 0 1 0]');
+			}
+		}
+		out('/BitsPerComponent ' + img['bpc']);
+		if ('f' in img) {
+			out('/Filter /' + img['f']);
+		}
+		if ('dp' in img) {
+			out('/DecodeParms <<' + img['dp'] + '>>');
+		}
+		if ('trns' in img && img['trns'].constructor == Array) {
+			var trns = '',
+				i = 0,
+				len = img['trns'].length;
+			for (; i < len; i++)
+				trns += (img['trns'][i] + ' ' + img['trns'][i] + ' ');
+			out('/Mask [' + trns + ']');
+		}
+		if ('smask' in img) {
+			out('/SMask ' + (objectNumber + 1) + ' 0 R');
+		}
+		out('/Length ' + img['data'].length + '>>');
+
+		putStream(img['data']);
+
+		out('endobj');
+
+		// Soft mask
+		if ('smask' in img) {
+			var dp = '/Predictor 15 /Colors 1 /BitsPerComponent ' + img['bpc'] + ' /Columns ' + img['w'];
+			var smask = {'w': img['w'], 'h': img['h'], 'cs': 'DeviceGray', 'bpc': img['bpc'], 'dp': dp, 'data': img['smask']};
+			if ('f' in img)
+				smask.f = img['f'];
+			putImage.call(this, smask);
+		}
+
+	    //Palette
+		if (img['cs'] === this.color_spaces.INDEXED) {
+
+			this.internal.newObject();
+			//out('<< /Filter / ' + img['f'] +' /Length ' + img['pal'].length + '>>');
+			//putStream(zlib.compress(img['pal']));
+			out('<< /Length ' + img['pal'].length + '>>');
+			putStream(this.arrayBufferToBinaryString(new Uint8Array(img['pal'])));
+			out('endobj');
+		}
+	}
+	, putResourcesCallback = function() {
+		var images = this.internal.collections[namespace + 'images']
+		for ( var i in images ) {
+			putImage.call(this, images[i])
+		}
+	}
+	, putXObjectsDictCallback = function(){
+		var images = this.internal.collections[namespace + 'images']
+		, out = this.internal.write
+		, image
+		for (var i in images) {
+			image = images[i]
+			out(
+				'/I' + image['i']
+				, image['n']
+				, '0'
+				, 'R'
+			)
+		}
+	}
+	, checkCompressValue = function(value) {
+		if(value && typeof value === 'string')
+			value = value.toUpperCase();
+		return value in jsPDFAPI.image_compression ? value : jsPDFAPI.image_compression.NONE;
+	}
+	, getImages = function() {
+		var images = this.internal.collections[namespace + 'images'];
+		//first run, so initialise stuff
+		if(!images) {
+			this.internal.collections[namespace + 'images'] = images = {};
+			this.internal.events.subscribe('putResources', putResourcesCallback);
+			this.internal.events.subscribe('putXobjectDict', putXObjectsDictCallback);
+		}
+
+		return images;
+	}
+	, getImageIndex = function(images) {
+		var imageIndex = 0;
+
+		if (images){
+			// this is NOT the first time this method is ran on this instance of jsPDF object.
+			imageIndex = Object.keys ?
+			Object.keys(images).length :
+			(function(o){
+				var i = 0
+				for (var e in o){if(o.hasOwnProperty(e)){ i++ }}
+				return i
+			})(images)
+		}
+
+		return imageIndex;
+	}
+	, notDefined = function(value) {
+		return typeof value === 'undefined' || value === null;
+	}
+	, generateAliasFromData = function(data) {
+		return typeof data === 'string' && jsPDFAPI.sHashCode(data);
+	}
+	, doesNotSupportImageType = function(type) {
+		return supported_image_types.indexOf(type) === -1;
+	}
+	, processMethodNotEnabled = function(type) {
+		return typeof jsPDFAPI['process' + type.toUpperCase()] !== 'function';
+	}
+	, isDOMElement = function(object) {
+		return typeof object === 'object' && object.nodeType === 1;
+	}
+	, createDataURIFromElement = function(element, format, angle) {
+
+		//if element is an image which uses data url defintion, just return the dataurl
+		if (element.nodeName === 'IMG' && element.hasAttribute('src')) {
+			var src = ''+element.getAttribute('src');
+			if (!angle && src.indexOf('data:image/') === 0) return src;
+
+			// only if the user doesn't care about a format
+			if (!format && /\.png(?:[?#].*)?$/i.test(src)) format = 'png';
+		}
+
+		if(element.nodeName === 'CANVAS') {
+			var canvas = element;
+		} else {
+			var canvas = document.createElement('canvas');
+			canvas.width = element.clientWidth || element.width;
+			canvas.height = element.clientHeight || element.height;
+
+			var ctx = canvas.getContext('2d');
+			if (!ctx) {
+				throw ('addImage requires canvas to be supported by browser.');
+			}
+			if (angle) {
+				var x, y, b, c, s, w, h, to_radians = Math.PI/180, angleInRadians;
+
+				if (typeof angle === 'object') {
+					x = angle.x;
+					y = angle.y;
+					b = angle.bg;
+					angle = angle.angle;
+				}
+				angleInRadians = angle*to_radians;
+				c = Math.abs(Math.cos(angleInRadians));
+				s = Math.abs(Math.sin(angleInRadians));
+				w = canvas.width;
+				h = canvas.height;
+				canvas.width = h * s + w * c;
+				canvas.height = h * c + w * s;
+
+				if (isNaN(x)) x = canvas.width / 2;
+				if (isNaN(y)) y = canvas.height / 2;
+
+				ctx.clearRect(0,0,canvas.width, canvas.height);
+				ctx.fillStyle = b || 'white';
+				ctx.fillRect(0, 0, canvas.width, canvas.height);
+				ctx.save();
+				ctx.translate(x, y);
+				ctx.rotate(angleInRadians);
+				ctx.drawImage(element, -(w/2), -(h/2));
+				ctx.rotate(-angleInRadians);
+				ctx.translate(-x, -y);
+				ctx.restore();
+			} else {
+				ctx.drawImage(element, 0, 0, canvas.width, canvas.height);
+			}
+		}
+		return canvas.toDataURL((''+format).toLowerCase() == 'png' ? 'image/png' : 'image/jpeg');
+	}
+	,checkImagesForAlias = function(alias, images) {
+		var cached_info;
+		if(images) {
+			for(var e in images) {
+				if(alias === images[e].alias) {
+					cached_info = images[e];
+					break;
+				}
+			}
+		}
+		return cached_info;
+	}
+	,determineWidthAndHeight = function(w, h, info) {
+		if (!w && !h) {
+			w = -96;
+			h = -96;
+		}
+		if (w < 0) {
+			w = (-1) * info['w'] * 72 / w / this.internal.scaleFactor;
+		}
+		if (h < 0) {
+			h = (-1) * info['h'] * 72 / h / this.internal.scaleFactor;
+		}
+		if (w === 0) {
+			w = h * info['w'] / info['h'];
+		}
+		if (h === 0) {
+			h = w * info['h'] / info['w'];
+		}
+
+		return [w, h];
+	}
+	, writeImageToPDF = function(x, y, w, h, info, index, images) {
+		var dims = determineWidthAndHeight.call(this, w, h, info),
+			coord = this.internal.getCoordinateString,
+			vcoord = this.internal.getVerticalCoordinateString;
+
+		w = dims[0];
+		h = dims[1];
+
+		images[index] = info;
+
+		this.internal.write(
+			'q'
+			, coord(w)
+			, '0 0'
+			, coord(h) // TODO: check if this should be shifted by vcoord
+			, coord(x)
+			, vcoord(y + h)
+			, 'cm /I'+info['i']
+			, 'Do Q'
+		)
+	};
+
+	/**
+	 * COLOR SPACES
+	 */
+	jsPDFAPI.color_spaces = {
+		DEVICE_RGB:'DeviceRGB',
+		DEVICE_GRAY:'DeviceGray',
+		DEVICE_CMYK:'DeviceCMYK',
+		CAL_GREY:'CalGray',
+		CAL_RGB:'CalRGB',
+		LAB:'Lab',
+		ICC_BASED:'ICCBased',
+		INDEXED:'Indexed',
+		PATTERN:'Pattern',
+		SEPERATION:'Seperation',
+		DEVICE_N:'DeviceN'
+	};
+
+	/**
+	 * DECODE METHODS
+	 */
+	jsPDFAPI.decode = {
+		DCT_DECODE:'DCTDecode',
+		FLATE_DECODE:'FlateDecode',
+		LZW_DECODE:'LZWDecode',
+		JPX_DECODE:'JPXDecode',
+		JBIG2_DECODE:'JBIG2Decode',
+		ASCII85_DECODE:'ASCII85Decode',
+		ASCII_HEX_DECODE:'ASCIIHexDecode',
+		RUN_LENGTH_DECODE:'RunLengthDecode',
+		CCITT_FAX_DECODE:'CCITTFaxDecode'
+	};
+
+	/**
+	 * IMAGE COMPRESSION TYPES
+	 */
+	jsPDFAPI.image_compression = {
+		NONE: 'NONE',
+		FAST: 'FAST',
+		MEDIUM: 'MEDIUM',
+		SLOW: 'SLOW'
+	};
+
+	jsPDFAPI.sHashCode = function(str) {
+		return Array.prototype.reduce && str.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);
+	};
+
+	jsPDFAPI.isString = function(object) {
+		return typeof object === 'string';
+	};
+
+	/**
+	 * Strips out and returns info from a valid base64 data URI
+	 * @param {String[dataURI]} a valid data URI of format 'data:[<MIME-type>][;base64],<data>'
+	 * @returns an Array containing the following
+	 * [0] the complete data URI
+	 * [1] <MIME-type>
+	 * [2] format - the second part of the mime-type i.e 'png' in 'image/png'
+	 * [4] <data>
+	 */
+	jsPDFAPI.extractInfoFromBase64DataURI = function(dataURI) {
+		return /^data:([\w]+?\/([\w]+?));base64,(.+?)$/g.exec(dataURI);
+	};
+
+	/**
+	 * Check to see if ArrayBuffer is supported
+	 */
+	jsPDFAPI.supportsArrayBuffer = function() {
+		return typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined';
+	};
+
+	/**
+	 * Tests supplied object to determine if ArrayBuffer
+	 * @param {Object[object]}
+	 */
+	jsPDFAPI.isArrayBuffer = function(object) {
+		if(!this.supportsArrayBuffer())
+	        return false;
+		return object instanceof ArrayBuffer;
+	};
+
+	/**
+	 * Tests supplied object to determine if it implements the ArrayBufferView (TypedArray) interface
+	 * @param {Object[object]}
+	 */
+	jsPDFAPI.isArrayBufferView = function(object) {
+		if(!this.supportsArrayBuffer())
+	        return false;
+		if(typeof Uint32Array === 'undefined')
+			return false;
+		return (object instanceof Int8Array ||
+				object instanceof Uint8Array ||
+				(typeof Uint8ClampedArray !== 'undefined' && object instanceof Uint8ClampedArray) ||
+				object instanceof Int16Array ||
+				object instanceof Uint16Array ||
+				object instanceof Int32Array ||
+				object instanceof Uint32Array ||
+				object instanceof Float32Array ||
+				object instanceof Float64Array );
+	};
+
+	/**
+	 * Exactly what it says on the tin
+	 */
+	jsPDFAPI.binaryStringToUint8Array = function(binary_string) {
+		/*
+		 * not sure how efficient this will be will bigger files. Is there a native method?
+		 */
+		var len = binary_string.length;
+	    var bytes = new Uint8Array( len );
+	    for (var i = 0; i < len; i++) {
+	        bytes[i] = binary_string.charCodeAt(i);
+	    }
+	    return bytes;
+	};
+
+	/**
+	 * @see this discussion
+	 * http://stackoverflow.com/questions/6965107/converting-between-strings-and-arraybuffers
+	 *
+	 * As stated, i imagine the method below is highly inefficent for large files.
+	 *
+	 * Also of note from Mozilla,
+	 *
+	 * "However, this is slow and error-prone, due to the need for multiple conversions (especially if the binary data is not actually byte-format data, but, for example, 32-bit integers or floats)."
+	 *
+	 * https://developer.mozilla.org/en-US/Add-ons/Code_snippets/StringView
+	 *
+	 * Although i'm strugglig to see how StringView solves this issue? Doesn't appear to be a direct method for conversion?
+	 *
+	 * Async method using Blob and FileReader could be best, but i'm not sure how to fit it into the flow?
+	 */
+	jsPDFAPI.arrayBufferToBinaryString = function(buffer) {
+		if(this.isArrayBuffer(buffer))
+			buffer = new Uint8Array(buffer);
+
+	    var binary_string = '';
+	    var len = buffer.byteLength;
+	    for (var i = 0; i < len; i++) {
+	        binary_string += String.fromCharCode(buffer[i]);
+	    }
+	    return binary_string;
+	    /*
+	     * Another solution is the method below - convert array buffer straight to base64 and then use atob
+	     */
+		//return atob(this.arrayBufferToBase64(buffer));
+	};
+
+	/**
+	 * Converts an ArrayBuffer directly to base64
+	 *
+	 * Taken from here
+	 *
+	 * http://jsperf.com/encoding-xhr-image-data/31
+	 *
+	 * Need to test if this is a better solution for larger files
+	 *
+	 */
+	jsPDFAPI.arrayBufferToBase64 = function(arrayBuffer) {
+		var base64    = ''
+		var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+
+		var bytes         = new Uint8Array(arrayBuffer)
+		var byteLength    = bytes.byteLength
+		var byteRemainder = byteLength % 3
+		var mainLength    = byteLength - byteRemainder
+
+		var a, b, c, d
+		var chunk
+
+		// Main loop deals with bytes in chunks of 3
+		for (var i = 0; i < mainLength; i = i + 3) {
+			// Combine the three bytes into a single integer
+			chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]
+
+			// Use bitmasks to extract 6-bit segments from the triplet
+			a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18
+			b = (chunk & 258048)   >> 12 // 258048   = (2^6 - 1) << 12
+			c = (chunk & 4032)     >>  6 // 4032     = (2^6 - 1) << 6
+			d = chunk & 63               // 63       = 2^6 - 1
+
+			// Convert the raw binary segments to the appropriate ASCII encoding
+			base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]
+		}
+
+		// Deal with the remaining bytes and padding
+		if (byteRemainder == 1) {
+			chunk = bytes[mainLength]
+
+			a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2
+
+			// Set the 4 least significant bits to zero
+			b = (chunk & 3)   << 4 // 3   = 2^2 - 1
+
+			base64 += encodings[a] + encodings[b] + '=='
+		} else if (byteRemainder == 2) {
+			chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]
+
+			a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10
+			b = (chunk & 1008)  >>  4 // 1008  = (2^6 - 1) << 4
+
+			// Set the 2 least significant bits to zero
+			c = (chunk & 15)    <<  2 // 15    = 2^4 - 1
+
+			base64 += encodings[a] + encodings[b] + encodings[c] + '='
+		}
+
+		return base64
+	};
+
+	jsPDFAPI.createImageInfo = function(data, wd, ht, cs, bpc, f, imageIndex, alias, dp, trns, pal, smask) {
+		var info = {
+				alias:alias,
+				w : wd,
+				h : ht,
+				cs : cs,
+				bpc : bpc,
+				i : imageIndex,
+				data : data
+				// n: objectNumber will be added by putImage code
+			};
+
+		if(f) info.f = f;
+		if(dp) info.dp = dp;
+		if(trns) info.trns = trns;
+		if(pal) info.pal = pal;
+		if(smask) info.smask = smask;
+
+		return info;
+	};
+
+	jsPDFAPI.addImage = function(imageData, format, x, y, w, h, alias, compression, rotation) {
+		'use strict'
+
+		if(typeof format !== 'string') {
+			var tmp = h;
+			h = w;
+			w = y;
+			y = x;
+			x = format;
+			format = tmp;
+		}
+
+		if (typeof imageData === 'object' && !isDOMElement(imageData) && "imageData" in imageData) {
+			var options = imageData;
+
+			imageData = options.imageData;
+			format = options.format || format;
+			x = options.x || x || 0;
+			y = options.y || y || 0;
+			w = options.w || w;
+			h = options.h || h;
+			alias = options.alias || alias;
+			compression = options.compression || compression;
+			rotation = options.rotation || options.angle || rotation;
+		}
+
+		if (isNaN(x) || isNaN(y))
+		{
+			console.error('jsPDF.addImage: Invalid coordinates', arguments);
+			throw new Error('Invalid coordinates passed to jsPDF.addImage');
+		}
+
+		var images = getImages.call(this), info;
+
+		if (!(info = checkImagesForAlias(imageData, images))) {
+			var dataAsBinaryString;
+
+			if(isDOMElement(imageData))
+				imageData = createDataURIFromElement(imageData, format, rotation);
+
+			if(notDefined(alias))
+				alias = generateAliasFromData(imageData);
+
+			if (!(info = checkImagesForAlias(alias, images))) {
+
+				if(this.isString(imageData)) {
+
+					var base64Info = this.extractInfoFromBase64DataURI(imageData);
+
+					if(base64Info) {
+
+						format = base64Info[2];
+						imageData = atob(base64Info[3]);//convert to binary string
+
+					} else {
+
+						if (imageData.charCodeAt(0) === 0x89 &&
+							imageData.charCodeAt(1) === 0x50 &&
+							imageData.charCodeAt(2) === 0x4e &&
+							imageData.charCodeAt(3) === 0x47  )  format = 'png';
+					}
+				}
+				format = (format || 'JPEG').toLowerCase();
+
+				if(doesNotSupportImageType(format))
+					throw new Error('addImage currently only supports formats ' + supported_image_types + ', not \''+format+'\'');
+
+				if(processMethodNotEnabled(format))
+					throw new Error('please ensure that the plugin for \''+format+'\' support is added');
+
+				/**
+				 * need to test if it's more efficent to convert all binary strings
+				 * to TypedArray - or should we just leave and process as string?
+				 */
+				if(this.supportsArrayBuffer()) {
+					dataAsBinaryString = imageData;
+					imageData = this.binaryStringToUint8Array(imageData);
+				}
+
+				info = this['process' + format.toUpperCase()](
+					imageData,
+					getImageIndex(images),
+					alias,
+					checkCompressValue(compression),
+					dataAsBinaryString
+				);
+
+				if(!info)
+					throw new Error('An unkwown error occurred whilst processing the image');
+			}
+		}
+
+		writeImageToPDF.call(this, x, y, w, h, info, info.i, images);
+
+		return this
+	};
+
+	/**
+	 * JPEG SUPPORT
+	 **/
+
+	//takes a string imgData containing the raw bytes of
+	//a jpeg image and returns [width, height]
+	//Algorithm from: http://www.64lines.com/jpeg-width-height
+	var getJpegSize = function(imgData) {
+		'use strict'
+		var width, height, numcomponents;
+		// Verify we have a valid jpeg header 0xff,0xd8,0xff,0xe0,?,?,'J','F','I','F',0x00
+		if (!imgData.charCodeAt(0) === 0xff ||
+			!imgData.charCodeAt(1) === 0xd8 ||
+			!imgData.charCodeAt(2) === 0xff ||
+			!imgData.charCodeAt(3) === 0xe0 ||
+			!imgData.charCodeAt(6) === 'J'.charCodeAt(0) ||
+			!imgData.charCodeAt(7) === 'F'.charCodeAt(0) ||
+			!imgData.charCodeAt(8) === 'I'.charCodeAt(0) ||
+			!imgData.charCodeAt(9) === 'F'.charCodeAt(0) ||
+			!imgData.charCodeAt(10) === 0x00) {
+				throw new Error('getJpegSize requires a binary string jpeg file')
+		}
+		var blockLength = imgData.charCodeAt(4)*256 + imgData.charCodeAt(5);
+		var i = 4, len = imgData.length;
+		while ( i < len ) {
+			i += blockLength;
+			if (imgData.charCodeAt(i) !== 0xff) {
+				throw new Error('getJpegSize could not find the size of the image');
+			}
+			if (imgData.charCodeAt(i+1) === 0xc0 || //(SOF) Huffman  - Baseline DCT
+			    imgData.charCodeAt(i+1) === 0xc1 || //(SOF) Huffman  - Extended sequential DCT
+			    imgData.charCodeAt(i+1) === 0xc2 || // Progressive DCT (SOF2)
+			    imgData.charCodeAt(i+1) === 0xc3 || // Spatial (sequential) lossless (SOF3)
+			    imgData.charCodeAt(i+1) === 0xc4 || // Differential sequential DCT (SOF5)
+			    imgData.charCodeAt(i+1) === 0xc5 || // Differential progressive DCT (SOF6)
+			    imgData.charCodeAt(i+1) === 0xc6 || // Differential spatial (SOF7)
+			    imgData.charCodeAt(i+1) === 0xc7) {
+				height = imgData.charCodeAt(i+5)*256 + imgData.charCodeAt(i+6);
+				width = imgData.charCodeAt(i+7)*256 + imgData.charCodeAt(i+8);
+                numcomponents = imgData.charCodeAt(i+9);
+				return [width, height, numcomponents];
+			} else {
+				i += 2;
+				blockLength = imgData.charCodeAt(i)*256 + imgData.charCodeAt(i+1)
+			}
+		}
+	}
+	, getJpegSizeFromBytes = function(data) {
+
+		var hdr = (data[0] << 8) | data[1];
+
+		if(hdr !== 0xFFD8)
+			throw new Error('Supplied data is not a JPEG');
+
+		var len = data.length,
+			block = (data[4] << 8) + data[5],
+			pos = 4,
+			bytes, width, height, numcomponents;
+
+		while(pos < len) {
+			pos += block;
+			bytes = readBytes(data, pos);
+			block = (bytes[2] << 8) + bytes[3];
+			if((bytes[1] === 0xC0 || bytes[1] === 0xC2) && bytes[0] === 0xFF && block > 7) {
+				bytes = readBytes(data, pos + 5);
+				width = (bytes[2] << 8) + bytes[3];
+				height = (bytes[0] << 8) + bytes[1];
+                numcomponents = bytes[4];
+				return {width:width, height:height, numcomponents: numcomponents};
+			}
+
+			pos+=2;
+		}
+
+		throw new Error('getJpegSizeFromBytes could not find the size of the image');
+	}
+	, readBytes = function(data, offset) {
+		return data.subarray(offset, offset+ 5);
+	};
+
+	jsPDFAPI.processJPEG = function(data, index, alias, compression, dataAsBinaryString) {
+		'use strict'
+		var colorSpace = this.color_spaces.DEVICE_RGB,
+			filter = this.decode.DCT_DECODE,
+			bpc = 8,
+			dims;
+
+		if(this.isString(data)) {
+			dims = getJpegSize(data);
+			return this.createImageInfo(data, dims[0], dims[1], dims[3] == 1 ? this.color_spaces.DEVICE_GRAY:colorSpace, bpc, filter, index, alias);
+		}
+
+		if(this.isArrayBuffer(data))
+			data = new Uint8Array(data);
+
+		if(this.isArrayBufferView(data)) {
+
+			dims = getJpegSizeFromBytes(data);
+
+			// if we already have a stored binary string rep use that
+			data = dataAsBinaryString || this.arrayBufferToBinaryString(data);
+
+			return this.createImageInfo(data, dims.width, dims.height, dims.numcomponents == 1 ? this.color_spaces.DEVICE_GRAY:colorSpace, bpc, filter, index, alias);
+		}
+
+		return null;
+	};
+
+	jsPDFAPI.processJPG = function(/*data, index, alias, compression, dataAsBinaryString*/) {
+		return this.processJPEG.apply(this, arguments);
+	}
+
+})(jsPDF.API);
+(function (jsPDFAPI) {
+	'use strict';
+
+	jsPDFAPI.autoPrint = function () {
+		'use strict'
+		var refAutoPrintTag;
+
+		this.internal.events.subscribe('postPutResources', function () {
+			refAutoPrintTag = this.internal.newObject()
+				this.internal.write("<< /S/Named /Type/Action /N/Print >>", "endobj");
+		});
+
+		this.internal.events.subscribe("putCatalog", function () {
+			this.internal.write("/OpenAction " + refAutoPrintTag + " 0" + " R");
+		});
+		return this;
+	};
+})(jsPDF.API);
+/** ====================================================================
+ * jsPDF Cell plugin
+ * Copyright (c) 2013 Youssef Beddad, youssef.beddad@gmail.com
+ *               2013 Eduardo Menezes de Morais, eduardo.morais@usp.br
+ *               2013 Lee Driscoll, https://github.com/lsdriscoll
+ *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
+ *               2014 James Hall, james@parall.ax
+ *               2014 Diego Casorran, https://github.com/diegocr
+ *
+ * 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.
+ * ====================================================================
+ */
+
+(function (jsPDFAPI) {
+    'use strict';
+    /*jslint browser:true */
+    /*global document: false, jsPDF */
+
+    var fontName,
+        fontSize,
+        fontStyle,
+        padding = 3,
+        margin = 13,
+        headerFunction,
+        lastCellPos = { x: undefined, y: undefined, w: undefined, h: undefined, ln: undefined },
+        pages = 1,
+        setLastCellPosition = function (x, y, w, h, ln) {
+            lastCellPos = { 'x': x, 'y': y, 'w': w, 'h': h, 'ln': ln };
+        },
+        getLastCellPosition = function () {
+            return lastCellPos;
+        },
+        NO_MARGINS = {left:0, top:0, bottom: 0};
+
+    jsPDFAPI.setHeaderFunction = function (func) {
+        headerFunction = func;
+    };
+
+    jsPDFAPI.getTextDimensions = function (txt) {
+        fontName = this.internal.getFont().fontName;
+        fontSize = this.table_font_size || this.internal.getFontSize();
+        fontStyle = this.internal.getFont().fontStyle;
+        // 1 pixel = 0.264583 mm and 1 mm = 72/25.4 point
+        var px2pt = 0.264583 * 72 / 25.4,
+            dimensions,
+            text;
+
+        text = document.createElement('font');
+        text.id = "jsPDFCell";
+        text.style.fontStyle = fontStyle;
+        text.style.fontName = fontName;
+        text.style.fontSize = fontSize + 'pt';
+        text.textContent = txt;
+
+        document.body.appendChild(text);
+
+        dimensions = { w: (text.offsetWidth + 1) * px2pt, h: (text.offsetHeight + 1) * px2pt};
+
+        document.body.removeChild(text);
+
+        return dimensions;
+    };
+
+    jsPDFAPI.cellAddPage = function () {
+        var margins = this.margins || NO_MARGINS;
+
+        this.addPage();
+
+        setLastCellPosition(margins.left, margins.top, undefined, undefined);
+        //setLastCellPosition(undefined, undefined, undefined, undefined, undefined);
+        pages += 1;
+    };
+
+    jsPDFAPI.cellInitialize = function () {
+        lastCellPos = { x: undefined, y: undefined, w: undefined, h: undefined, ln: undefined };
+        pages = 1;
+    };
+
+    jsPDFAPI.cell = function (x, y, w, h, txt, ln, align) {
+        var curCell = getLastCellPosition();
+
+        // If this is not the first cell, we must change its position
+        if (curCell.ln !== undefined) {
+            if (curCell.ln === ln) {
+                //Same line
+                x = curCell.x + curCell.w;
+                y = curCell.y;
+            } else {
+                //New line
+                var margins = this.margins || NO_MARGINS;
+                if ((curCell.y + curCell.h + h + margin) >= this.internal.pageSize.height - margins.bottom) {
+                    this.cellAddPage();
+                    if (this.printHeaders && this.tableHeaderRow) {
+                        this.printHeaderRow(ln, true);
+                    }
+                }
+                //We ignore the passed y: the lines may have diferent heights
+                y = (getLastCellPosition().y + getLastCellPosition().h);
+
+            }
+        }
+
+        if (txt[0] !== undefined) {
+            if (this.printingHeaderRow) {
+                this.rect(x, y, w, h, 'FD');
+            } else {
+                this.rect(x, y, w, h);
+            }
+            if (align === 'right') {
+                if (txt instanceof Array) {
+                    for(var i = 0; i<txt.length; i++) {
+                        var currentLine = txt[i];
+                        var textSize = this.getStringUnitWidth(currentLine) * this.internal.getFontSize();
+                        this.text(currentLine, x + w - textSize - padding, y + this.internal.getLineHeight()*(i+1));
+                    }
+                }
+            } else {
+                this.text(txt, x + padding, y + this.internal.getLineHeight());
+            }
+        }
+        setLastCellPosition(x, y, w, h, ln);
+        return this;
+    };
+
+    /**
+     * Return the maximum value from an array
+     * @param array
+     * @param comparisonFn
+     * @returns {*}
+     */
+    jsPDFAPI.arrayMax = function (array, comparisonFn) {
+        var max = array[0],
+            i,
+            ln,
+            item;
+
+        for (i = 0, ln = array.length; i < ln; i += 1) {
+            item = array[i];
+
+            if (comparisonFn) {
+                if (comparisonFn(max, item) === -1) {
+                    max = item;
+                }
+            } else {
+                if (item > max) {
+                    max = item;
+                }
+            }
+        }
+
+        return max;
+    };
+
+    /**
+     * Create a table from a set of data.
+     * @param {Integer} [x] : left-position for top-left corner of table
+     * @param {Integer} [y] top-position for top-left corner of table
+     * @param {Object[]} [data] As array of objects containing key-value pairs corresponding to a row of data.
+     * @param {String[]} [headers] Omit or null to auto-generate headers at a performance cost
+
+     * @param {Object} [config.printHeaders] True to print column headers at the top of every page
+     * @param {Object} [config.autoSize] True to dynamically set the column widths to match the widest cell value
+     * @param {Object} [config.margins] margin values for left, top, bottom, and width
+     * @param {Object} [config.fontSize] Integer fontSize to use (optional)
+     */
+
+    jsPDFAPI.table = function (x,y, data, headers, config) {
+        if (!data) {
+            throw 'No data for PDF table';
+        }
+
+        var headerNames = [],
+            headerPrompts = [],
+            header,
+            i,
+            ln,
+            cln,
+            columnMatrix = {},
+            columnWidths = {},
+            columnData,
+            column,
+            columnMinWidths = [],
+            j,
+            tableHeaderConfigs = [],
+            model,
+            jln,
+            func,
+
+        //set up defaults. If a value is provided in config, defaults will be overwritten:
+           autoSize        = false,
+           printHeaders    = true,
+           fontSize        = 12,
+           margins         = NO_MARGINS;
+
+           margins.width = this.internal.pageSize.width;
+
+        if (config) {
+        //override config defaults if the user has specified non-default behavior:
+            if(config.autoSize === true) {
+                autoSize = true;
+            }
+            if(config.printHeaders === false) {
+                printHeaders = false;
+            }
+            if(config.fontSize){
+                fontSize = config.fontSize;
+            }
+            if(config.margins){
+                margins = config.margins;
+            }
+        }
+
+        /**
+         * @property {Number} lnMod
+         * Keep track of the current line number modifier used when creating cells
+         */
+        this.lnMod = 0;
+        lastCellPos = { x: undefined, y: undefined, w: undefined, h: undefined, ln: undefined },
+        pages = 1;
+
+        this.printHeaders = printHeaders;
+        this.margins = margins;
+        this.setFontSize(fontSize);
+        this.table_font_size = fontSize;
+
+        // Set header values
+        if (headers === undefined || (headers === null)) {
+            // No headers defined so we derive from data
+            headerNames = Object.keys(data[0]);
+
+        } else if (headers[0] && (typeof headers[0] !== 'string')) {
+            var px2pt = 0.264583 * 72 / 25.4;
+
+            // Split header configs into names and prompts
+            for (i = 0, ln = headers.length; i < ln; i += 1) {
+                header = headers[i];
+                headerNames.push(header.name);
+                headerPrompts.push(header.prompt);
+                columnWidths[header.name] = header.width *px2pt;
+            }
+
+        } else {
+            headerNames = headers;
+        }
+
+        if (autoSize) {
+            // Create a matrix of columns e.g., {column_title: [row1_Record, row2_Record]}
+            func = function (rec) {
+                return rec[header];
+            };
+
+            for (i = 0, ln = headerNames.length; i < ln; i += 1) {
+                header = headerNames[i];
+
+                columnMatrix[header] = data.map(
+                    func
+                );
+
+                // get header width
+                columnMinWidths.push(this.getTextDimensions(headerPrompts[i] || header).w);
+                column = columnMatrix[header];
+
+                // get cell widths
+                for (j = 0, cln = column.length; j < cln; j += 1) {
+                    columnData = column[j];
+                    columnMinWidths.push(this.getTextDimensions(columnData).w);
+                }
+
+                // get final column width
+                columnWidths[header] = jsPDFAPI.arrayMax(columnMinWidths);
+            }
+        }
+
+        // -- Construct the table
+
+        if (printHeaders) {
+            var lineHeight = this.calculateLineHeight(headerNames, columnWidths, headerPrompts.length?headerPrompts:headerNames);
+
+            // Construct the header row
+            for (i = 0, ln = headerNames.length; i < ln; i += 1) {
+                header = headerNames[i];
+                tableHeaderConfigs.push([x, y, columnWidths[header], lineHeight, String(headerPrompts.length ? headerPrompts[i] : header)]);
+            }
+
+            // Store the table header config
+            this.setTableHeaderRow(tableHeaderConfigs);
+
+            // Print the header for the start of the table
+            this.printHeaderRow(1, false);
+        }
+
+        // Construct the data rows
+        for (i = 0, ln = data.length; i < ln; i += 1) {
+            var lineHeight;
+            model = data[i];
+            lineHeight = this.calculateLineHeight(headerNames, columnWidths, model);
+
+            for (j = 0, jln = headerNames.length; j < jln; j += 1) {
+                header = headerNames[j];
+                this.cell(x, y, columnWidths[header], lineHeight, model[header], i + 2, header.align);
+            }
+        }
+        this.lastCellPos = lastCellPos;
+        this.table_x = x;
+        this.table_y = y;
+        return this;
+    };
+    /**
+     * Calculate the height for containing the highest column
+     * @param {String[]} headerNames is the header, used as keys to the data
+     * @param {Integer[]} columnWidths is size of each column
+     * @param {Object[]} model is the line of data we want to calculate the height of
+     */
+    jsPDFAPI.calculateLineHeight = function (headerNames, columnWidths, model) {
+        var header, lineHeight = 0;
+        for (var j = 0; j < headerNames.length; j++) {
+            header = headerNames[j];
+            model[header] = this.splitTextToSize(String(model[header]), columnWidths[header] - padding);
+            var h = this.internal.getLineHeight() * model[header].length + padding;
+            if (h > lineHeight)
+                lineHeight = h;
+        }
+        return lineHeight;
+    };
+
+    /**
+     * Store the config for outputting a table header
+     * @param {Object[]} config
+     * An array of cell configs that would define a header row: Each config matches the config used by jsPDFAPI.cell
+     * except the ln parameter is excluded
+     */
+    jsPDFAPI.setTableHeaderRow = function (config) {
+        this.tableHeaderRow = config;
+    };
+
+    /**
+     * Output the store header row
+     * @param lineNumber The line number to output the header at
+     */
+    jsPDFAPI.printHeaderRow = function (lineNumber, new_page) {
+        if (!this.tableHeaderRow) {
+            throw 'Property tableHeaderRow does not exist.';
+        }
+
+        var tableHeaderCell,
+            tmpArray,
+            i,
+            ln;
+
+        this.printingHeaderRow = true;
+        if (headerFunction !== undefined) {
+            var position = headerFunction(this, pages);
+            setLastCellPosition(position[0], position[1], position[2], position[3], -1);
+        }
+        this.setFontStyle('bold');
+        var tempHeaderConf = [];
+        for (i = 0, ln = this.tableHeaderRow.length; i < ln; i += 1) {
+            this.setFillColor(200,200,200);
+
+            tableHeaderCell = this.tableHeaderRow[i];
+            if (new_page) {
+                tableHeaderCell[1] = this.margins && this.margins.top || 0;
+                tempHeaderConf.push(tableHeaderCell);
+            }
+            tmpArray = [].concat(tableHeaderCell);
+            this.cell.apply(this, tmpArray.concat(lineNumber));
+        }
+        if (tempHeaderConf.length > 0){
+            this.setTableHeaderRow(tempHeaderConf);
+        }
+        this.setFontStyle('normal');
+        this.printingHeaderRow = false;
+    };
+
+})(jsPDF.API);
+/** @preserve
+ * jsPDF fromHTML plugin. BETA stage. API subject to change. Needs browser
+ * Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
+ *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
+ *               2014 Diego Casorran, https://github.com/diegocr
+ *               2014 Daniel Husar, https://github.com/danielhusar
+ *               2014 Wolfgang Gassler, https://github.com/woolfg
+ *
+ * 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.
+ * ====================================================================
+ */
+
+(function (jsPDFAPI) {
+	var clone,
+	DrillForContent,
+	FontNameDB,
+	FontStyleMap,
+	FontWeightMap,
+	FloatMap,
+	ClearMap,
+	GetCSS,
+	PurgeWhiteSpace,
+	Renderer,
+	ResolveFont,
+	ResolveUnitedNumber,
+	UnitedNumberMap,
+	elementHandledElsewhere,
+	images,
+	loadImgs,
+	checkForFooter,
+	process,
+	tableToJson;
+	clone = (function () {
+		return function (obj) {
+			Clone.prototype = obj;
+			return new Clone()
+		};
+		function Clone() {}
+	})();
+	PurgeWhiteSpace = function (array) {
+		var fragment,
+		i,
+		l,
+		lTrimmed,
+		r,
+		rTrimmed,
+		trailingSpace;
+		i = 0;
+		l = array.length;
+		fragment = void 0;
+		lTrimmed = false;
+		rTrimmed = false;
+		while (!lTrimmed && i !== l) {
+			fragment = array[i] = array[i].trimLeft();
+			if (fragment) {
+				lTrimmed = true;
+			}
+			i++;
+		}
+		i = l - 1;
+		while (l && !rTrimmed && i !== -1) {
+			fragment = array[i] = array[i].trimRight();
+			if (fragment) {
+				rTrimmed = true;
+			}
+			i--;
+		}
+		r = /\s+$/g;
+		trailingSpace = true;
+		i = 0;
+		while (i !== l) {
+			fragment = array[i].replace(/\s+/g, " ");
+			if (trailingSpace) {
+				fragment = fragment.trimLeft();
+			}
+			if (fragment) {
+				trailingSpace = r.test(fragment);
+			}
+			array[i] = fragment;
+			i++;
+		}
+		return array;
+	};
+	Renderer = function (pdf, x, y, settings) {
+		this.pdf = pdf;
+		this.x = x;
+		this.y = y;
+		this.settings = settings;
+		//list of functions which are called after each element-rendering process
+		this.watchFunctions = [];
+		this.init();
+		return this;
+	};
+	ResolveFont = function (css_font_family_string) {
+		var name,
+		part,
+		parts;
+		name = void 0;
+		parts = css_font_family_string.split(",");
+		part = parts.shift();
+		while (!name && part) {
+			name = FontNameDB[part.trim().toLowerCase()];
+			part = parts.shift();
+		}
+		return name;
+	};
+	ResolveUnitedNumber = function (css_line_height_string) {
+
+		//IE8 issues
+		css_line_height_string = css_line_height_string === "auto" ? "0px" : css_line_height_string;
+		if (css_line_height_string.indexOf("em") > -1 && !isNaN(Number(css_line_height_string.replace("em", "")))) {
+			css_line_height_string = Number(css_line_height_string.replace("em", "")) * 18.719 + "px";
+		}
+		if (css_line_height_string.indexOf("pt") > -1 && !isNaN(Number(css_line_height_string.replace("pt", "")))) {
+			css_line_height_string = Number(css_line_height_string.replace("pt", "")) * 1.333 + "px";
+		}
+
+		var normal,
+		undef,
+		value;
+		undef = void 0;
+		normal = 16.00;
+		value = UnitedNumberMap[css_line_height_string];
+		if (value) {
+			return value;
+		}
+		value = {
+			"xx-small"  :  9,
+			"x-small"   : 11,
+			small       : 13,
+			medium      : 16,
+			large       : 19,
+			"x-large"   : 23,
+			"xx-large"  : 28,
+			auto        :  0
+		}[{ css_line_height_string : css_line_height_string }];
+
+		if (value !== undef) {
+			return UnitedNumberMap[css_line_height_string] = value / normal;
+		}
+		if (value = parseFloat(css_line_height_string)) {
+			return UnitedNumberMap[css_line_height_string] = value / normal;
+		}
+		value = css_line_height_string.match(/([\d\.]+)(px)/);
+		if (value.length === 3) {
+			return UnitedNumberMap[css_line_height_string] = parseFloat(value[1]) / normal;
+		}
+		return UnitedNumberMap[css_line_height_string] = 1;
+	};
+	GetCSS = function (element) {
+		var css,tmp,computedCSSElement;
+		computedCSSElement = (function (el) {
+			var compCSS;
+			compCSS = (function (el) {
+				if (document.defaultView && document.defaultView.getComputedStyle) {
+					return document.defaultView.getComputedStyle(el, null);
+				} else if (el.currentStyle) {
+					return el.currentStyle;
+				} else {
+					return el.style;
+				}
+			})(el);
+			return function (prop) {
+				prop = prop.replace(/-\D/g, function (match) {
+					return match.charAt(1).toUpperCase();
+				});
+				return compCSS[prop];
+			};
+		})(element);
+		css = {};
+		tmp = void 0;
+		css["font-family"] = ResolveFont(computedCSSElement("font-family")) || "times";
+		css["font-style"] = FontStyleMap[computedCSSElement("font-style")] || "normal";
+		css["text-align"] = TextAlignMap[computedCSSElement("text-align")] || "left";
+		tmp = FontWeightMap[computedCSSElement("font-weight")] || "normal";
+		if (tmp === "bold") {
+			if (css["font-style"] === "normal") {
+				css["font-style"] = tmp;
+			} else {
+				css["font-style"] = tmp + css["font-style"];
+			}
+		}
+		css["font-size"] = ResolveUnitedNumber(computedCSSElement("font-size")) || 1;
+		css["line-height"] = ResolveUnitedNumber(computedCSSElement("line-height")) || 1;
+		css["display"] = (computedCSSElement("display") === "inline" ? "inline" : "block");
+
+		tmp = (css["display"] === "block");
+		css["height"]         = tmp && ResolveUnitedNumber(computedCSSElement("height"))     || 0;
+		css["margin-top"]     = tmp && ResolveUnitedNumber(computedCSSElement("margin-top"))     || 0;
+		css["margin-bottom"]  = tmp && ResolveUnitedNumber(computedCSSElement("margin-bottom"))  || 0;
+		css["padding-top"]    = tmp && ResolveUnitedNumber(computedCSSElement("padding-top"))    || 0;
+		css["padding-bottom"] = tmp && ResolveUnitedNumber(computedCSSElement("padding-bottom")) || 0;
+		css["margin-left"]    = tmp && ResolveUnitedNumber(computedCSSElement("margin-left"))    || 0;
+		css["margin-right"]   = tmp && ResolveUnitedNumber(computedCSSElement("margin-right"))   || 0;
+		css["padding-left"]   = tmp && ResolveUnitedNumber(computedCSSElement("padding-left"))   || 0;
+		css["padding-right"]  = tmp && ResolveUnitedNumber(computedCSSElement("padding-right"))  || 0;
+
+		//float and clearing of floats
+		css["float"] = FloatMap[computedCSSElement("cssFloat")] || "none";
+		css["clear"] = ClearMap[computedCSSElement("clear")] || "none";
+		return css;
+	};
+	elementHandledElsewhere = function (element, renderer, elementHandlers) {
+		var handlers,
+		i,
+		isHandledElsewhere,
+		l,
+		t;
+		isHandledElsewhere = false;
+		i = void 0;
+		l = void 0;
+		t = void 0;
+		handlers = elementHandlers["#" + element.id];
+		if (handlers) {
+			if (typeof handlers === "function") {
+				isHandledElsewhere = handlers(element, renderer);
+			} else {
+				i = 0;
+				l = handlers.length;
+				while (!isHandledElsewhere && i !== l) {
+					isHandledElsewhere = handlers[i](element, renderer);
+					i++;
+				}
+			}
+		}
+		handlers = elementHandlers[element.nodeName];
+		if (!isHandledElsewhere && handlers) {
+			if (typeof handlers === "function") {
+				isHandledElsewhere = handlers(element, renderer);
+			} else {
+				i = 0;
+				l = handlers.length;
+				while (!isHandledElsewhere && i !== l) {
+					isHandledElsewhere = handlers[i](element, renderer);
+					i++;
+				}
+			}
+		}
+		return isHandledElsewhere;
+	};
+	tableToJson = function (table, renderer) {
+		var data,
+		headers,
+		i,
+		j,
+		rowData,
+		tableRow,
+		table_obj,
+		table_with,
+		cell,
+		l;
+		data = [];
+		headers = [];
+		i = 0;
+		l = table.rows[0].cells.length;
+		table_with = table.clientWidth;
+		while (i < l) {
+			cell = table.rows[0].cells[i];
+			headers[i] = {
+				name : cell.textContent.toLowerCase().replace(/\s+/g, ''),
+				prompt : cell.textContent.replace(/\r?\n/g, ''),
+				width : (cell.clientWidth / table_with) * renderer.pdf.internal.pageSize.width
+			};
+			i++;
+		}
+		i = 1;
+		while (i < table.rows.length) {
+			tableRow = table.rows[i];
+			rowData = {};
+			j = 0;
+			while (j < tableRow.cells.length) {
+				rowData[headers[j].name] = tableRow.cells[j].textContent.replace(/\r?\n/g, '');
+				j++;
+			}
+			data.push(rowData);
+			i++;
+		}
+		return table_obj = {
+			rows : data,
+			headers : headers
+		};
+	};
+	var SkipNode = {
+		SCRIPT   : 1,
+		STYLE    : 1,
+		NOSCRIPT : 1,
+		OBJECT   : 1,
+		EMBED    : 1,
+		SELECT   : 1
+	};
+	var listCount = 1;
+	DrillForContent = function (element, renderer, elementHandlers) {
+		var cn,
+		cns,
+		fragmentCSS,
+		i,
+		isBlock,
+		l,
+		px2pt,
+		table2json,
+		cb;
+		cns = element.childNodes;
+		cn = void 0;
+		fragmentCSS = GetCSS(element);
+		isBlock = fragmentCSS.display === "block";
+		if (isBlock) {
+			renderer.setBlockBoundary();
+			renderer.setBlockStyle(fragmentCSS);
+		}
+		px2pt = 0.264583 * 72 / 25.4;
+		i = 0;
+		l = cns.length;
+		while (i < l) {
+			cn = cns[i];
+			if (typeof cn === "object") {
+
+				//execute all watcher functions to e.g. reset floating
+				renderer.executeWatchFunctions(cn);
+
+				/*** HEADER rendering **/
+				if (cn.nodeType === 1 && cn.nodeName === 'HEADER') {
+					var header = cn;
+					//store old top margin
+					var oldMarginTop = renderer.pdf.margins_doc.top;
+					//subscribe for new page event and render header first on every page
+					renderer.pdf.internal.events.subscribe('addPage', function (pageInfo) {
+						//set current y position to old margin
+						renderer.y = oldMarginTop;
+						//render all child nodes of the header element
+						DrillForContent(header, renderer, elementHandlers);
+						//set margin to old margin + rendered header + 10 space to prevent overlapping
+						//important for other plugins (e.g. table) to start rendering at correct position after header
+						renderer.pdf.margins_doc.top = renderer.y + 10;
+						renderer.y += 10;
+					}, false);
+				}
+
+				if (cn.nodeType === 8 && cn.nodeName === "#comment") {
+					if (~cn.textContent.indexOf("ADD_PAGE")) {
+						renderer.pdf.addPage();
+						renderer.y = renderer.pdf.margins_doc.top;
+					}
+
+				} else if (cn.nodeType === 1 && !SkipNode[cn.nodeName]) {
+					/*** IMAGE RENDERING ***/
+					var cached_image;
+					if (cn.nodeName === "IMG") {
+						var url = cn.getAttribute("src");
+						cached_image = images[renderer.pdf.sHashCode(url) || url];
+					}
+					if (cached_image) {
+						if ((renderer.pdf.internal.pageSize.height - renderer.pdf.margins_doc.bottom < renderer.y + cn.height) && (renderer.y > renderer.pdf.margins_doc.top)) {
+							renderer.pdf.addPage();
+							renderer.y = renderer.pdf.margins_doc.top;
+							//check if we have to set back some values due to e.g. header rendering for new page
+							renderer.executeWatchFunctions(cn);
+						}
+
+						var imagesCSS = GetCSS(cn);
+						var imageX = renderer.x;
+						var fontToUnitRatio = 12 / renderer.pdf.internal.scaleFactor;
+
+						//define additional paddings, margins which have to be taken into account for margin calculations
+						var additionalSpaceLeft = (imagesCSS["margin-left"] + imagesCSS["padding-left"])*fontToUnitRatio;
+						var additionalSpaceRight = (imagesCSS["margin-right"] + imagesCSS["padding-right"])*fontToUnitRatio;
+						var additionalSpaceTop = (imagesCSS["margin-top"] + imagesCSS["padding-top"])*fontToUnitRatio;
+						var additionalSpaceBottom = (imagesCSS["margin-bottom"] + imagesCSS["padding-bottom"] + imagesCSS["height"])*fontToUnitRatio;
+
+						//if float is set to right, move the image to the right border
+						//add space if margin is set
+						if (imagesCSS['float'] !== undefined && imagesCSS['float'] === 'right') {
+							imageX += renderer.settings.width - cn.width - additionalSpaceRight;
+						} else {
+							imageX +=  additionalSpaceLeft;
+						}
+
+						renderer.pdf.addImage(cached_image, imageX, renderer.y + additionalSpaceTop, cn.width, cn.height);
+						cached_image = undefined;
+						//if the float prop is specified we have to float the text around the image
+						if (imagesCSS['float'] === 'right' || imagesCSS['float'] === 'left') {
+							//add functiont to set back coordinates after image rendering
+							renderer.watchFunctions.push((function(diffX , thresholdY, diffWidth, el) {
+								//undo drawing box adaptions which were set by floating
+								if (renderer.y >= thresholdY) {
+									renderer.x += diffX;
+									renderer.settings.width += diffWidth;
+									return true;
+								} else if(el && el.nodeType === 1 && !SkipNode[el.nodeName] && renderer.x+el.width > (renderer.pdf.margins_doc.left + renderer.pdf.margins_doc.width)) {
+									renderer.x += diffX;
+									renderer.y = thresholdY;
+									renderer.settings.width += diffWidth;
+									return true;
+								} else {
+									return false;
+								}
+							}).bind(this, (imagesCSS['float'] === 'left') ? -cn.width-additionalSpaceLeft-additionalSpaceRight : 0, renderer.y+cn.height+additionalSpaceTop+additionalSpaceBottom, cn.width));
+							//reset floating by clear:both divs
+							//just set cursorY after the floating element
+							renderer.watchFunctions.push((function(yPositionAfterFloating, pages, el) {
+								if (renderer.y < yPositionAfterFloating && pages === renderer.pdf.internal.getNumberOfPages()) {
+									if (el.nodeType === 1 && GetCSS(el).clear === 'both') {
+										renderer.y = yPositionAfterFloating;
+										return true;
+									} else {
+										return false;
+									}
+								} else {
+									return true;
+								}
+							}).bind(this, renderer.y+cn.height, renderer.pdf.internal.getNumberOfPages()));
+
+							//if floating is set we decrease the available width by the image width
+							renderer.settings.width -= cn.width+additionalSpaceLeft+additionalSpaceRight;
+							//if left just add the image width to the X coordinate
+							if (imagesCSS['float'] === 'left') {
+								renderer.x += cn.width+additionalSpaceLeft+additionalSpaceRight;
+							}
+						} else {
+						//if no floating is set, move the rendering cursor after the image height
+							renderer.y += cn.height + additionalSpaceBottom;
+						}
+
+					/*** TABLE RENDERING ***/
+					} else if (cn.nodeName === "TABLE") {
+						table2json = tableToJson(cn, renderer);
+						renderer.y += 10;
+						renderer.pdf.table(renderer.x, renderer.y, table2json.rows, table2json.headers, {
+							autoSize : false,
+							printHeaders : true,
+							margins : renderer.pdf.margins_doc
+						});
+						renderer.y = renderer.pdf.lastCellPos.y + renderer.pdf.lastCellPos.h + 20;
+					} else if (cn.nodeName === "OL" || cn.nodeName === "UL") {
+						listCount = 1;
+						if (!elementHandledElsewhere(cn, renderer, elementHandlers)) {
+							DrillForContent(cn, renderer, elementHandlers);
+						}
+						renderer.y += 10;
+					} else if (cn.nodeName === "LI") {
+						var temp = renderer.x;
+						renderer.x += cn.parentNode.nodeName === "UL" ? 22 : 10;
+						renderer.y += 3;
+						if (!elementHandledElsewhere(cn, renderer, elementHandlers)) {
+							DrillForContent(cn, renderer, elementHandlers);
+						}
+						renderer.x = temp;
+					} else if (cn.nodeName === "BR") {
+						renderer.y += fragmentCSS["font-size"] * renderer.pdf.internal.scaleFactor;
+					} else {
+						if (!elementHandledElsewhere(cn, renderer, elementHandlers)) {
+							DrillForContent(cn, renderer, elementHandlers);
+						}
+					}
+				} else if (cn.nodeType === 3) {
+					var value = cn.nodeValue;
+					if (cn.nodeValue && cn.parentNode.nodeName === "LI") {
+						if (cn.parentNode.parentNode.nodeName === "OL") {
+							value = listCount++ + '. ' + value;
+						} else {
+							var fontPx = fragmentCSS["font-size"] * 16;
+							var radius = 2;
+							if (fontPx > 20) {
+								radius = 3;
+							}
+							cb = function (x, y) {
+								this.pdf.circle(x, y, radius, 'FD');
+							};
+						}
+					}
+					renderer.addText(value, fragmentCSS);
+				} else if (typeof cn === "string") {
+					renderer.addText(cn, fragmentCSS);
+				}
+			}
+			i++;
+		}
+
+		if (isBlock) {
+			return renderer.setBlockBoundary(cb);
+		}
+	};
+	images = {};
+	loadImgs = function (element, renderer, elementHandlers, cb) {
+		var imgs = element.getElementsByTagName('img'),
+		l = imgs.length, found_images,
+		x = 0;
+		function done() {
+			renderer.pdf.internal.events.publish('imagesLoaded');
+			cb(found_images);
+		}
+		function loadImage(url, width, height) {
+			if (!url)
+				return;
+			var img = new Image();
+			found_images = ++x;
+			img.crossOrigin = '';
+			img.onerror = img.onload = function () {
+				if(img.complete) {
+					//to support data urls in images, set width and height
+					//as those values are not recognized automatically
+					if (img.src.indexOf('data:image/') === 0) {
+						img.width = width || img.width || 0;
+						img.height = height || img.height || 0;
+					}
+					//if valid image add to known images array
+					if (img.width + img.height) {
+						var hash = renderer.pdf.sHashCode(url) || url;
+						images[hash] = images[hash] || img;
+					}
+				}
+				if(!--x) {
+					done();
+				}
+			};
+			img.src = url;
+		}
+		while (l--)
+			loadImage(imgs[l].getAttribute("src"),imgs[l].width,imgs[l].height);
+		return x || done();
+	};
+	checkForFooter = function (elem, renderer, elementHandlers) {
+		//check if we can found a <footer> element
+		var footer = elem.getElementsByTagName("footer");
+		if (footer.length > 0) {
+
+			footer = footer[0];
+
+			//bad hack to get height of footer
+			//creat dummy out and check new y after fake rendering
+			var oldOut = renderer.pdf.internal.write;
+			var oldY = renderer.y;
+			renderer.pdf.internal.write = function () {};
+			DrillForContent(footer, renderer, elementHandlers);
+			var footerHeight = Math.ceil(renderer.y - oldY) + 5;
+			renderer.y = oldY;
+			renderer.pdf.internal.write = oldOut;
+
+			//add 20% to prevent overlapping
+			renderer.pdf.margins_doc.bottom += footerHeight;
+
+			//Create function render header on every page
+			var renderFooter = function (pageInfo) {
+				var pageNumber = pageInfo !== undefined ? pageInfo.pageNumber : 1;
+				//set current y position to old margin
+				var oldPosition = renderer.y;
+				//render all child nodes of the header element
+				renderer.y = renderer.pdf.internal.pageSize.height - renderer.pdf.margins_doc.bottom;
+				renderer.pdf.margins_doc.bottom -= footerHeight;
+
+				//check if we have to add page numbers
+				var spans = footer.getElementsByTagName('span');
+				for (var i = 0; i < spans.length; ++i) {
+					//if we find some span element with class pageCounter, set the page
+					if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" pageCounter ") > -1) {
+						spans[i].innerHTML = pageNumber;
+					}
+					//if we find some span element with class totalPages, set a variable which is replaced after rendering of all pages
+					if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" totalPages ") > -1) {
+						spans[i].innerHTML = '###jsPDFVarTotalPages###';
+					}
+				}
+
+				//render footer content
+				DrillForContent(footer, renderer, elementHandlers);
+				//set bottom margin to previous height including the footer height
+				renderer.pdf.margins_doc.bottom += footerHeight;
+				//important for other plugins (e.g. table) to start rendering at correct position after header
+				renderer.y = oldPosition;
+			};
+
+			//check if footer contains totalPages which shoudl be replace at the disoposal of the document
+			var spans = footer.getElementsByTagName('span');
+			for (var i = 0; i < spans.length; ++i) {
+				if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" totalPages ") > -1) {
+					renderer.pdf.internal.events.subscribe('htmlRenderingFinished', renderer.pdf.putTotalPages.bind(renderer.pdf, '###jsPDFVarTotalPages###'), true);
+				}
+			}
+
+			//register event to render footer on every new page
+			renderer.pdf.internal.events.subscribe('addPage', renderFooter, false);
+			//render footer on first page
+			renderFooter();
+
+			//prevent footer rendering
+			SkipNode['FOOTER'] = 1;
+		}
+	};
+	process = function (pdf, element, x, y, settings, callback) {
+		if (!element)
+			return false;
+		if (typeof element !== "string" && !element.parentNode)
+			element = '' + element.innerHTML;
+		if (typeof element === "string") {
+			element = (function (element) {
+				var $frame,
+				$hiddendiv,
+				framename,
+				visuallyhidden;
+				framename = "jsPDFhtmlText" + Date.now().toString() + (Math.random() * 1000).toFixed(0);
+				visuallyhidden = "position: absolute !important;" + "clip: rect(1px 1px 1px 1px); /* IE6, IE7 */" + "clip: rect(1px, 1px, 1px, 1px);" + "padding:0 !important;" + "border:0 !important;" + "height: 1px !important;" + "width: 1px !important; " + "top:auto;" + "left:-100px;" + "overflow: hidden;";
+				$hiddendiv = document.createElement('div');
+				$hiddendiv.style.cssText = visuallyhidden;
+				$hiddendiv.innerHTML = "<iframe style=\"height:1px;width:1px\" name=\"" + framename + "\" />";
+				document.body.appendChild($hiddendiv);
+				$frame = window.frames[framename];
+				$frame.document.body.innerHTML = element;
+				return $frame.document.body;
+			})(element.replace(/<\/?script[^>]*?>/gi, ''));
+		}
+		var r = new Renderer(pdf, x, y, settings), out;
+
+		// 1. load images
+		// 2. prepare optional footer elements
+		// 3. render content
+		loadImgs.call(this, element, r, settings.elementHandlers, function (found_images) {
+			checkForFooter( element, r, settings.elementHandlers);
+			DrillForContent(element, r, settings.elementHandlers);
+			//send event dispose for final taks (e.g. footer totalpage replacement)
+			r.pdf.internal.events.publish('htmlRenderingFinished');
+			out = r.dispose();
+			if (typeof callback === 'function') callback(out);
+			else if (found_images) console.error('jsPDF Warning: rendering issues? provide a callback to fromHTML!');
+		});
+		return out || {x: r.x, y:r.y};
+	};
+	Renderer.prototype.init = function () {
+		this.paragraph = {
+			text : [],
+			style : []
+		};
+		return this.pdf.internal.write("q");
+	};
+	Renderer.prototype.dispose = function () {
+		this.pdf.internal.write("Q");
+		return {
+			x : this.x,
+			y : this.y,
+			ready:true
+		};
+	};
+
+	//Checks if we have to execute some watcher functions
+	//e.g. to end text floating around an image
+	Renderer.prototype.executeWatchFunctions = function(el) {
+		var ret = false;
+		var narray = [];
+		if (this.watchFunctions.length > 0) {
+			for(var i=0; i< this.watchFunctions.length; ++i) {
+				if (this.watchFunctions[i](el) === true) {
+					ret = true;
+				} else {
+					narray.push(this.watchFunctions[i]);
+				}
+			}
+			this.watchFunctions = narray;
+		}
+		return ret;
+	};
+
+	Renderer.prototype.splitFragmentsIntoLines = function (fragments, styles) {
+		var currentLineLength,
+		defaultFontSize,
+		ff,
+		fontMetrics,
+		fontMetricsCache,
+		fragment,
+		fragmentChopped,
+		fragmentLength,
+		fragmentSpecificMetrics,
+		fs,
+		k,
+		line,
+		lines,
+		maxLineLength,
+		style;
+		defaultFontSize = 12;
+		k = this.pdf.internal.scaleFactor;
+		fontMetricsCache = {};
+		ff = void 0;
+		fs = void 0;
+		fontMetrics = void 0;
+		fragment = void 0;
+		style = void 0;
+		fragmentSpecificMetrics = void 0;
+		fragmentLength = void 0;
+		fragmentChopped = void 0;
+		line = [];
+		lines = [line];
+		currentLineLength = 0;
+		maxLineLength = this.settings.width;
+		while (fragments.length) {
+			fragment = fragments.shift();
+			style = styles.shift();
+			if (fragment) {
+				ff = style["font-family"];
+				fs = style["font-style"];
+				fontMetrics = fontMetricsCache[ff + fs];
+				if (!fontMetrics) {
+					fontMetrics = this.pdf.internal.getFont(ff, fs).metadata.Unicode;
+					fontMetricsCache[ff + fs] = fontMetrics;
+				}
+				fragmentSpecificMetrics = {
+					widths : fontMetrics.widths,
+					kerning : fontMetrics.kerning,
+					fontSize : style["font-size"] * defaultFontSize,
+					textIndent : currentLineLength
+				};
+				fragmentLength = this.pdf.getStringUnitWidth(fragment, fragmentSpecificMetrics) * fragmentSpecificMetrics.fontSize / k;
+				if (currentLineLength + fragmentLength > maxLineLength) {
+					fragmentChopped = this.pdf.splitTextToSize(fragment, maxLineLength, fragmentSpecificMetrics);
+					line.push([fragmentChopped.shift(), style]);
+					while (fragmentChopped.length) {
+						line = [[fragmentChopped.shift(), style]];
+						lines.push(line);
+					}
+					currentLineLength = this.pdf.getStringUnitWidth(line[0][0], fragmentSpecificMetrics) * fragmentSpecificMetrics.fontSize / k;
+				} else {
+					line.push([fragment, style]);
+					currentLineLength += fragmentLength;
+				}
+			}
+		}
+
+		//if text alignment was set, set margin/indent of each line
+		if (style['text-align'] !== undefined && (style['text-align'] === 'center' || style['text-align'] === 'right' || style['text-align'] === 'justify')) {
+			for (var i = 0; i < lines.length; ++i) {
+				var length = this.pdf.getStringUnitWidth(lines[i][0][0], fragmentSpecificMetrics) * fragmentSpecificMetrics.fontSize / k;
+				//if there is more than on line we have to clone the style object as all lines hold a reference on this object
+				if (i > 0) {
+					lines[i][0][1] = clone(lines[i][0][1]);
+				}
+				var space = (maxLineLength - length);
+
+				if (style['text-align'] === 'right') {
+					lines[i][0][1]['margin-left'] = space;
+					//if alignment is not right, it has to be center so split the space to the left and the right
+				} else if (style['text-align'] === 'center') {
+					lines[i][0][1]['margin-left'] = space / 2;
+					//if justify was set, calculate the word spacing and define in by using the css property
+				} else if (style['text-align'] === 'justify') {
+					var countSpaces = lines[i][0][0].split(' ').length - 1;
+					lines[i][0][1]['word-spacing'] = space / countSpaces;
+					//ignore the last line in justify mode
+					if (i === (lines.length - 1)) {
+						lines[i][0][1]['word-spacing'] = 0;
+					}
+				}
+			}
+		}
+
+		return lines;
+	};
+	Renderer.prototype.RenderTextFragment = function (text, style) {
+		var defaultFontSize,
+		font,
+		maxLineHeight;
+
+		maxLineHeight = 0;
+		defaultFontSize = 12;
+
+		if (this.pdf.internal.pageSize.height - this.pdf.margins_doc.bottom < this.y + this.pdf.internal.getFontSize()) {
+			this.pdf.internal.write("ET", "Q");
+			this.pdf.addPage();
+			this.y = this.pdf.margins_doc.top;
+			this.pdf.internal.write("q", "BT 0 g", this.pdf.internal.getCoordinateString(this.x), this.pdf.internal.getVerticalCoordinateString(this.y), "Td");
+			//move cursor by one line on new page
+			maxLineHeight = Math.max(maxLineHeight, style["line-height"], style["font-size"]);
+			this.pdf.internal.write(0, (-1 * defaultFontSize * maxLineHeight).toFixed(2), "Td");
+		}
+
+		font = this.pdf.internal.getFont(style["font-family"], style["font-style"]);
+
+		//set the word spacing for e.g. justify style
+		if (style['word-spacing'] !== undefined && style['word-spacing'] > 0) {
+			this.pdf.internal.write(style['word-spacing'].toFixed(2), "Tw");
+		}
+
+		this.pdf.internal.write("/" + font.id, (defaultFontSize * style["font-size"]).toFixed(2), "Tf", "(" + this.pdf.internal.pdfEscape(text) + ") Tj");
+
+		//set the word spacing back to neutral => 0
+		if (style['word-spacing'] !== undefined) {
+			this.pdf.internal.write(0, "Tw");
+		}
+	};
+	Renderer.prototype.renderParagraph = function (cb) {
+		var blockstyle,
+		defaultFontSize,
+		fontToUnitRatio,
+		fragments,
+		i,
+		l,
+		line,
+		lines,
+		maxLineHeight,
+		out,
+		paragraphspacing_after,
+		paragraphspacing_before,
+		priorblockstype,
+		styles,
+		fontSize;
+		fragments = PurgeWhiteSpace(this.paragraph.text);
+		styles = this.paragraph.style;
+		blockstyle = this.paragraph.blockstyle;
+		priorblockstype = this.paragraph.blockstyle || {};
+		this.paragraph = {
+			text : [],
+			style : [],
+			blockstyle : {},
+			priorblockstyle : blockstyle
+		};
+		if (!fragments.join("").trim()) {
+			return;
+		}
+		lines = this.splitFragmentsIntoLines(fragments, styles);
+		line = void 0;
+		maxLineHeight = void 0;
+		defaultFontSize = 12;
+		fontToUnitRatio = defaultFontSize / this.pdf.internal.scaleFactor;
+		
+		paragraphspacing_before = (Math.max((blockstyle["margin-top"] || 0), 0) + (blockstyle["padding-top"] || 0)) * fontToUnitRatio;
+		paragraphspacing_after = ((blockstyle["margin-bottom"] || 0) + (blockstyle["padding-bottom"] || 0) + (blockstyle["height"] || 0)) * fontToUnitRatio;
+		
+		out = this.pdf.internal.write;
+		i = void 0;
+		l = void 0;
+		this.y += paragraphspacing_before;
+		out("q", "BT 0 g", this.pdf.internal.getCoordinateString(this.x), this.pdf.internal.getVerticalCoordinateString(this.y), "Td");
+
+		//stores the current indent of cursor position
+		var currentIndent = 0;
+
+		while (lines.length) {
+			line = lines.shift();
+			maxLineHeight = 0;
+			i = 0;
+			l = line.length;
+			while (i !== l) {
+				if (line[i][0].trim()) {
+					maxLineHeight = Math.max(maxLineHeight, line[i][1]["line-height"], line[i][1]["font-size"]);
+					fontSize = line[i][1]["font-size"] * 7;
+				}
+				i++;
+			}
+			//if we have to move the cursor to adapt the indent
+			var indentMove = 0;
+			//if a margin was added (by e.g. a text-alignment), move the cursor
+			if (line[0][1]["margin-left"] !== undefined && line[0][1]["margin-left"] > 0) {
+				wantedIndent = this.pdf.internal.getCoordinateString(line[0][1]["margin-left"]);
+				indentMove = wantedIndent - currentIndent;
+				currentIndent = wantedIndent;
+			}
+			//move the cursor
+			out(indentMove, (-1 * defaultFontSize * maxLineHeight).toFixed(2), "Td");
+			i = 0;
+			l = line.length;
+			while (i !== l) {
+				if (line[i][0]) {
+					this.RenderTextFragment(line[i][0], line[i][1]);
+				}
+				i++;
+			}
+			this.y += maxLineHeight * fontToUnitRatio;
+
+			//if some watcher function was executed sucessful, so e.g. margin and widths were changed,
+			//reset line drawing and calculate position and lines again
+			//e.g. to stop text floating around an image
+			if (this.executeWatchFunctions(line[0][1]) && lines.length > 0) {
+				var localFragments = [];
+				var localStyles = [];
+				//create fragement array of
+				lines.forEach(function(localLine) {
+					var i = 0;
+					var l = localLine.length;
+					while (i !== l) {
+						if (localLine[i][0]) {
+							localFragments.push(localLine[i][0]+' ');
+							localStyles.push(localLine[i][1]);
+						}
+						++i;
+					}
+				});
+				//split lines again due to possible coordinate changes
+				lines = this.splitFragmentsIntoLines(PurgeWhiteSpace(localFragments), localStyles);
+				//reposition the current cursor
+				out("ET", "Q");
+				out("q", "BT 0 g", this.pdf.internal.getCoordinateString(this.x), this.pdf.internal.getVerticalCoordinateString(this.y), "Td");
+			}
+
+		}
+		if (cb && typeof cb === "function") {
+			cb.call(this, this.x - 9, this.y - fontSize / 2);
+		}
+		out("ET", "Q");
+		return this.y += paragraphspacing_after;
+	};
+	Renderer.prototype.setBlockBoundary = function (cb) {
+		return this.renderParagraph(cb);
+	};
+	Renderer.prototype.setBlockStyle = function (css) {
+		return this.paragraph.blockstyle = css;
+	};
+	Renderer.prototype.addText = function (text, css) {
+		this.paragraph.text.push(text);
+		return this.paragraph.style.push(css);
+	};
+	FontNameDB = {
+		helvetica         : "helvetica",
+		"sans-serif"      : "helvetica",
+		"times new roman" : "times",
+		serif             : "times",
+		times             : "times",
+		monospace         : "courier",
+		courier           : "courier"
+	};
+	FontWeightMap = {
+		100 : "normal",
+		200 : "normal",
+		300 : "normal",
+		400 : "normal",
+		500 : "bold",
+		600 : "bold",
+		700 : "bold",
+		800 : "bold",
+		900 : "bold",
+		normal  : "normal",
+		bold    : "bold",
+		bolder  : "bold",
+		lighter : "normal"
+	};
+	FontStyleMap = {
+		normal  : "normal",
+		italic  : "italic",
+		oblique : "italic"
+	};
+	TextAlignMap = {
+		left    : "left",
+		right   : "right",
+		center  : "center",
+		justify : "justify"
+	};
+	FloatMap = {
+		none : 'none',
+		right: 'right',
+		left: 'left'
+	};
+	ClearMap = {
+	  none : 'none',
+	  both : 'both'
+	};
+	UnitedNumberMap = {
+		normal : 1
+	};
+	/**
+	 * Converts HTML-formatted text into formatted PDF text.
+	 *
+	 * Notes:
+	 * 2012-07-18
+	 * Plugin relies on having browser, DOM around. The HTML is pushed into dom and traversed.
+	 * Plugin relies on jQuery for CSS extraction.
+	 * Targeting HTML output from Markdown templating, which is a very simple
+	 * markup - div, span, em, strong, p. No br-based paragraph separation supported explicitly (but still may work.)
+	 * Images, tables are NOT supported.
+	 *
+	 * @public
+	 * @function
+	 * @param HTML {String or DOM Element} HTML-formatted text, or pointer to DOM element that is to be rendered into PDF.
+	 * @param x {Number} starting X coordinate in jsPDF instance's declared units.
+	 * @param y {Number} starting Y coordinate in jsPDF instance's declared units.
+	 * @param settings {Object} Additional / optional variables controlling parsing, rendering.
+	 * @returns {Object} jsPDF instance
+	 */
+	jsPDFAPI.fromHTML = function (HTML, x, y, settings, callback, margins) {
+		"use strict";
+
+		this.margins_doc = margins || {
+			top : 0,
+			bottom : 0
+		};
+		if (!settings)
+			settings = {};
+		if (!settings.elementHandlers)
+			settings.elementHandlers = {};
+
+		return process(this, HTML, isNaN(x) ? 4 : x, isNaN(y) ? 4 : y, settings, callback);
+	};
+})(jsPDF.API);
+/** ==================================================================== 
+ * jsPDF JavaScript plugin
+ * Copyright (c) 2013 Youssef Beddad, youssef.beddad@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.
+ * ====================================================================
+ */
+
+/*global jsPDF */
+
+(function (jsPDFAPI) {
+    'use strict';
+    var jsNamesObj, jsJsObj, text;
+    jsPDFAPI.addJS = function (txt) {
+        text = txt;
+        this.internal.events.subscribe(
+            'postPutResources',
+            function (txt) {
+                jsNamesObj = this.internal.newObject();
+                this.internal.write('<< /Names [(EmbeddedJS) ' + (jsNamesObj + 1) + ' 0 R] >>', 'endobj');
+                jsJsObj = this.internal.newObject();
+                this.internal.write('<< /S /JavaScript /JS (', text, ') >>', 'endobj');
+            }
+        );
+        this.internal.events.subscribe(
+            'putCatalog',
+            function () {
+                if (jsNamesObj !== undefined && jsJsObj !== undefined) {
+                    this.internal.write('/Names <</JavaScript ' + jsNamesObj + ' 0 R>>');
+                }
+            }
+        );
+        return this;
+    };
+}(jsPDF.API));
+/**@preserve
+ *  ==================================================================== 
+ * jsPDF PNG PlugIn
+ * Copyright (c) 2014 James Robb, https://github.com/jamesbrobb
+ * 
+ * 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.
+ * ====================================================================
+ */
+
+(function(jsPDFAPI) {
+'use strict'
+	
+	/*
+	 * @see http://www.w3.org/TR/PNG-Chunks.html
+	 * 
+	 Color    Allowed      Interpretation
+	 Type     Bit Depths
+	   
+	   0       1,2,4,8,16  Each pixel is a grayscale sample.
+	   
+	   2       8,16        Each pixel is an R,G,B triple.
+	   
+	   3       1,2,4,8     Each pixel is a palette index;
+	                       a PLTE chunk must appear.
+	   
+	   4       8,16        Each pixel is a grayscale sample,
+	                       followed by an alpha sample.
+	   
+	   6       8,16        Each pixel is an R,G,B triple,
+	                       followed by an alpha sample.
+	*/
+	
+	/*
+	 * PNG filter method types
+	 * 
+	 * @see http://www.w3.org/TR/PNG-Filters.html
+	 * @see http://www.libpng.org/pub/png/book/chapter09.html
+	 * 
+	 * This is what the value 'Predictor' in decode params relates to
+	 * 
+	 * 15 is "optimal prediction", which means the prediction algorithm can change from line to line.
+	 * In that case, you actually have to read the first byte off each line for the prediction algorthim (which should be 0-4, corresponding to PDF 10-14) and select the appropriate unprediction algorithm based on that byte.
+	 *
+	   0       None
+	   1       Sub
+	   2       Up
+	   3       Average
+	   4       Paeth
+	 */
+	
+	var doesNotHavePngJS = function() {
+		return typeof PNG !== 'function' || typeof FlateStream !== 'function';
+	}
+	, canCompress = function(value) {
+		return value !== jsPDFAPI.image_compression.NONE && hasCompressionJS();
+	}
+	, hasCompressionJS = function() {
+		var inst = typeof Deflater === 'function';
+		if(!inst)
+			throw new Error("requires deflate.js for compression")
+		return inst;
+	}
+	, compressBytes = function(bytes, lineLength, colorsPerPixel, compression) {
+		
+		var level = 5,
+			filter_method = filterUp;
+		
+		switch(compression) {
+		
+			case jsPDFAPI.image_compression.FAST:
+				
+				level = 3;
+				filter_method = filterSub;
+				break;
+				
+			case jsPDFAPI.image_compression.MEDIUM:
+				
+				level = 6;
+				filter_method = filterAverage;
+				break;
+				
+			case jsPDFAPI.image_compression.SLOW:
+				
+				level = 9;
+				filter_method = filterPaeth;//uses to sum to choose best filter for each line
+				break;
+		}
+		
+		bytes = applyPngFilterMethod(bytes, lineLength, colorsPerPixel, filter_method);
+		
+		var header = new Uint8Array(createZlibHeader(level));
+		var checksum = adler32(bytes);
+		
+		var deflate = new Deflater(level);
+		var a = deflate.append(bytes);
+		var cBytes = deflate.flush();
+		
+		var len = header.length + a.length + cBytes.length;
+		
+		var cmpd = new Uint8Array(len + 4);
+		cmpd.set(header);
+		cmpd.set(a, header.length);
+		cmpd.set(cBytes, header.length + a.length);
+		
+		cmpd[len++] = (checksum >>> 24) & 0xff;
+		cmpd[len++] = (checksum >>> 16) & 0xff;
+		cmpd[len++] = (checksum >>> 8) & 0xff;
+		cmpd[len++] = checksum & 0xff;
+		
+		return jsPDFAPI.arrayBufferToBinaryString(cmpd);
+	}
+	, createZlibHeader = function(bytes, level){
+		/*
+		 * @see http://www.ietf.org/rfc/rfc1950.txt for zlib header 
+		 */
+		var cm = 8;
+        var cinfo = Math.LOG2E * Math.log(0x8000) - 8;
+        var cmf = (cinfo << 4) | cm;
+        
+        var hdr = cmf << 8;
+        var flevel = Math.min(3, ((level - 1) & 0xff) >> 1);
+        
+        hdr |= (flevel << 6);
+        hdr |= 0;//FDICT
+        hdr += 31 - (hdr % 31);
+        
+        return [cmf, (hdr & 0xff) & 0xff];
+	}
+	, adler32 = function(array, param) {
+		var adler = 1;
+	    var s1 = adler & 0xffff,
+	        s2 = (adler >>> 16) & 0xffff;
+	    var len = array.length;
+	    var tlen;
+	    var i = 0;
+
+	    while (len > 0) {
+	      tlen = len > param ? param : len;
+	      len -= tlen;
+	      do {
+	        s1 += array[i++];
+	        s2 += s1;
+	      } while (--tlen);
+
+	      s1 %= 65521;
+	      s2 %= 65521;
+	    }
+
+	    return ((s2 << 16) | s1) >>> 0;
+	}
+	, applyPngFilterMethod = function(bytes, lineLength, colorsPerPixel, filter_method) {
+		var lines = bytes.length / lineLength,
+			result = new Uint8Array(bytes.length + lines),
+			filter_methods = getFilterMethods(),
+			i = 0, line, prevLine, offset;
+		
+		for(; i < lines; i++) {
+			offset = i * lineLength;
+			line = bytes.subarray(offset, offset + lineLength);
+			
+			if(filter_method) {
+				result.set(filter_method(line, colorsPerPixel, prevLine), offset + i);
+				
+			}else{
+			
+				var j = 0,
+					len = filter_methods.length,
+					results = [];
+				
+				for(; j < len; j++)
+					results[j] = filter_methods[j](line, colorsPerPixel, prevLine);
+				
+				var ind = getIndexOfSmallestSum(results.concat());
+				
+				result.set(results[ind], offset + i);
+			}
+			
+			prevLine = line;
+		}
+		
+		return result;
+	}
+	, filterNone = function(line, colorsPerPixel, prevLine) {
+		/*var result = new Uint8Array(line.length + 1);
+		result[0] = 0;
+		result.set(line, 1);*/
+		
+		var result = Array.apply([], line);
+		result.unshift(0);
+
+		return result;
+	}
+	, filterSub = function(line, colorsPerPixel, prevLine) {
+		var result = [],
+			i = 0,
+			len = line.length,
+			left;
+		
+		result[0] = 1;
+		
+		for(; i < len; i++) {
+			left = line[i - colorsPerPixel] || 0;
+			result[i + 1] = (line[i] - left + 0x0100) & 0xff;
+		}
+		
+		return result;
+	}
+	, filterUp = function(line, colorsPerPixel, prevLine) {
+		var result = [],
+			i = 0,
+			len = line.length,
+			up;
+		
+		result[0] = 2;
+		
+		for(; i < len; i++) {
+			up = prevLine && prevLine[i] || 0;
+			result[i + 1] = (line[i] - up + 0x0100) & 0xff;
+		}
+		
+		return result;
+	}
+	, filterAverage = function(line, colorsPerPixel, prevLine) {
+		var result = [],
+			i = 0,
+			len = line.length,
+			left,
+			up;
+	
+		result[0] = 3;
+		
+		for(; i < len; i++) {
+			left = line[i - colorsPerPixel] || 0;
+			up = prevLine && prevLine[i] || 0;
+			result[i + 1] = (line[i] + 0x0100 - ((left + up) >>> 1)) & 0xff;
+		}
+		
+		return result;
+	}
+	, filterPaeth = function(line, colorsPerPixel, prevLine) {
+		var result = [],
+			i = 0,
+			len = line.length,
+			left,
+			up,
+			upLeft,
+			paeth;
+		
+		result[0] = 4;
+		
+		for(; i < len; i++) {
+			left = line[i - colorsPerPixel] || 0;
+			up = prevLine && prevLine[i] || 0;
+			upLeft = prevLine && prevLine[i - colorsPerPixel] || 0;
+			paeth = paethPredictor(left, up, upLeft);
+			result[i + 1] = (line[i] - paeth + 0x0100) & 0xff;
+		}
+		
+		return result;
+	}
+	,paethPredictor = function(left, up, upLeft) {
+
+		var p = left + up - upLeft,
+	        pLeft = Math.abs(p - left),
+	        pUp = Math.abs(p - up),
+	        pUpLeft = Math.abs(p - upLeft);
+		
+		return (pLeft <= pUp && pLeft <= pUpLeft) ? left : (pUp <= pUpLeft) ? up : upLeft;
+	}
+	, getFilterMethods = function() {
+		return [filterNone, filterSub, filterUp, filterAverage, filterPaeth];
+	}
+	,getIndexOfSmallestSum = function(arrays) {
+		var i = 0,
+			len = arrays.length,
+			sum, min, ind;
+		
+		while(i < len) {
+			sum = absSum(arrays[i].slice(1));
+			
+			if(sum < min || !min) {
+				min = sum;
+				ind = i;
+			}
+			
+			i++;
+		}
+		
+		return ind;
+	}
+	, absSum = function(array) {
+		var i = 0,
+			len = array.length,
+			sum = 0;
+	
+		while(i < len)
+			sum += Math.abs(array[i++]);
+			
+		return sum;
+	}
+	, logImg = function(img) {
+		console.log("width: " + img.width);
+		console.log("height: " + img.height);
+		console.log("bits: " + img.bits);
+		console.log("colorType: " + img.colorType);
+		console.log("transparency:");
+		console.log(img.transparency);
+		console.log("text:");
+		console.log(img.text);
+		console.log("compressionMethod: " + img.compressionMethod);
+		console.log("filterMethod: " + img.filterMethod);
+		console.log("interlaceMethod: " + img.interlaceMethod);
+		console.log("imgData:");
+		console.log(img.imgData);
+		console.log("palette:");
+		console.log(img.palette);
+		console.log("colors: " + img.colors);
+		console.log("colorSpace: " + img.colorSpace);
+		console.log("pixelBitlength: " + img.pixelBitlength);
+		console.log("hasAlphaChannel: " + img.hasAlphaChannel);
+	};
+	
+	
+	
+	
+	jsPDFAPI.processPNG = function(imageData, imageIndex, alias, compression, dataAsBinaryString) {
+		'use strict'
+		
+		var colorSpace = this.color_spaces.DEVICE_RGB,
+			decode = this.decode.FLATE_DECODE,
+			bpc = 8,
+			img, dp, trns,
+			colors, pal, smask;
+		
+	/*	if(this.isString(imageData)) {
+			
+		}*/
+		
+		if(this.isArrayBuffer(imageData))
+			imageData = new Uint8Array(imageData);
+		
+		if(this.isArrayBufferView(imageData)) {
+			
+			if(doesNotHavePngJS())
+				throw new Error("PNG support requires png.js and zlib.js");
+				
+			img = new PNG(imageData);
+			imageData = img.imgData;
+			bpc = img.bits;
+			colorSpace = img.colorSpace;
+			colors = img.colors;
+			
+			//logImg(img);
+			
+			/*
+			 * colorType 6 - Each pixel is an R,G,B triple, followed by an alpha sample.
+			 * 
+			 * colorType 4 - Each pixel is a grayscale sample, followed by an alpha sample.
+			 * 
+			 * Extract alpha to create two separate images, using the alpha as a sMask
+			 */
+			if([4,6].indexOf(img.colorType) !== -1) {
+				
+				/*
+				 * processes 8 bit RGBA and grayscale + alpha images
+				 */
+				if(img.bits === 8) {
+				
+					var pixelsArrayType = window['Uint' + img.pixelBitlength + 'Array'],
+						pixels = new pixelsArrayType(img.decodePixels().buffer),
+						len = pixels.length,
+						imgData = new Uint8Array(len * img.colors),
+						alphaData = new Uint8Array(len),
+						pDiff = img.pixelBitlength - img.bits,
+						i = 0, n = 0, pixel, pbl;
+				
+					for(; i < len; i++) {
+						pixel = pixels[i];
+						pbl = 0;
+						
+						while(pbl < pDiff) {
+							
+							imgData[n++] = ( pixel >>> pbl ) & 0xff;
+							pbl = pbl + img.bits;
+						}
+						
+						alphaData[i] = ( pixel >>> pbl ) & 0xff;
+					}
+				}
+				
+				/*
+				 * processes 16 bit RGBA and grayscale + alpha images
+				 */
+				if(img.bits === 16) {
+					
+					var pixels = new Uint32Array(img.decodePixels().buffer),
+						len = pixels.length,
+						imgData = new Uint8Array((len * (32 / img.pixelBitlength) ) * img.colors),
+						alphaData = new Uint8Array(len * (32 / img.pixelBitlength) ),
+						hasColors = img.colors > 1,
+						i = 0, n = 0, a = 0, pixel;
+					
+					while(i < len) {
+						pixel = pixels[i++];
+						
+						imgData[n++] = (pixel >>> 0) & 0xFF;
+						
+						if(hasColors) {
+							imgData[n++] = (pixel >>> 16) & 0xFF;
+							
+							pixel = pixels[i++];
+							imgData[n++] = (pixel >>> 0) & 0xFF;
+						}
+						
+						alphaData[a++] = (pixel >>> 16) & 0xFF;
+					}
+					
+					bpc = 8;
+				}
+				
+				if(canCompress(compression)) {
+										
+					imageData = compressBytes(imgData, img.width * img.colors, img.colors, compression);
+					smask = compressBytes(alphaData, img.width, 1, compression);
+					
+				}else{
+					
+					imageData = imgData;
+					smask = alphaData;
+					decode = null;
+				}
+			}
+			
+			/*
+			 * Indexed png. Each pixel is a palette index.
+			 */
+			if(img.colorType === 3) {
+				
+				colorSpace = this.color_spaces.INDEXED;
+				pal = img.palette;
+				
+				if(img.transparency.indexed) {
+					
+					var trans = img.transparency.indexed;
+					
+					var total = 0,
+						i = 0,
+						len = trans.length;
+
+					for(; i<len; ++i)
+					    total += trans[i];
+					
+					total = total / 255;
+					
+					/*
+					 * a single color is specified as 100% transparent (0),
+					 * so we set trns to use a /Mask with that index
+					 */
+					if(total === len - 1 && trans.indexOf(0) !== -1) {
+						trns = [trans.indexOf(0)];
+					
+					/*
+					 * there's more than one colour within the palette that specifies
+					 * a transparency value less than 255, so we unroll the pixels to create an image sMask
+					 */
+					}else if(total !== len){
+						
+						var pixels = img.decodePixels(),
+							alphaData = new Uint8Array(pixels.length),
+							i = 0,
+							len = pixels.length;
+						
+						for(; i < len; i++)
+							alphaData[i] = trans[pixels[i]];
+						
+						smask = compressBytes(alphaData, img.width, 1);
+					}
+				}
+			}
+			
+			if(decode === this.decode.FLATE_DECODE)
+				dp = '/Predictor 15 /Colors '+ colors +' /BitsPerComponent '+ bpc +' /Columns '+ img.width;
+			else
+				//remove 'Predictor' as it applies to the type of png filter applied to its IDAT - we only apply with compression
+				dp = '/Colors '+ colors +' /BitsPerComponent '+ bpc +' /Columns '+ img.width;
+			
+			if(this.isArrayBuffer(imageData) || this.isArrayBufferView(imageData))
+				imageData = this.arrayBufferToBinaryString(imageData);
+			
+			if(smask && this.isArrayBuffer(smask) || this.isArrayBufferView(smask))
+				smask = this.arrayBufferToBinaryString(smask);
+			
+			return this.createImageInfo(imageData, img.width, img.height, colorSpace,
+										bpc, decode, imageIndex, alias, dp, trns, pal, smask);
+		}
+		
+		throw new Error("Unsupported PNG image data, try using JPEG instead.");
+	}
+
+})(jsPDF.API)
+/** @preserve
+jsPDF Silly SVG plugin
+Copyright (c) 2012 Willow Systems Corporation, willow-systems.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.
+ * ====================================================================
+ */
+
+;(function(jsPDFAPI) {
+'use strict'
+
+/**
+Parses SVG XML and converts only some of the SVG elements into
+PDF elements.
+
+Supports:
+ paths
+
+@public
+@function
+@param
+@returns {Type}
+*/
+jsPDFAPI.addSVG = function(svgtext, x, y, w, h) {
+	// 'this' is _jsPDF object returned when jsPDF is inited (new jsPDF())
+
+	var undef
+
+	if (x === undef || y === undef) {
+		throw new Error("addSVG needs values for 'x' and 'y'");
+	}
+
+    function InjectCSS(cssbody, document) {
+        var styletag = document.createElement('style');
+        styletag.type = 'text/css';
+        if (styletag.styleSheet) {
+        	// ie
+            styletag.styleSheet.cssText = cssbody;
+        } else {
+        	// others
+            styletag.appendChild(document.createTextNode(cssbody));
+        }
+        document.getElementsByTagName("head")[0].appendChild(styletag);
+    }
+
+	function createWorkerNode(document){
+
+		var frameID = 'childframe' // Date.now().toString() + '_' + (Math.random() * 100).toString()
+		, frame = document.createElement('iframe')
+
+		InjectCSS(
+			'.jsPDF_sillysvg_iframe {display:none;position:absolute;}'
+			, document
+		)
+
+		frame.name = frameID
+		frame.setAttribute("width", 0)
+		frame.setAttribute("height", 0)
+		frame.setAttribute("frameborder", "0")
+		frame.setAttribute("scrolling", "no")
+		frame.setAttribute("seamless", "seamless")
+		frame.setAttribute("class", "jsPDF_sillysvg_iframe")
+		
+		document.body.appendChild(frame)
+
+		return frame
+	}
+
+	function attachSVGToWorkerNode(svgtext, frame){
+		var framedoc = ( frame.contentWindow || frame.contentDocument ).document
+		framedoc.write(svgtext)
+		framedoc.close()
+		return framedoc.getElementsByTagName('svg')[0]
+	}
+
+	function convertPathToPDFLinesArgs(path){
+		'use strict'
+		// we will use 'lines' method call. it needs:
+		// - starting coordinate pair
+		// - array of arrays of vector shifts (2-len for line, 6 len for bezier)
+		// - scale array [horizontal, vertical] ratios
+		// - style (stroke, fill, both)
+
+		var x = parseFloat(path[1])
+		, y = parseFloat(path[2])
+		, vectors = []
+		, position = 3
+		, len = path.length
+
+		while (position < len){
+			if (path[position] === 'c'){
+				vectors.push([
+					parseFloat(path[position + 1])
+					, parseFloat(path[position + 2])
+					, parseFloat(path[position + 3])
+					, parseFloat(path[position + 4])
+					, parseFloat(path[position + 5])
+					, parseFloat(path[position + 6])
+				])
+				position += 7
+			} else if (path[position] === 'l') {
+				vectors.push([
+					parseFloat(path[position + 1])
+					, parseFloat(path[position + 2])
+				])
+				position += 3
+			} else {
+				position += 1
+			}
+		}
+		return [x,y,vectors]
+	}
+
+	var workernode = createWorkerNode(document)
+	, svgnode = attachSVGToWorkerNode(svgtext, workernode)
+	, scale = [1,1]
+	, svgw = parseFloat(svgnode.getAttribute('width'))
+	, svgh = parseFloat(svgnode.getAttribute('height'))
+
+	if (svgw && svgh) {
+		// setting both w and h makes image stretch to size.
+		// this may distort the image, but fits your demanded size
+		if (w && h) {
+			scale = [w / svgw, h / svgh]
+		} 
+		// if only one is set, that value is set as max and SVG 
+		// is scaled proportionately.
+		else if (w) {
+			scale = [w / svgw, w / svgw]
+		} else if (h) {
+			scale = [h / svgh, h / svgh]
+		}
+	}
+
+	var i, l, tmp
+	, linesargs
+	, items = svgnode.childNodes
+	for (i = 0, l = items.length; i < l; i++) {
+		tmp = items[i]
+		if (tmp.tagName && tmp.tagName.toUpperCase() === 'PATH') {
+			linesargs = convertPathToPDFLinesArgs( tmp.getAttribute("d").split(' ') )
+			// path start x coordinate
+			linesargs[0] = linesargs[0] * scale[0] + x // where x is upper left X of image
+			// path start y coordinate
+			linesargs[1] = linesargs[1] * scale[1] + y // where y is upper left Y of image
+			// the rest of lines are vectors. these will adjust with scale value auto.
+			this.lines.call(
+				this
+				, linesargs[2] // lines
+				, linesargs[0] // starting x
+				, linesargs[1] // starting y
+				, scale
+			)
+		}
+	}
+
+	// clean up
+	// workernode.parentNode.removeChild(workernode)
+
+	return this
+}
+
+})(jsPDF.API);
+/** @preserve
+ * jsPDF split_text_to_size plugin - MIT license.
+ * Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
+ *               2014 Diego Casorran, https://github.com/diegocr
+ */
+/**
+ * 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.
+ * ====================================================================
+ */
+
+;(function(API) {
+'use strict'
+
+/**
+Returns an array of length matching length of the 'word' string, with each
+cell ocupied by the width of the char in that position.
+
+@function
+@param word {String}
+@param widths {Object}
+@param kerning {Object}
+@returns {Array}
+*/
+var getCharWidthsArray = API.getCharWidthsArray = function(text, options){
+
+	if (!options) {
+		options = {}
+	}
+
+	var widths = options.widths ? options.widths : this.internal.getFont().metadata.Unicode.widths
+	, widthsFractionOf = widths.fof ? widths.fof : 1
+	, kerning = options.kerning ? options.kerning : this.internal.getFont().metadata.Unicode.kerning
+	, kerningFractionOf = kerning.fof ? kerning.fof : 1
+
+	// console.log("widths, kergnings", widths, kerning)
+
+	var i, l
+	, char_code
+	, prior_char_code = 0 // for kerning
+	, default_char_width = widths[0] || widthsFractionOf
+	, output = []
+
+	for (i = 0, l = text.length; i < l; i++) {
+		char_code = text.charCodeAt(i)
+		output.push(
+			( widths[char_code] || default_char_width ) / widthsFractionOf +
+			( kerning[char_code] && kerning[char_code][prior_char_code] || 0 ) / kerningFractionOf
+		)
+		prior_char_code = char_code
+	}
+
+	return output
+}
+var getArraySum = function(array){
+	var i = array.length
+	, output = 0
+	while(i){
+		;i--;
+		output += array[i]
+	}
+	return output
+}
+/**
+Returns a widths of string in a given font, if the font size is set as 1 point.
+
+In other words, this is "proportional" value. For 1 unit of font size, the length
+of the string will be that much.
+
+Multiply by font size to get actual width in *points*
+Then divide by 72 to get inches or divide by (72/25.6) to get 'mm' etc.
+
+@public
+@function
+@param
+@returns {Type}
+*/
+var getStringUnitWidth = API.getStringUnitWidth = function(text, options) {
+	return getArraySum(getCharWidthsArray.call(this, text, options))
+}
+
+/**
+returns array of lines
+*/
+var splitLongWord = function(word, widths_array, firstLineMaxLen, maxLen){
+	var answer = []
+
+	// 1st, chop off the piece that can fit on the hanging line.
+	var i = 0
+	, l = word.length
+	, workingLen = 0
+	while (i !== l && workingLen + widths_array[i] < firstLineMaxLen){
+		workingLen += widths_array[i]
+		;i++;
+	}
+	// this is first line.
+	answer.push(word.slice(0, i))
+
+	// 2nd. Split the rest into maxLen pieces.
+	var startOfLine = i
+	workingLen = 0
+	while (i !== l){
+		if (workingLen + widths_array[i] > maxLen) {
+			answer.push(word.slice(startOfLine, i))
+			workingLen = 0
+			startOfLine = i
+		}
+		workingLen += widths_array[i]
+		;i++;
+	}
+	if (startOfLine !== i) {
+		answer.push(word.slice(startOfLine, i))
+	}
+
+	return answer
+}
+
+// Note, all sizing inputs for this function must be in "font measurement units"
+// By default, for PDF, it's "point".
+var splitParagraphIntoLines = function(text, maxlen, options){
+	// at this time works only on Western scripts, ones with space char
+	// separating the words. Feel free to expand.
+
+	if (!options) {
+		options = {}
+	}
+
+	var line = []
+	, lines = [line]
+	, line_length = options.textIndent || 0
+	, separator_length = 0
+	, current_word_length = 0
+	, word
+	, widths_array
+	, words = text.split(' ')
+	, spaceCharWidth = getCharWidthsArray(' ', options)[0]
+	, i, l, tmp, lineIndent
+
+	if(options.lineIndent === -1) {
+		lineIndent = words[0].length +2;
+	} else {
+		lineIndent = options.lineIndent || 0;
+	}
+	if(lineIndent) {
+		var pad = Array(lineIndent).join(" "), wrds = [];
+		words.map(function(wrd) {
+			wrd = wrd.split(/\s*\n/);
+			if(wrd.length > 1) {
+				wrds = wrds.concat(wrd.map(function(wrd, idx) {
+					return (idx && wrd.length ? "\n":"") + wrd;
+				}));
+			} else {
+				wrds.push(wrd[0]);
+			}
+		});
+		words = wrds;
+		lineIndent = getStringUnitWidth(pad, options);
+	}
+
+	for (i = 0, l = words.length; i < l; i++) {
+		var force = 0;
+
+		word = words[i]
+		if(lineIndent && word[0] == "\n") {
+			word = word.substr(1);
+			force = 1;
+		}
+		widths_array = getCharWidthsArray(word, options)
+		current_word_length = getArraySum(widths_array)
+
+		if (line_length + separator_length + current_word_length > maxlen || force) {
+			if (current_word_length > maxlen) {
+				// this happens when you have space-less long URLs for example.
+				// we just chop these to size. We do NOT insert hiphens
+				tmp = splitLongWord(word, widths_array, maxlen - (line_length + separator_length), maxlen)
+				// first line we add to existing line object
+				line.push(tmp.shift()) // it's ok to have extra space indicator there
+				// last line we make into new line object
+				line = [tmp.pop()]
+				// lines in the middle we apped to lines object as whole lines
+				while(tmp.length){
+					lines.push([tmp.shift()]) // single fragment occupies whole line
+				}
+				current_word_length = getArraySum( widths_array.slice(word.length - line[0].length) )
+			} else {
+				// just put it on a new line
+				line = [word]
+			}
+
+			// now we attach new line to lines
+			lines.push(line)
+			line_length = current_word_length + lineIndent
+			separator_length = spaceCharWidth
+
+		} else {
+			line.push(word)
+
+			line_length += separator_length + current_word_length
+			separator_length = spaceCharWidth
+		}
+	}
+
+	if(lineIndent) {
+		var postProcess = function(ln, idx) {
+			return (idx ? pad : '') + ln.join(" ");
+		};
+	} else {
+		var postProcess = function(ln) { return ln.join(" ")};
+	}
+
+	return lines.map(postProcess);
+}
+
+/**
+Splits a given string into an array of strings. Uses 'size' value
+(in measurement units declared as default for the jsPDF instance)
+and the font's "widths" and "Kerning" tables, where availabe, to
+determine display length of a given string for a given font.
+
+We use character's 100% of unit size (height) as width when Width
+table or other default width is not available.
+
+@public
+@function
+@param text {String} Unencoded, regular JavaScript (Unicode, UTF-16 / UCS-2) string.
+@param size {Number} Nominal number, measured in units default to this instance of jsPDF.
+@param options {Object} Optional flags needed for chopper to do the right thing.
+@returns {Array} with strings chopped to size.
+*/
+API.splitTextToSize = function(text, maxlen, options) {
+	'use strict'
+
+	if (!options) {
+		options = {}
+	}
+
+	var fsize = options.fontSize || this.internal.getFontSize()
+	, newOptions = (function(options){
+		var widths = {0:1}
+		, kerning = {}
+
+		if (!options.widths || !options.kerning) {
+			var f = this.internal.getFont(options.fontName, options.fontStyle)
+			, encoding = 'Unicode'
+			// NOT UTF8, NOT UTF16BE/LE, NOT UCS2BE/LE
+			// Actual JavaScript-native String's 16bit char codes used.
+			// no multi-byte logic here
+
+			if (f.metadata[encoding]) {
+				return {
+					widths: f.metadata[encoding].widths || widths
+					, kerning: f.metadata[encoding].kerning || kerning
+				}
+			}
+		} else {
+			return 	{
+				widths: options.widths
+				, kerning: options.kerning
+			}
+		}
+
+		// then use default values
+		return 	{
+			widths: widths
+			, kerning: kerning
+		}
+	}).call(this, options)
+
+	// first we split on end-of-line chars
+	var paragraphs
+	if(Array.isArray(text)) {
+		paragraphs = text;
+	} else {
+		paragraphs = text.split(/\r?\n/);
+	}
+
+	// now we convert size (max length of line) into "font size units"
+	// at present time, the "font size unit" is always 'point'
+	// 'proportional' means, "in proportion to font size"
+	var fontUnit_maxLen = 1.0 * this.internal.scaleFactor * maxlen / fsize
+	// at this time, fsize is always in "points" regardless of the default measurement unit of the doc.
+	// this may change in the future?
+	// until then, proportional_maxlen is likely to be in 'points'
+
+	// If first line is to be indented (shorter or longer) than maxLen
+	// we indicate that by using CSS-style "text-indent" option.
+	// here it's in font units too (which is likely 'points')
+	// it can be negative (which makes the first line longer than maxLen)
+	newOptions.textIndent = options.textIndent ?
+		options.textIndent * 1.0 * this.internal.scaleFactor / fsize :
+		0
+	newOptions.lineIndent = options.lineIndent;
+
+	var i, l
+	, output = []
+	for (i = 0, l = paragraphs.length; i < l; i++) {
+		output = output.concat(
+			splitParagraphIntoLines(
+				paragraphs[i]
+				, fontUnit_maxLen
+				, newOptions
+			)
+		)
+	}
+
+	return output
+}
+
+})(jsPDF.API);
+/** @preserve 
+jsPDF standard_fonts_metrics plugin
+Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
+MIT license.
+*/
+/**
+ * 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.
+ * ====================================================================
+ */
+
+;(function(API) {
+'use strict'
+
+/*
+# reference (Python) versions of 'compress' and 'uncompress'
+# only 'uncompress' function is featured lower as JavaScript
+# if you want to unit test "roundtrip", just transcribe the reference
+# 'compress' function from Python into JavaScript
+
+def compress(data):
+
+	keys =   '0123456789abcdef'
+	values = 'klmnopqrstuvwxyz'
+	mapping = dict(zip(keys, values))
+	vals = []
+	for key in data.keys():
+		value = data[key]
+		try:
+			keystring = hex(key)[2:]
+			keystring = keystring[:-1] + mapping[keystring[-1:]]
+		except:
+			keystring = key.join(["'","'"])
+			#print('Keystring is %s' % keystring)
+
+		try:
+			if value < 0:
+				valuestring = hex(value)[3:]
+				numberprefix = '-'
+			else:
+				valuestring = hex(value)[2:]
+				numberprefix = ''
+			valuestring = numberprefix + valuestring[:-1] + mapping[valuestring[-1:]]
+		except:
+			if type(value) == dict:
+				valuestring = compress(value)
+			else:
+				raise Exception("Don't know what to do with value type %s" % type(value))
+
+		vals.append(keystring+valuestring)
+	
+	return '{' + ''.join(vals) + '}'
+
+def uncompress(data):
+
+	decoded = '0123456789abcdef'
+	encoded = 'klmnopqrstuvwxyz'
+	mapping = dict(zip(encoded, decoded))
+
+	sign = +1
+	stringmode = False
+	stringparts = []
+
+	output = {}
+
+	activeobject = output
+	parentchain = []
+
+	keyparts = ''
+	valueparts = ''
+
+	key = None
+
+	ending = set(encoded)
+
+	i = 1
+	l = len(data) - 1 # stripping starting, ending {}
+	while i != l: # stripping {}
+		# -, {, }, ' are special.
+
+		ch = data[i]
+		i += 1
+
+		if ch == "'":
+			if stringmode:
+				# end of string mode
+				stringmode = False
+				key = ''.join(stringparts)
+			else:
+				# start of string mode
+				stringmode = True
+				stringparts = []
+		elif stringmode == True:
+			#print("Adding %s to stringpart" % ch)
+			stringparts.append(ch)
+
+		elif ch == '{':
+			# start of object
+			parentchain.append( [activeobject, key] )
+			activeobject = {}
+			key = None
+			#DEBUG = True
+		elif ch == '}':
+			# end of object
+			parent, key = parentchain.pop()
+			parent[key] = activeobject
+			key = None
+			activeobject = parent
+			#DEBUG = False
+
+		elif ch == '-':
+			sign = -1
+		else:
+			# must be number
+			if key == None:
+				#debug("In Key. It is '%s', ch is '%s'" % (keyparts, ch))
+				if ch in ending:
+					#debug("End of key")
+					keyparts += mapping[ch]
+					key = int(keyparts, 16) * sign
+					sign = +1
+					keyparts = ''
+				else:
+					keyparts += ch
+			else:
+				#debug("In value. It is '%s', ch is '%s'" % (valueparts, ch))
+				if ch in ending:
+					#debug("End of value")
+					valueparts += mapping[ch]
+					activeobject[key] = int(valueparts, 16) * sign
+					sign = +1
+					key = None
+					valueparts = ''
+				else:
+					valueparts += ch
+
+			#debug(activeobject)
+
+	return output
+
+*/
+
+/**
+Uncompresses data compressed into custom, base16-like format. 
+@public
+@function
+@param
+@returns {Type}
+*/
+var uncompress = function(data){
+
+	var decoded = '0123456789abcdef'
+	, encoded = 'klmnopqrstuvwxyz'
+	, mapping = {}
+
+	for (var i = 0; i < encoded.length; i++){
+		mapping[encoded[i]] = decoded[i]
+	}
+
+	var undef
+	, output = {}
+	, sign = 1
+	, stringparts // undef. will be [] in string mode
+	
+	, activeobject = output
+	, parentchain = []
+	, parent_key_pair
+	, keyparts = ''
+	, valueparts = ''
+	, key // undef. will be Truthy when Key is resolved.
+	, datalen = data.length - 1 // stripping ending }
+	, ch
+
+	i = 1 // stripping starting {
+	
+	while (i != datalen){
+		// - { } ' are special.
+
+		ch = data[i]
+		i += 1
+
+		if (ch == "'"){
+			if (stringparts){
+				// end of string mode
+				key = stringparts.join('')
+				stringparts = undef				
+			} else {
+				// start of string mode
+				stringparts = []				
+			}
+		} else if (stringparts){
+			stringparts.push(ch)
+		} else if (ch == '{'){
+			// start of object
+			parentchain.push( [activeobject, key] )
+			activeobject = {}
+			key = undef
+		} else if (ch == '}'){
+			// end of object
+			parent_key_pair = parentchain.pop()
+			parent_key_pair[0][parent_key_pair[1]] = activeobject
+			key = undef
+			activeobject = parent_key_pair[0]
+		} else if (ch == '-'){
+			sign = -1
+		} else {
+			// must be number
+			if (key === undef) {
+				if (mapping.hasOwnProperty(ch)){
+					keyparts += mapping[ch]
+					key = parseInt(keyparts, 16) * sign
+					sign = +1
+					keyparts = ''
+				} else {
+					keyparts += ch
+				}
+			} else {
+				if (mapping.hasOwnProperty(ch)){
+					valueparts += mapping[ch]
+					activeobject[key] = parseInt(valueparts, 16) * sign
+					sign = +1
+					key = undef
+					valueparts = ''
+				} else {
+					valueparts += ch					
+				}
+			}
+		}
+	} // end while
+
+	return output
+}
+
+// encoding = 'Unicode' 
+// NOT UTF8, NOT UTF16BE/LE, NOT UCS2BE/LE. NO clever BOM behavior
+// Actual 16bit char codes used.
+// no multi-byte logic here
+
+// Unicode characters to WinAnsiEncoding:
+// {402: 131, 8211: 150, 8212: 151, 8216: 145, 8217: 146, 8218: 130, 8220: 147, 8221: 148, 8222: 132, 8224: 134, 8225: 135, 8226: 149, 8230: 133, 8364: 128, 8240:137, 8249: 139, 8250: 155, 710: 136, 8482: 153, 338: 140, 339: 156, 732: 152, 352: 138, 353: 154, 376: 159, 381: 142, 382: 158}
+// as you can see, all Unicode chars are outside of 0-255 range. No char code conflicts.
+// this means that you can give Win cp1252 encoded strings to jsPDF for rendering directly
+// as well as give strings with some (supported by these fonts) Unicode characters and 
+// these will be mapped to win cp1252 
+// for example, you can send char code (cp1252) 0x80 or (unicode) 0x20AC, getting "Euro" glyph displayed in both cases.
+
+var encodingBlock = {
+	'codePages': ['WinAnsiEncoding']
+	, 'WinAnsiEncoding': uncompress("{19m8n201n9q201o9r201s9l201t9m201u8m201w9n201x9o201y8o202k8q202l8r202m9p202q8p20aw8k203k8t203t8v203u9v2cq8s212m9t15m8w15n9w2dw9s16k8u16l9u17s9z17x8y17y9y}")
+}
+, encodings = {'Unicode':{
+	'Courier': encodingBlock
+	, 'Courier-Bold': encodingBlock
+	, 'Courier-BoldOblique': encodingBlock
+	, 'Courier-Oblique': encodingBlock
+	, 'Helvetica': encodingBlock
+	, 'Helvetica-Bold': encodingBlock
+	, 'Helvetica-BoldOblique': encodingBlock
+	, 'Helvetica-Oblique': encodingBlock
+	, 'Times-Roman': encodingBlock
+	, 'Times-Bold': encodingBlock
+	, 'Times-BoldItalic': encodingBlock
+	, 'Times-Italic': encodingBlock
+//	, 'Symbol'
+//	, 'ZapfDingbats'
+}}
+/** 
+Resources:
+Font metrics data is reprocessed derivative of contents of
+"Font Metrics for PDF Core 14 Fonts" package, which exhibits the following copyright and license:
+
+Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+
+This file and the 14 PostScript(R) AFM files it accompanies may be used,
+copied, and distributed for any purpose and without charge, with or without
+modification, provided that all copyright notices are retained; that the AFM
+files are not distributed without this file; that all modifications to this
+file or any of the AFM files are prominently noted in the modified file(s);
+and that this paragraph is not modified. Adobe Systems has no responsibility
+or obligation to support the use of the AFM files.
+
+*/
+, fontMetrics = {'Unicode':{
+	// all sizing numbers are n/fontMetricsFractionOf = one font size unit
+	// this means that if fontMetricsFractionOf = 1000, and letter A's width is 476, it's
+	// width is 476/1000 or 47.6% of its height (regardless of font size)
+	// At this time this value applies to "widths" and "kerning" numbers.
+
+	// char code 0 represents "default" (average) width - use it for chars missing in this table.
+	// key 'fof' represents the "fontMetricsFractionOf" value
+
+	'Courier-Oblique': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}")
+	, 'Times-BoldItalic': uncompress("{'widths'{k3o2q4ycx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2r202m2n2n3m2o3m2p5n202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5n4l4m4m4m4n4m4o4s4p4m4q4m4r4s4s4y4t2r4u3m4v4m4w3x4x5t4y4s4z4s5k3x5l4s5m4m5n3r5o3x5p4s5q4m5r5t5s4m5t3x5u3x5v2l5w1w5x2l5y3t5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q2l6r3m6s3r6t1w6u1w6v3m6w1w6x4y6y3r6z3m7k3m7l3m7m2r7n2r7o1w7p3r7q2w7r4m7s3m7t2w7u2r7v2n7w1q7x2n7y3t202l3mcl4mal2ram3man3mao3map3mar3mas2lat4uau1uav3maw3way4uaz2lbk2sbl3t'fof'6obo2lbp3tbq3mbr1tbs2lbu1ybv3mbz3mck4m202k3mcm4mcn4mco4mcp4mcq5ycr4mcs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz2w203k6o212m6o2dw2l2cq2l3t3m3u2l17s3x19m3m}'kerning'{cl{4qu5kt5qt5rs17ss5ts}201s{201ss}201t{cks4lscmscnscoscpscls2wu2yu201ts}201x{2wu2yu}2k{201ts}2w{4qx5kx5ou5qx5rs17su5tu}2x{17su5tu5ou}2y{4qx5kx5ou5qx5rs17ss5ts}'fof'-6ofn{17sw5tw5ou5qw5rs}7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qs}3v{17su5tu5os5qs}7p{17su5tu}ck{4qu5kt5qt5rs17ss5ts}4l{4qu5kt5qt5rs17ss5ts}cm{4qu5kt5qt5rs17ss5ts}cn{4qu5kt5qt5rs17ss5ts}co{4qu5kt5qt5rs17ss5ts}cp{4qu5kt5qt5rs17ss5ts}6l{4qu5ou5qw5rt17su5tu}5q{ckuclucmucnucoucpu4lu}5r{ckuclucmucnucoucpu4lu}7q{cksclscmscnscoscps4ls}6p{4qu5ou5qw5rt17sw5tw}ek{4qu5ou5qw5rt17su5tu}el{4qu5ou5qw5rt17su5tu}em{4qu5ou5qw5rt17su5tu}en{4qu5ou5qw5rt17su5tu}eo{4qu5ou5qw5rt17su5tu}ep{4qu5ou5qw5rt17su5tu}es{17ss5ts5qs4qu}et{4qu5ou5qw5rt17sw5tw}eu{4qu5ou5qw5rt17ss5ts}ev{17ss5ts5qs4qu}6z{17sw5tw5ou5qw5rs}fm{17sw5tw5ou5qw5rs}7n{201ts}fo{17sw5tw5ou5qw5rs}fp{17sw5tw5ou5qw5rs}fq{17sw5tw5ou5qw5rs}7r{cksclscmscnscoscps4ls}fs{17sw5tw5ou5qw5rs}ft{17su5tu}fu{17su5tu}fv{17su5tu}fw{17su5tu}fz{cksclscmscnscoscps4ls}}}")
+	, 'Helvetica-Bold': uncompress("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}")
+	, 'Courier': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}")
+	, 'Courier-BoldOblique': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}")
+	, 'Times-Bold': uncompress("{'widths'{k3q2q5ncx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2l202m2n2n3m2o3m2p6o202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5x4l4s4m4m4n4s4o4s4p4m4q3x4r4y4s4y4t2r4u3m4v4y4w4m4x5y4y4s4z4y5k3x5l4y5m4s5n3r5o4m5p4s5q4s5r6o5s4s5t4s5u4m5v2l5w1w5x2l5y3u5z3m6k2l6l3m6m3r6n2w6o3r6p2w6q2l6r3m6s3r6t1w6u2l6v3r6w1w6x5n6y3r6z3m7k3r7l3r7m2w7n2r7o2l7p3r7q3m7r4s7s3m7t3m7u2w7v2r7w1q7x2r7y3o202l3mcl4sal2lam3man3mao3map3mar3mas2lat4uau1yav3maw3tay4uaz2lbk2sbl3t'fof'6obo2lbp3rbr1tbs2lbu2lbv3mbz3mck4s202k3mcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3rek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3m3u2l17s4s19m3m}'kerning'{cl{4qt5ks5ot5qy5rw17sv5tv}201t{cks4lscmscnscoscpscls4wv}2k{201ts}2w{4qu5ku7mu5os5qx5ru17su5tu}2x{17su5tu5ou5qs}2y{4qv5kv7mu5ot5qz5ru17su5tu}'fof'-6o7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qu}3v{17su5tu5os5qu}fu{17su5tu5ou5qu}7p{17su5tu5ou5qu}ck{4qt5ks5ot5qy5rw17sv5tv}4l{4qt5ks5ot5qy5rw17sv5tv}cm{4qt5ks5ot5qy5rw17sv5tv}cn{4qt5ks5ot5qy5rw17sv5tv}co{4qt5ks5ot5qy5rw17sv5tv}cp{4qt5ks5ot5qy5rw17sv5tv}6l{17st5tt5ou5qu}17s{ckuclucmucnucoucpu4lu4wu}5o{ckuclucmucnucoucpu4lu4wu}5q{ckzclzcmzcnzcozcpz4lz4wu}5r{ckxclxcmxcnxcoxcpx4lx4wu}5t{ckuclucmucnucoucpu4lu4wu}7q{ckuclucmucnucoucpu4lu}6p{17sw5tw5ou5qu}ek{17st5tt5qu}el{17st5tt5ou5qu}em{17st5tt5qu}en{17st5tt5qu}eo{17st5tt5qu}ep{17st5tt5ou5qu}es{17ss5ts5qu}et{17sw5tw5ou5qu}eu{17sw5tw5ou5qu}ev{17ss5ts5qu}6z{17sw5tw5ou5qu5rs}fm{17sw5tw5ou5qu5rs}fn{17sw5tw5ou5qu5rs}fo{17sw5tw5ou5qu5rs}fp{17sw5tw5ou5qu5rs}fq{17sw5tw5ou5qu5rs}7r{cktcltcmtcntcotcpt4lt5os}fs{17sw5tw5ou5qu5rs}ft{17su5tu5ou5qu}7m{5os}fv{17su5tu5ou5qu}fw{17su5tu5ou5qu}fz{cksclscmscnscoscps4ls}}}")
+	//, 'Symbol': uncompress("{'widths'{k3uaw4r19m3m2k1t2l2l202m2y2n3m2p5n202q6o3k3m2s2l2t2l2v3r2w1t3m3m2y1t2z1wbk2sbl3r'fof'6o3n3m3o3m3p3m3q3m3r3m3s3m3t3m3u1w3v1w3w3r3x3r3y3r3z2wbp3t3l3m5v2l5x2l5z3m2q4yfr3r7v3k7w1o7x3k}'kerning'{'fof'-6o}}")
+	, 'Helvetica': uncompress("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}")
+	, 'Helvetica-BoldOblique': uncompress("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}")
+	//, 'ZapfDingbats': uncompress("{'widths'{k4u2k1w'fof'6o}'kerning'{'fof'-6o}}")
+	, 'Courier-Bold': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}")
+	, 'Times-Italic': uncompress("{'widths'{k3n2q4ycx2l201n3m201o5t201s2l201t2l201u2l201w3r201x3r201y3r2k1t2l2l202m2n2n3m2o3m2p5n202q5t2r1p2s2l2t2l2u3m2v4n2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w4n3x4n3y4n3z3m4k5w4l3x4m3x4n4m4o4s4p3x4q3x4r4s4s4s4t2l4u2w4v4m4w3r4x5n4y4m4z4s5k3x5l4s5m3x5n3m5o3r5p4s5q3x5r5n5s3x5t3r5u3r5v2r5w1w5x2r5y2u5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q1w6r3m6s3m6t1w6u1w6v2w6w1w6x4s6y3m6z3m7k3m7l3m7m2r7n2r7o1w7p3m7q2w7r4m7s2w7t2w7u2r7v2s7w1v7x2s7y3q202l3mcl3xal2ram3man3mao3map3mar3mas2lat4wau1vav3maw4nay4waz2lbk2sbl4n'fof'6obo2lbp3mbq3obr1tbs2lbu1zbv3mbz3mck3x202k3mcm3xcn3xco3xcp3xcq5tcr4mcs3xct3xcu3xcv3xcw2l2m2ucy2lcz2ldl4mdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr4nfs3mft3mfu3mfv3mfw3mfz2w203k6o212m6m2dw2l2cq2l3t3m3u2l17s3r19m3m}'kerning'{cl{5kt4qw}201s{201sw}201t{201tw2wy2yy6q-t}201x{2wy2yy}2k{201tw}2w{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}2x{17ss5ts5os}2y{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}'fof'-6o6t{17ss5ts5qs}7t{5os}3v{5qs}7p{17su5tu5qs}ck{5kt4qw}4l{5kt4qw}cm{5kt4qw}cn{5kt4qw}co{5kt4qw}cp{5kt4qw}6l{4qs5ks5ou5qw5ru17su5tu}17s{2ks}5q{ckvclvcmvcnvcovcpv4lv}5r{ckuclucmucnucoucpu4lu}5t{2ks}6p{4qs5ks5ou5qw5ru17su5tu}ek{4qs5ks5ou5qw5ru17su5tu}el{4qs5ks5ou5qw5ru17su5tu}em{4qs5ks5ou5qw5ru17su5tu}en{4qs5ks5ou5qw5ru17su5tu}eo{4qs5ks5ou5qw5ru17su5tu}ep{4qs5ks5ou5qw5ru17su5tu}es{5ks5qs4qs}et{4qs5ks5ou5qw5ru17su5tu}eu{4qs5ks5qw5ru17su5tu}ev{5ks5qs4qs}ex{17ss5ts5qs}6z{4qv5ks5ou5qw5ru17su5tu}fm{4qv5ks5ou5qw5ru17su5tu}fn{4qv5ks5ou5qw5ru17su5tu}fo{4qv5ks5ou5qw5ru17su5tu}fp{4qv5ks5ou5qw5ru17su5tu}fq{4qv5ks5ou5qw5ru17su5tu}7r{5os}fs{4qv5ks5ou5qw5ru17su5tu}ft{17su5tu5qs}fu{17su5tu5qs}fv{17su5tu5qs}fw{17su5tu5qs}}}")
+	, 'Times-Roman': uncompress("{'widths'{k3n2q4ycx2l201n3m201o6o201s2l201t2l201u2l201w2w201x2w201y2w2k1t2l2l202m2n2n3m2o3m2p5n202q6o2r1m2s2l2t2l2u3m2v3s2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v1w3w3s3x3s3y3s3z2w4k5w4l4s4m4m4n4m4o4s4p3x4q3r4r4s4s4s4t2l4u2r4v4s4w3x4x5t4y4s4z4s5k3r5l4s5m4m5n3r5o3x5p4s5q4s5r5y5s4s5t4s5u3x5v2l5w1w5x2l5y2z5z3m6k2l6l2w6m3m6n2w6o3m6p2w6q2l6r3m6s3m6t1w6u1w6v3m6w1w6x4y6y3m6z3m7k3m7l3m7m2l7n2r7o1w7p3m7q3m7r4s7s3m7t3m7u2w7v3k7w1o7x3k7y3q202l3mcl4sal2lam3man3mao3map3mar3mas2lat4wau1vav3maw3say4waz2lbk2sbl3s'fof'6obo2lbp3mbq2xbr1tbs2lbu1zbv3mbz2wck4s202k3mcm4scn4sco4scp4scq5tcr4mcs3xct3xcu3xcv3xcw2l2m2tcy2lcz2ldl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek2wel2wem2wen2weo2wep2weq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr3sfs3mft3mfu3mfv3mfw3mfz3m203k6o212m6m2dw2l2cq2l3t3m3u1w17s4s19m3m}'kerning'{cl{4qs5ku17sw5ou5qy5rw201ss5tw201ws}201s{201ss}201t{ckw4lwcmwcnwcowcpwclw4wu201ts}2k{201ts}2w{4qs5kw5os5qx5ru17sx5tx}2x{17sw5tw5ou5qu}2y{4qs5kw5os5qx5ru17sx5tx}'fof'-6o7t{ckuclucmucnucoucpu4lu5os5rs}3u{17su5tu5qs}3v{17su5tu5qs}7p{17sw5tw5qs}ck{4qs5ku17sw5ou5qy5rw201ss5tw201ws}4l{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cm{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cn{4qs5ku17sw5ou5qy5rw201ss5tw201ws}co{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cp{4qs5ku17sw5ou5qy5rw201ss5tw201ws}6l{17su5tu5os5qw5rs}17s{2ktclvcmvcnvcovcpv4lv4wuckv}5o{ckwclwcmwcnwcowcpw4lw4wu}5q{ckyclycmycnycoycpy4ly4wu5ms}5r{cktcltcmtcntcotcpt4lt4ws}5t{2ktclvcmvcnvcovcpv4lv4wuckv}7q{cksclscmscnscoscps4ls}6p{17su5tu5qw5rs}ek{5qs5rs}el{17su5tu5os5qw5rs}em{17su5tu5os5qs5rs}en{17su5qs5rs}eo{5qs5rs}ep{17su5tu5os5qw5rs}es{5qs}et{17su5tu5qw5rs}eu{17su5tu5qs5rs}ev{5qs}6z{17sv5tv5os5qx5rs}fm{5os5qt5rs}fn{17sv5tv5os5qx5rs}fo{17sv5tv5os5qx5rs}fp{5os5qt5rs}fq{5os5qt5rs}7r{ckuclucmucnucoucpu4lu5os}fs{17sv5tv5os5qx5rs}ft{17ss5ts5qs}fu{17sw5tw5qs}fv{17sw5tw5qs}fw{17ss5ts5qs}fz{ckuclucmucnucoucpu4lu5os5rs}}}")
+	, 'Helvetica-Oblique': uncompress("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}")
+}};
+
+/*
+This event handler is fired when a new jsPDF object is initialized
+This event handler appends metrics data to standard fonts within
+that jsPDF instance. The metrics are mapped over Unicode character
+codes, NOT CIDs or other codes matching the StandardEncoding table of the
+standard PDF fonts.
+Future:
+Also included is the encoding maping table, converting Unicode (UCS-2, UTF-16)
+char codes to StandardEncoding character codes. The encoding table is to be used
+somewhere around "pdfEscape" call.
+*/
+
+API.events.push([ 
+	'addFonts'
+	,function(fontManagementObjects) {
+		// fontManagementObjects is {
+		//	'fonts':font_ID-keyed hash of font objects
+		//	, 'dictionary': lookup object, linking ["FontFamily"]['Style'] to font ID
+		//}
+		var font
+		, fontID
+		, metrics
+		, unicode_section
+		, encoding = 'Unicode'
+		, encodingBlock
+
+		for (fontID in fontManagementObjects.fonts){
+			if (fontManagementObjects.fonts.hasOwnProperty(fontID)) {
+				font = fontManagementObjects.fonts[fontID]
+
+				// // we only ship 'Unicode' mappings and metrics. No need for loop.
+				// // still, leaving this for the future.
+
+				// for (encoding in fontMetrics){
+				// 	if (fontMetrics.hasOwnProperty(encoding)) {
+
+						metrics = fontMetrics[encoding][font.PostScriptName]
+						if (metrics) {
+							if (font.metadata[encoding]) {
+								unicode_section = font.metadata[encoding]
+							} else {
+								unicode_section = font.metadata[encoding] = {}
+							}
+
+							unicode_section.widths = metrics.widths
+							unicode_section.kerning = metrics.kerning
+						}
+				// 	}
+				// }
+				// for (encoding in encodings){
+				// 	if (encodings.hasOwnProperty(encoding)) {
+						encodingBlock = encodings[encoding][font.PostScriptName]
+						if (encodingBlock) {
+							if (font.metadata[encoding]) {
+								unicode_section = font.metadata[encoding]
+							} else {
+								unicode_section = font.metadata[encoding] = {}
+							}
+
+							unicode_section.encoding = encodingBlock
+							if (encodingBlock.codePages && encodingBlock.codePages.length) {
+								font.encoding = encodingBlock.codePages[0]
+							}
+						}
+				// 	}
+				// }
+			}
+		}
+	}
+]) // end of adding event handler
+
+})(jsPDF.API);
+/** ==================================================================== 
+ * jsPDF total_pages plugin
+ * Copyright (c) 2013 Eduardo Menezes de Morais, eduardo.morais@usp.br
+ * 
+ * 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.
+ * ====================================================================
+ */
+
+(function(jsPDFAPI) {
+'use strict';
+
+jsPDFAPI.putTotalPages = function(pageExpression) {
+	'use strict';
+        var replaceExpression = new RegExp(pageExpression, 'g');
+        for (var n = 1; n <= this.internal.getNumberOfPages(); n++) {
+            for (var i = 0; i < this.internal.pages[n].length; i++)
+               this.internal.pages[n][i] = this.internal.pages[n][i].replace(replaceExpression, this.internal.getNumberOfPages());
+        }
+	return this;
+};
+
+})(jsPDF.API);
+/* Blob.js
+ * A Blob implementation.
+ * 2014-07-24
+ *
+ * By Eli Grey, http://eligrey.com
+ * By Devin Samarin, https://github.com/dsamarin
+ * License: X11/MIT
+ *   See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
+ */
+
+/*global self, unescape */
+/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
+  plusplus: true */
+
+/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
+
+(function (view) {
+	"use strict";
+
+	view.URL = view.URL || view.webkitURL;
+
+	if (view.Blob && view.URL) {
+		try {
+			new Blob;
+			return;
+		} catch (e) {}
+	}
+
+	// Internally we use a BlobBuilder implementation to base Blob off of
+	// in order to support older browsers that only have BlobBuilder
+	var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
+		var
+			  get_class = function(object) {
+				return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
+			}
+			, FakeBlobBuilder = function BlobBuilder() {
+				this.data = [];
+			}
+			, FakeBlob = function Blob(data, type, encoding) {
+				this.data = data;
+				this.size = data.length;
+				this.type = type;
+				this.encoding = encoding;
+			}
+			, FBB_proto = FakeBlobBuilder.prototype
+			, FB_proto = FakeBlob.prototype
+			, FileReaderSync = view.FileReaderSync
+			, FileException = function(type) {
+				this.code = this[this.name = type];
+			}
+			, file_ex_codes = (
+				  "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+				+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
+			).split(" ")
+			, file_ex_code = file_ex_codes.length
+			, real_URL = view.URL || view.webkitURL || view
+			, real_create_object_URL = real_URL.createObjectURL
+			, real_revoke_object_URL = real_URL.revokeObjectURL
+			, URL = real_URL
+			, btoa = view.btoa
+			, atob = view.atob
+
+			, ArrayBuffer = view.ArrayBuffer
+			, Uint8Array = view.Uint8Array
+
+			, origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
+		;
+		FakeBlob.fake = FB_proto.fake = true;
+		while (file_ex_code--) {
+			FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
+		}
+		// Polyfill URL
+		if (!real_URL.createObjectURL) {
+			URL = view.URL = function(uri) {
+				var
+					  uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
+					, uri_origin
+				;
+				uri_info.href = uri;
+				if (!("origin" in uri_info)) {
+					if (uri_info.protocol.toLowerCase() === "data:") {
+						uri_info.origin = null;
+					} else {
+						uri_origin = uri.match(origin);
+						uri_info.origin = uri_origin && uri_origin[1];
+					}
+				}
+				return uri_info;
+			};
+		}
+		URL.createObjectURL = function(blob) {
+			var
+				  type = blob.type
+				, data_URI_header
+			;
+			if (type === null) {
+				type = "application/octet-stream";
+			}
+			if (blob instanceof FakeBlob) {
+				data_URI_header = "data:" + type;
+				if (blob.encoding === "base64") {
+					return data_URI_header + ";base64," + blob.data;
+				} else if (blob.encoding === "URI") {
+					return data_URI_header + "," + decodeURIComponent(blob.data);
+				} if (btoa) {
+					return data_URI_header + ";base64," + btoa(blob.data);
+				} else {
+					return data_URI_header + "," + encodeURIComponent(blob.data);
+				}
+			} else if (real_create_object_URL) {
+				return real_create_object_URL.call(real_URL, blob);
+			}
+		};
+		URL.revokeObjectURL = function(object_URL) {
+			if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
+				real_revoke_object_URL.call(real_URL, object_URL);
+			}
+		};
+		FBB_proto.append = function(data/*, endings*/) {
+			var bb = this.data;
+			// decode data to a binary string
+			if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
+				var
+					  str = ""
+					, buf = new Uint8Array(data)
+					, i = 0
+					, buf_len = buf.length
+				;
+				for (; i < buf_len; i++) {
+					str += String.fromCharCode(buf[i]);
+				}
+				bb.push(str);
+			} else if (get_class(data) === "Blob" || get_class(data) === "File") {
+				if (FileReaderSync) {
+					var fr = new FileReaderSync;
+					bb.push(fr.readAsBinaryString(data));
+				} else {
+					// async FileReader won't work as BlobBuilder is sync
+					throw new FileException("NOT_READABLE_ERR");
+				}
+			} else if (data instanceof FakeBlob) {
+				if (data.encoding === "base64" && atob) {
+					bb.push(atob(data.data));
+				} else if (data.encoding === "URI") {
+					bb.push(decodeURIComponent(data.data));
+				} else if (data.encoding === "raw") {
+					bb.push(data.data);
+				}
+			} else {
+				if (typeof data !== "string") {
+					data += ""; // convert unsupported types to strings
+				}
+				// decode UTF-16 to binary string
+				bb.push(unescape(encodeURIComponent(data)));
+			}
+		};
+		FBB_proto.getBlob = function(type) {
+			if (!arguments.length) {
+				type = null;
+			}
+			return new FakeBlob(this.data.join(""), type, "raw");
+		};
+		FBB_proto.toString = function() {
+			return "[object BlobBuilder]";
+		};
+		FB_proto.slice = function(start, end, type) {
+			var args = arguments.length;
+			if (args < 3) {
+				type = null;
+			}
+			return new FakeBlob(
+				  this.data.slice(start, args > 1 ? end : this.data.length)
+				, type
+				, this.encoding
+			);
+		};
+		FB_proto.toString = function() {
+			return "[object Blob]";
+		};
+		FB_proto.close = function() {
+			this.size = 0;
+			delete this.data;
+		};
+		return FakeBlobBuilder;
+	}(view));
+
+	view.Blob = function(blobParts, options) {
+		var type = options ? (options.type || "") : "";
+		var builder = new BlobBuilder();
+		if (blobParts) {
+			for (var i = 0, len = blobParts.length; i < len; i++) {
+				builder.append(blobParts[i]);
+			}
+		}
+		return builder.getBlob(type);
+	};
+}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
+/* FileSaver.js
+ * A saveAs() FileSaver implementation.
+ * 2014-08-29
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: X11/MIT
+ *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
+ */
+
+/*global self */
+/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
+
+/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
+
+var saveAs = saveAs
+  // IE 10+ (native saveAs)
+  || (typeof navigator !== "undefined" &&
+      navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
+  // Everyone else
+  || (function(view) {
+	"use strict";
+	// IE <10 is explicitly unsupported
+	if (typeof navigator !== "undefined" &&
+	    /MSIE [1-9]\./.test(navigator.userAgent)) {
+		return;
+	}
+	var
+		  doc = view.document
+		  // only get URL when necessary in case Blob.js hasn't overridden it yet
+		, get_URL = function() {
+			return view.URL || view.webkitURL || view;
+		}
+		, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
+		, can_use_save_link = "download" in save_link
+		, click = function(node) {
+			var event = doc.createEvent("MouseEvents");
+			event.initMouseEvent(
+				"click", true, false, view, 0, 0, 0, 0, 0
+				, false, false, false, false, 0, null
+			);
+			node.dispatchEvent(event);
+		}
+		, webkit_req_fs = view.webkitRequestFileSystem
+		, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
+		, throw_outside = function(ex) {
+			(view.setImmediate || view.setTimeout)(function() {
+				throw ex;
+			}, 0);
+		}
+		, force_saveable_type = "application/octet-stream"
+		, fs_min_size = 0
+		// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
+		// the reasoning behind the timeout and revocation flow
+		, arbitrary_revoke_timeout = 10
+		, revoke = function(file) {
+			var revoker = function() {
+				if (typeof file === "string") { // file is an object URL
+					get_URL().revokeObjectURL(file);
+				} else { // file is a File
+					file.remove();
+				}
+			};
+			if (view.chrome) {
+				revoker();
+			} else {
+				setTimeout(revoker, arbitrary_revoke_timeout);
+			}
+		}
+		, dispatch = function(filesaver, event_types, event) {
+			event_types = [].concat(event_types);
+			var i = event_types.length;
+			while (i--) {
+				var listener = filesaver["on" + event_types[i]];
+				if (typeof listener === "function") {
+					try {
+						listener.call(filesaver, event || filesaver);
+					} catch (ex) {
+						throw_outside(ex);
+					}
+				}
+			}
+		}
+		, FileSaver = function(blob, name) {
+			// First try a.download, then web filesystem, then object URLs
+			var
+				  filesaver = this
+				, type = blob.type
+				, blob_changed = false
+				, object_url
+				, target_view
+				, dispatch_all = function() {
+					dispatch(filesaver, "writestart progress write writeend".split(" "));
+				}
+				// on any filesys errors revert to saving with object URLs
+				, fs_error = function() {
+					// don't create more object URLs than needed
+					if (blob_changed || !object_url) {
+						object_url = get_URL().createObjectURL(blob);
+					}
+					if (target_view) {
+						target_view.location.href = object_url;
+					} else {
+						var new_tab = view.open(object_url, "_blank");
+						if (new_tab == undefined && typeof safari !== "undefined") {
+							//Apple do not allow window.open, see http://bit.ly/1kZffRI
+							view.location.href = object_url
+						}
+					}
+					filesaver.readyState = filesaver.DONE;
+					dispatch_all();
+					revoke(object_url);
+				}
+				, abortable = function(func) {
+					return function() {
+						if (filesaver.readyState !== filesaver.DONE) {
+							return func.apply(this, arguments);
+						}
+					};
+				}
+				, create_if_not_found = {create: true, exclusive: false}
+				, slice
+			;
+			filesaver.readyState = filesaver.INIT;
+			if (!name) {
+				name = "download";
+			}
+			if (can_use_save_link) {
+				object_url = get_URL().createObjectURL(blob);
+				save_link.href = object_url;
+				save_link.download = name;
+				click(save_link);
+				filesaver.readyState = filesaver.DONE;
+				dispatch_all();
+				revoke(object_url);
+				return;
+			}
+			// Object and web filesystem URLs have a problem saving in Google Chrome when
+			// viewed in a tab, so I force save with application/octet-stream
+			// http://code.google.com/p/chromium/issues/detail?id=91158
+			// Update: Google errantly closed 91158, I submitted it again:
+			// https://code.google.com/p/chromium/issues/detail?id=389642
+			if (view.chrome && type && type !== force_saveable_type) {
+				slice = blob.slice || blob.webkitSlice;
+				blob = slice.call(blob, 0, blob.size, force_saveable_type);
+				blob_changed = true;
+			}
+			// Since I can't be sure that the guessed media type will trigger a download
+			// in WebKit, I append .download to the filename.
+			// https://bugs.webkit.org/show_bug.cgi?id=65440
+			if (webkit_req_fs && name !== "download") {
+				name += ".download";
+			}
+			if (type === force_saveable_type || webkit_req_fs) {
+				target_view = view;
+			}
+			if (!req_fs) {
+				fs_error();
+				return;
+			}
+			fs_min_size += blob.size;
+			req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
+				fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
+					var save = function() {
+						dir.getFile(name, create_if_not_found, abortable(function(file) {
+							file.createWriter(abortable(function(writer) {
+								writer.onwriteend = function(event) {
+									target_view.location.href = file.toURL();
+									filesaver.readyState = filesaver.DONE;
+									dispatch(filesaver, "writeend", event);
+									revoke(file);
+								};
+								writer.onerror = function() {
+									var error = writer.error;
+									if (error.code !== error.ABORT_ERR) {
+										fs_error();
+									}
+								};
+								"writestart progress write abort".split(" ").forEach(function(event) {
+									writer["on" + event] = filesaver["on" + event];
+								});
+								writer.write(blob);
+								filesaver.abort = function() {
+									writer.abort();
+									filesaver.readyState = filesaver.DONE;
+								};
+								filesaver.readyState = filesaver.WRITING;
+							}), fs_error);
+						}), fs_error);
+					};
+					dir.getFile(name, {create: false}, abortable(function(file) {
+						// delete file if it already exists
+						file.remove();
+						save();
+					}), abortable(function(ex) {
+						if (ex.code === ex.NOT_FOUND_ERR) {
+							save();
+						} else {
+							fs_error();
+						}
+					}));
+				}), fs_error);
+			}), fs_error);
+		}
+		, FS_proto = FileSaver.prototype
+		, saveAs = function(blob, name) {
+			return new FileSaver(blob, name);
+		}
+	;
+	FS_proto.abort = function() {
+		var filesaver = this;
+		filesaver.readyState = filesaver.DONE;
+		dispatch(filesaver, "abort");
+	};
+	FS_proto.readyState = FS_proto.INIT = 0;
+	FS_proto.WRITING = 1;
+	FS_proto.DONE = 2;
+
+	FS_proto.error =
+	FS_proto.onwritestart =
+	FS_proto.onprogress =
+	FS_proto.onwrite =
+	FS_proto.onabort =
+	FS_proto.onerror =
+	FS_proto.onwriteend =
+		null;
+
+	return saveAs;
+}(
+	   typeof self !== "undefined" && self
+	|| typeof window !== "undefined" && window
+	|| this.content
+));
+// `self` is undefined in Firefox for Android content script context
+// while `this` is nsIContentFrameMessageManager
+// with an attribute `content` that corresponds to the window
+
+if (typeof module !== "undefined" && module !== null) {
+  module.exports = saveAs;
+} else if ((typeof define !== "undefined" && 0)) {
+  define([], function() {
+    return saveAs;
+  });
+}
+/*
+ * Copyright (c) 2012 chick307 <chick307@gmail.com>
+ *
+ * Licensed under the MIT License.
+ * http://opensource.org/licenses/mit-license
+ */
+
+void function(global, callback) {
+	if (typeof module === 'object') {
+		module.exports = callback();
+	} else if (0 === 'function') {
+		define(callback);
+	} else {
+		global.adler32cs = callback();
+	}
+}(jsPDF, function() {
+	var _hasArrayBuffer = typeof ArrayBuffer === 'function' &&
+		typeof Uint8Array === 'function';
+
+	var _Buffer = null, _isBuffer = (function() {
+		if (!_hasArrayBuffer)
+			return function _isBuffer() { return false };
+
+		try {
+			var buffer = require('buffer');
+			if (typeof buffer.Buffer === 'function')
+				_Buffer = buffer.Buffer;
+		} catch (error) {}
+
+		return function _isBuffer(value) {
+			return value instanceof ArrayBuffer ||
+				_Buffer !== null && value instanceof _Buffer;
+		};
+	}());
+
+	var _utf8ToBinary = (function() {
+		if (_Buffer !== null) {
+			return function _utf8ToBinary(utf8String) {
+				return new _Buffer(utf8String, 'utf8').toString('binary');
+			};
+		} else {
+			return function _utf8ToBinary(utf8String) {
+				return unescape(encodeURIComponent(utf8String));
+			};
+		}
+	}());
+
+	var MOD = 65521;
+
+	var _update = function _update(checksum, binaryString) {
+		var a = checksum & 0xFFFF, b = checksum >>> 16;
+		for (var i = 0, length = binaryString.length; i < length; i++) {
+			a = (a + (binaryString.charCodeAt(i) & 0xFF)) % MOD;
+			b = (b + a) % MOD;
+		}
+		return (b << 16 | a) >>> 0;
+	};
+
+	var _updateUint8Array = function _updateUint8Array(checksum, uint8Array) {
+		var a = checksum & 0xFFFF, b = checksum >>> 16;
+		for (var i = 0, length = uint8Array.length, x; i < length; i++) {
+			a = (a + uint8Array[i]) % MOD;
+			b = (b + a) % MOD;
+		}
+		return (b << 16 | a) >>> 0
+	};
+
+	var exports = {};
+
+	var Adler32 = exports.Adler32 = (function() {
+		var ctor = function Adler32(checksum) {
+			if (!(this instanceof ctor)) {
+				throw new TypeError(
+					'Constructor cannot called be as a function.');
+			}
+			if (!isFinite(checksum = checksum == null ? 1 : +checksum)) {
+				throw new Error(
+					'First arguments needs to be a finite number.');
+			}
+			this.checksum = checksum >>> 0;
+		};
+
+		var proto = ctor.prototype = {};
+		proto.constructor = ctor;
+
+		ctor.from = function(from) {
+			from.prototype = proto;
+			return from;
+		}(function from(binaryString) {
+			if (!(this instanceof ctor)) {
+				throw new TypeError(
+					'Constructor cannot called be as a function.');
+			}
+			if (binaryString == null)
+				throw new Error('First argument needs to be a string.');
+			this.checksum = _update(1, binaryString.toString());
+		});
+
+		ctor.fromUtf8 = function(fromUtf8) {
+			fromUtf8.prototype = proto;
+			return fromUtf8;
+		}(function fromUtf8(utf8String) {
+			if (!(this instanceof ctor)) {
+				throw new TypeError(
+					'Constructor cannot called be as a function.');
+			}
+			if (utf8String == null)
+				throw new Error('First argument needs to be a string.');
+			var binaryString = _utf8ToBinary(utf8String.toString());
+			this.checksum = _update(1, binaryString);
+		});
+
+		if (_hasArrayBuffer) {
+			ctor.fromBuffer = function(fromBuffer) {
+				fromBuffer.prototype = proto;
+				return fromBuffer;
+			}(function fromBuffer(buffer) {
+				if (!(this instanceof ctor)) {
+					throw new TypeError(
+						'Constructor cannot called be as a function.');
+				}
+				if (!_isBuffer(buffer))
+					throw new Error('First argument needs to be ArrayBuffer.');
+				var array = new Uint8Array(buffer);
+				return this.checksum = _updateUint8Array(1, array);
+			});
+		}
+
+		proto.update = function update(binaryString) {
+			if (binaryString == null)
+				throw new Error('First argument needs to be a string.');
+			binaryString = binaryString.toString();
+			return this.checksum = _update(this.checksum, binaryString);
+		};
+
+		proto.updateUtf8 = function updateUtf8(utf8String) {
+			if (utf8String == null)
+				throw new Error('First argument needs to be a string.');
+			var binaryString = _utf8ToBinary(utf8String.toString());
+			return this.checksum = _update(this.checksum, binaryString);
+		};
+
+		if (_hasArrayBuffer) {
+			proto.updateBuffer = function updateBuffer(buffer) {
+				if (!_isBuffer(buffer))
+					throw new Error('First argument needs to be ArrayBuffer.');
+				var array = new Uint8Array(buffer);
+				return this.checksum = _updateUint8Array(this.checksum, array);
+			};
+		}
+
+		proto.clone = function clone() {
+			return new Adler32(this.checksum);
+		};
+
+		return ctor;
+	}());
+
+	exports.from = function from(binaryString) {
+		if (binaryString == null)
+			throw new Error('First argument needs to be a string.');
+		return _update(1, binaryString.toString());
+	};
+
+	exports.fromUtf8 = function fromUtf8(utf8String) {
+		if (utf8String == null)
+			throw new Error('First argument needs to be a string.');
+		var binaryString = _utf8ToBinary(utf8String.toString());
+		return _update(1, binaryString);
+	};
+
+	if (_hasArrayBuffer) {
+		exports.fromBuffer = function fromBuffer(buffer) {
+			if (!_isBuffer(buffer))
+				throw new Error('First argument need to be ArrayBuffer.');
+			var array = new Uint8Array(buffer);
+			return _updateUint8Array(1, array);
+		};
+	}
+
+	return exports;
+});
+/*
+ Deflate.js - https://github.com/gildas-lormeau/zip.js
+ Copyright (c) 2013 Gildas Lormeau. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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 (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This program is based on JZlib 1.0.2 ymnk, JCraft,Inc.
+ * JZlib is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+var Deflater = (function(obj) {
+
+	// Global
+
+	var MAX_BITS = 15;
+	var D_CODES = 30;
+	var BL_CODES = 19;
+
+	var LENGTH_CODES = 29;
+	var LITERALS = 256;
+	var L_CODES = (LITERALS + 1 + LENGTH_CODES);
+	var HEAP_SIZE = (2 * L_CODES + 1);
+
+	var END_BLOCK = 256;
+
+	// Bit length codes must not exceed MAX_BL_BITS bits
+	var MAX_BL_BITS = 7;
+
+	// repeat previous bit length 3-6 times (2 bits of repeat count)
+	var REP_3_6 = 16;
+
+	// repeat a zero length 3-10 times (3 bits of repeat count)
+	var REPZ_3_10 = 17;
+
+	// repeat a zero length 11-138 times (7 bits of repeat count)
+	var REPZ_11_138 = 18;
+
+	// The lengths of the bit length codes are sent in order of decreasing
+	// probability, to avoid transmitting the lengths for unused bit
+	// length codes.
+
+	var Buf_size = 8 * 2;
+
+	// JZlib version : "1.0.2"
+	var Z_DEFAULT_COMPRESSION = -1;
+
+	// compression strategy
+	var Z_FILTERED = 1;
+	var Z_HUFFMAN_ONLY = 2;
+	var Z_DEFAULT_STRATEGY = 0;
+
+	var Z_NO_FLUSH = 0;
+	var Z_PARTIAL_FLUSH = 1;
+	var Z_FULL_FLUSH = 3;
+	var Z_FINISH = 4;
+
+	var Z_OK = 0;
+	var Z_STREAM_END = 1;
+	var Z_NEED_DICT = 2;
+	var Z_STREAM_ERROR = -2;
+	var Z_DATA_ERROR = -3;
+	var Z_BUF_ERROR = -5;
+
+	// Tree
+
+	// see definition of array dist_code below
+	var _dist_code = [ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+			10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+			12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+			13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+			14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+			14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+			15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19,
+			20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+			24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+			26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+			27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+			28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29,
+			29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+			29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 ];
+
+	function Tree() {
+		var that = this;
+
+		// dyn_tree; // the dynamic tree
+		// max_code; // largest code with non zero frequency
+		// stat_desc; // the corresponding static tree
+
+		// Compute the optimal bit lengths for a tree and update the total bit
+		// length
+		// for the current block.
+		// IN assertion: the fields freq and dad are set, heap[heap_max] and
+		// above are the tree nodes sorted by increasing frequency.
+		// OUT assertions: the field len is set to the optimal bit length, the
+		// array bl_count contains the frequencies for each bit length.
+		// The length opt_len is updated; static_len is also updated if stree is
+		// not null.
+		function gen_bitlen(s) {
+			var tree = that.dyn_tree;
+			var stree = that.stat_desc.static_tree;
+			var extra = that.stat_desc.extra_bits;
+			var base = that.stat_desc.extra_base;
+			var max_length = that.stat_desc.max_length;
+			var h; // heap index
+			var n, m; // iterate over the tree elements
+			var bits; // bit length
+			var xbits; // extra bits
+			var f; // frequency
+			var overflow = 0; // number of elements with bit length too large
+
+			for (bits = 0; bits <= MAX_BITS; bits++)
+				s.bl_count[bits] = 0;
+
+			// In a first pass, compute the optimal bit lengths (which may
+			// overflow in the case of the bit length tree).
+			tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap
+
+			for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
+				n = s.heap[h];
+				bits = tree[tree[n * 2 + 1] * 2 + 1] + 1;
+				if (bits > max_length) {
+					bits = max_length;
+					overflow++;
+				}
+				tree[n * 2 + 1] = bits;
+				// We overwrite tree[n*2+1] which is no longer needed
+
+				if (n > that.max_code)
+					continue; // not a leaf node
+
+				s.bl_count[bits]++;
+				xbits = 0;
+				if (n >= base)
+					xbits = extra[n - base];
+				f = tree[n * 2];
+				s.opt_len += f * (bits + xbits);
+				if (stree)
+					s.static_len += f * (stree[n * 2 + 1] + xbits);
+			}
+			if (overflow === 0)
+				return;
+
+			// This happens for example on obj2 and pic of the Calgary corpus
+			// Find the first bit length which could increase:
+			do {
+				bits = max_length - 1;
+				while (s.bl_count[bits] === 0)
+					bits--;
+				s.bl_count[bits]--; // move one leaf down the tree
+				s.bl_count[bits + 1] += 2; // move one overflow item as its brother
+				s.bl_count[max_length]--;
+				// The brother of the overflow item also moves one step up,
+				// but this does not affect bl_count[max_length]
+				overflow -= 2;
+			} while (overflow > 0);
+
+			for (bits = max_length; bits !== 0; bits--) {
+				n = s.bl_count[bits];
+				while (n !== 0) {
+					m = s.heap[--h];
+					if (m > that.max_code)
+						continue;
+					if (tree[m * 2 + 1] != bits) {
+						s.opt_len += (bits - tree[m * 2 + 1]) * tree[m * 2];
+						tree[m * 2 + 1] = bits;
+					}
+					n--;
+				}
+			}
+		}
+
+		// Reverse the first len bits of a code, using straightforward code (a
+		// faster
+		// method would use a table)
+		// IN assertion: 1 <= len <= 15
+		function bi_reverse(code, // the value to invert
+		len // its bit length
+		) {
+			var res = 0;
+			do {
+				res |= code & 1;
+				code >>>= 1;
+				res <<= 1;
+			} while (--len > 0);
+			return res >>> 1;
+		}
+
+		// Generate the codes for a given tree and bit counts (which need not be
+		// optimal).
+		// IN assertion: the array bl_count contains the bit length statistics for
+		// the given tree and the field len is set for all tree elements.
+		// OUT assertion: the field code is set for all tree elements of non
+		// zero code length.
+		function gen_codes(tree, // the tree to decorate
+		max_code, // largest code with non zero frequency
+		bl_count // number of codes at each bit length
+		) {
+			var next_code = []; // next code value for each
+			// bit length
+			var code = 0; // running code value
+			var bits; // bit index
+			var n; // code index
+			var len;
+
+			// The distribution counts are first used to generate the code values
+			// without bit reversal.
+			for (bits = 1; bits <= MAX_BITS; bits++) {
+				next_code[bits] = code = ((code + bl_count[bits - 1]) << 1);
+			}
+
+			// Check that the bit counts in bl_count are consistent. The last code
+			// must be all ones.
+			// Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+			// "inconsistent bit counts");
+			// Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+			for (n = 0; n <= max_code; n++) {
+				len = tree[n * 2 + 1];
+				if (len === 0)
+					continue;
+				// Now reverse the bits
+				tree[n * 2] = bi_reverse(next_code[len]++, len);
+			}
+		}
+
+		// Construct one Huffman tree and assigns the code bit strings and lengths.
+		// Update the total bit length for the current block.
+		// IN assertion: the field freq is set for all tree elements.
+		// OUT assertions: the fields len and code are set to the optimal bit length
+		// and corresponding code. The length opt_len is updated; static_len is
+		// also updated if stree is not null. The field max_code is set.
+		that.build_tree = function(s) {
+			var tree = that.dyn_tree;
+			var stree = that.stat_desc.static_tree;
+			var elems = that.stat_desc.elems;
+			var n, m; // iterate over heap elements
+			var max_code = -1; // largest code with non zero frequency
+			var node; // new node being created
+
+			// Construct the initial heap, with least frequent element in
+			// heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+			// heap[0] is not used.
+			s.heap_len = 0;
+			s.heap_max = HEAP_SIZE;
+
+			for (n = 0; n < elems; n++) {
+				if (tree[n * 2] !== 0) {
+					s.heap[++s.heap_len] = max_code = n;
+					s.depth[n] = 0;
+				} else {
+					tree[n * 2 + 1] = 0;
+				}
+			}
+
+			// The pkzip format requires that at least one distance code exists,
+			// and that at least one bit should be sent even if there is only one
+			// possible code. So to avoid special checks later on we force at least
+			// two codes of non zero frequency.
+			while (s.heap_len < 2) {
+				node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0;
+				tree[node * 2] = 1;
+				s.depth[node] = 0;
+				s.opt_len--;
+				if (stree)
+					s.static_len -= stree[node * 2 + 1];
+				// node is 0 or 1 so it does not have extra bits
+			}
+			that.max_code = max_code;
+
+			// The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+			// establish sub-heaps of increasing lengths:
+
+			for (n = Math.floor(s.heap_len / 2); n >= 1; n--)
+				s.pqdownheap(tree, n);
+
+			// Construct the Huffman tree by repeatedly combining the least two
+			// frequent nodes.
+
+			node = elems; // next internal node of the tree
+			do {
+				// n = node of least frequency
+				n = s.heap[1];
+				s.heap[1] = s.heap[s.heap_len--];
+				s.pqdownheap(tree, 1);
+				m = s.heap[1]; // m = node of next least frequency
+
+				s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency
+				s.heap[--s.heap_max] = m;
+
+				// Create a new node father of n and m
+				tree[node * 2] = (tree[n * 2] + tree[m * 2]);
+				s.depth[node] = Math.max(s.depth[n], s.depth[m]) + 1;
+				tree[n * 2 + 1] = tree[m * 2 + 1] = node;
+
+				// and insert the new node in the heap
+				s.heap[1] = node++;
+				s.pqdownheap(tree, 1);
+			} while (s.heap_len >= 2);
+
+			s.heap[--s.heap_max] = s.heap[1];
+
+			// At this point, the fields freq and dad are set. We can now
+			// generate the bit lengths.
+
+			gen_bitlen(s);
+
+			// The field len is now set, we can generate the bit codes
+			gen_codes(tree, that.max_code, s.bl_count);
+		};
+
+	}
+
+	Tree._length_code = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
+			16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+			20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+			22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+			24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+			25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+			26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 ];
+
+	Tree.base_length = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 ];
+
+	Tree.base_dist = [ 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384,
+			24576 ];
+
+	// Mapping from a distance to a distance code. dist is the distance - 1 and
+	// must not have side effects. _dist_code[256] and _dist_code[257] are never
+	// used.
+	Tree.d_code = function(dist) {
+		return ((dist) < 256 ? _dist_code[dist] : _dist_code[256 + ((dist) >>> 7)]);
+	};
+
+	// extra bits for each length code
+	Tree.extra_lbits = [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 ];
+
+	// extra bits for each distance code
+	Tree.extra_dbits = [ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 ];
+
+	// extra bits for each bit length code
+	Tree.extra_blbits = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7 ];
+
+	Tree.bl_order = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
+
+	// StaticTree
+
+	function StaticTree(static_tree, extra_bits, extra_base, elems, max_length) {
+		var that = this;
+		that.static_tree = static_tree;
+		that.extra_bits = extra_bits;
+		that.extra_base = extra_base;
+		that.elems = elems;
+		that.max_length = max_length;
+	}
+
+	StaticTree.static_ltree = [ 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8, 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8, 2, 8,
+			130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8, 18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, 202, 8, 42,
+			8, 170, 8, 106, 8, 234, 8, 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, 6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8,
+			22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8, 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8, 30, 8, 158, 8, 94, 8,
+			222, 8, 62, 8, 190, 8, 126, 8, 254, 8, 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113,
+			8, 241, 8, 9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, 5, 8, 133, 8,
+			69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8, 13, 8, 141, 8, 77, 8, 205, 8, 45, 8,
+			173, 8, 109, 8, 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9,
+			51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9, 43, 9, 299, 9, 171, 9,
+			427, 9, 107, 9, 363, 9, 235, 9, 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9, 59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379,
+			9, 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, 23,
+			9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, 55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9, 15, 9, 271, 9, 143, 9,
+			399, 9, 79, 9, 335, 9, 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9,
+			223, 9, 479, 9, 63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, 0, 7, 64, 7, 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, 72, 7,
+			40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, 4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8,
+			99, 8, 227, 8 ];
+
+	StaticTree.static_dtree = [ 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5, 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5, 1, 5, 17, 5, 9, 5,
+			25, 5, 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 ];
+
+	StaticTree.static_l_desc = new StaticTree(StaticTree.static_ltree, Tree.extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
+
+	StaticTree.static_d_desc = new StaticTree(StaticTree.static_dtree, Tree.extra_dbits, 0, D_CODES, MAX_BITS);
+
+	StaticTree.static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, BL_CODES, MAX_BL_BITS);
+
+	// Deflate
+
+	var MAX_MEM_LEVEL = 9;
+	var DEF_MEM_LEVEL = 8;
+
+	function Config(good_length, max_lazy, nice_length, max_chain, func) {
+		var that = this;
+		that.good_length = good_length;
+		that.max_lazy = max_lazy;
+		that.nice_length = nice_length;
+		that.max_chain = max_chain;
+		that.func = func;
+	}
+
+	var STORED = 0;
+	var FAST = 1;
+	var SLOW = 2;
+	var config_table = [ new Config(0, 0, 0, 0, STORED), new Config(4, 4, 8, 4, FAST), new Config(4, 5, 16, 8, FAST), new Config(4, 6, 32, 32, FAST),
+			new Config(4, 4, 16, 16, SLOW), new Config(8, 16, 32, 32, SLOW), new Config(8, 16, 128, 128, SLOW), new Config(8, 32, 128, 256, SLOW),
+			new Config(32, 128, 258, 1024, SLOW), new Config(32, 258, 258, 4096, SLOW) ];
+
+	var z_errmsg = [ "need dictionary", // Z_NEED_DICT
+	// 2
+	"stream end", // Z_STREAM_END 1
+	"", // Z_OK 0
+	"", // Z_ERRNO (-1)
+	"stream error", // Z_STREAM_ERROR (-2)
+	"data error", // Z_DATA_ERROR (-3)
+	"", // Z_MEM_ERROR (-4)
+	"buffer error", // Z_BUF_ERROR (-5)
+	"",// Z_VERSION_ERROR (-6)
+	"" ];
+
+	// block not completed, need more input or more output
+	var NeedMore = 0;
+
+	// block flush performed
+	var BlockDone = 1;
+
+	// finish started, need only more output at next deflate
+	var FinishStarted = 2;
+
+	// finish done, accept no more input or output
+	var FinishDone = 3;
+
+	// preset dictionary flag in zlib header
+	var PRESET_DICT = 0x20;
+
+	var INIT_STATE = 42;
+	var BUSY_STATE = 113;
+	var FINISH_STATE = 666;
+
+	// The deflate compression method
+	var Z_DEFLATED = 8;
+
+	var STORED_BLOCK = 0;
+	var STATIC_TREES = 1;
+	var DYN_TREES = 2;
+
+	var MIN_MATCH = 3;
+	var MAX_MATCH = 258;
+	var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
+
+	function smaller(tree, n, m, depth) {
+		var tn2 = tree[n * 2];
+		var tm2 = tree[m * 2];
+		return (tn2 < tm2 || (tn2 == tm2 && depth[n] <= depth[m]));
+	}
+
+	function Deflate() {
+
+		var that = this;
+		var strm; // pointer back to this zlib stream
+		var status; // as the name implies
+		// pending_buf; // output still pending
+		var pending_buf_size; // size of pending_buf
+		// pending_out; // next pending byte to output to the stream
+		// pending; // nb of bytes in the pending buffer
+		var method; // STORED (for zip only) or DEFLATED
+		var last_flush; // value of flush param for previous deflate call
+
+		var w_size; // LZ77 window size (32K by default)
+		var w_bits; // log2(w_size) (8..16)
+		var w_mask; // w_size - 1
+
+		var window;
+		// Sliding window. Input bytes are read into the second half of the window,
+		// and move to the first half later to keep a dictionary of at least wSize
+		// bytes. With this organization, matches are limited to a distance of
+		// wSize-MAX_MATCH bytes, but this ensures that IO is always
+		// performed with a length multiple of the block size. Also, it limits
+		// the window size to 64K, which is quite useful on MSDOS.
+		// To do: use the user input buffer as sliding window.
+
+		var window_size;
+		// Actual size of window: 2*wSize, except when the user input buffer
+		// is directly used as sliding window.
+
+		var prev;
+		// Link to older string with same hash index. To limit the size of this
+		// array to 64K, this link is maintained only for the last 32K strings.
+		// An index in this array is thus a window index modulo 32K.
+
+		var head; // Heads of the hash chains or NIL.
+
+		var ins_h; // hash index of string to be inserted
+		var hash_size; // number of elements in hash table
+		var hash_bits; // log2(hash_size)
+		var hash_mask; // hash_size-1
+
+		// Number of bits by which ins_h must be shifted at each input
+		// step. It must be such that after MIN_MATCH steps, the oldest
+		// byte no longer takes part in the hash key, that is:
+		// hash_shift * MIN_MATCH >= hash_bits
+		var hash_shift;
+
+		// Window position at the beginning of the current output block. Gets
+		// negative when the window is moved backwards.
+
+		var block_start;
+
+		var match_length; // length of best match
+		var prev_match; // previous match
+		var match_available; // set if previous match exists
+		var strstart; // start of string to insert
+		var match_start; // start of matching string
+		var lookahead; // number of valid bytes ahead in window
+
+		// Length of the best match at previous step. Matches not greater than this
+		// are discarded. This is used in the lazy match evaluation.
+		var prev_length;
+
+		// To speed up deflation, hash chains are never searched beyond this
+		// length. A higher limit improves compression ratio but degrades the speed.
+		var max_chain_length;
+
+		// Attempt to find a better match only when the current match is strictly
+		// smaller than this value. This mechanism is used only for compression
+		// levels >= 4.
+		var max_lazy_match;
+
+		// Insert new strings in the hash table only if the match length is not
+		// greater than this length. This saves time but degrades compression.
+		// max_insert_length is used only for compression levels <= 3.
+
+		var level; // compression level (1..9)
+		var strategy; // favor or force Huffman coding
+
+		// Use a faster search when the previous match is longer than this
+		var good_match;
+
+		// Stop searching when current match exceeds this
+		var nice_match;
+
+		var dyn_ltree; // literal and length tree
+		var dyn_dtree; // distance tree
+		var bl_tree; // Huffman tree for bit lengths
+
+		var l_desc = new Tree(); // desc for literal tree
+		var d_desc = new Tree(); // desc for distance tree
+		var bl_desc = new Tree(); // desc for bit length tree
+
+		// that.heap_len; // number of elements in the heap
+		// that.heap_max; // element of largest frequency
+		// The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+		// The same heap array is used to build all trees.
+
+		// Depth of each subtree used as tie breaker for trees of equal frequency
+		that.depth = [];
+
+		var l_buf; // index for literals or lengths */
+
+		// Size of match buffer for literals/lengths. There are 4 reasons for
+		// limiting lit_bufsize to 64K:
+		// - frequencies can be kept in 16 bit counters
+		// - if compression is not successful for the first block, all input
+		// data is still in the window so we can still emit a stored block even
+		// when input comes from standard input. (This can also be done for
+		// all blocks if lit_bufsize is not greater than 32K.)
+		// - if compression is not successful for a file smaller than 64K, we can
+		// even emit a stored file instead of a stored block (saving 5 bytes).
+		// This is applicable only for zip (not gzip or zlib).
+		// - creating new Huffman trees less frequently may not provide fast
+		// adaptation to changes in the input data statistics. (Take for
+		// example a binary file with poorly compressible code followed by
+		// a highly compressible string table.) Smaller buffer sizes give
+		// fast adaptation but have of course the overhead of transmitting
+		// trees more frequently.
+		// - I can't count above 4
+		var lit_bufsize;
+
+		var last_lit; // running index in l_buf
+
+		// Buffer for distances. To simplify the code, d_buf and l_buf have
+		// the same number of elements. To use different lengths, an extra flag
+		// array would be necessary.
+
+		var d_buf; // index of pendig_buf
+
+		// that.opt_len; // bit length of current block with optimal trees
+		// that.static_len; // bit length of current block with static trees
+		var matches; // number of string matches in current block
+		var last_eob_len; // bit length of EOB code for last block
+
+		// Output buffer. bits are inserted starting at the bottom (least
+		// significant bits).
+		var bi_buf;
+
+		// Number of valid bits in bi_buf. All bits above the last valid bit
+		// are always zero.
+		var bi_valid;
+
+		// number of codes at each bit length for an optimal tree
+		that.bl_count = [];
+
+		// heap used to build the Huffman trees
+		that.heap = [];
+
+		dyn_ltree = [];
+		dyn_dtree = [];
+		bl_tree = [];
+
+		function lm_init() {
+			var i;
+			window_size = 2 * w_size;
+
+			head[hash_size - 1] = 0;
+			for (i = 0; i < hash_size - 1; i++) {
+				head[i] = 0;
+			}
+
+			// Set the default configuration parameters:
+			max_lazy_match = config_table[level].max_lazy;
+			good_match = config_table[level].good_length;
+			nice_match = config_table[level].nice_length;
+			max_chain_length = config_table[level].max_chain;
+
+			strstart = 0;
+			block_start = 0;
+			lookahead = 0;
+			match_length = prev_length = MIN_MATCH - 1;
+			match_available = 0;
+			ins_h = 0;
+		}
+
+		function init_block() {
+			var i;
+			// Initialize the trees.
+			for (i = 0; i < L_CODES; i++)
+				dyn_ltree[i * 2] = 0;
+			for (i = 0; i < D_CODES; i++)
+				dyn_dtree[i * 2] = 0;
+			for (i = 0; i < BL_CODES; i++)
+				bl_tree[i * 2] = 0;
+
+			dyn_ltree[END_BLOCK * 2] = 1;
+			that.opt_len = that.static_len = 0;
+			last_lit = matches = 0;
+		}
+
+		// Initialize the tree data structures for a new zlib stream.
+		function tr_init() {
+
+			l_desc.dyn_tree = dyn_ltree;
+			l_desc.stat_desc = StaticTree.static_l_desc;
+
+			d_desc.dyn_tree = dyn_dtree;
+			d_desc.stat_desc = StaticTree.static_d_desc;
+
+			bl_desc.dyn_tree = bl_tree;
+			bl_desc.stat_desc = StaticTree.static_bl_desc;
+
+			bi_buf = 0;
+			bi_valid = 0;
+			last_eob_len = 8; // enough lookahead for inflate
+
+			// Initialize the first block of the first file:
+			init_block();
+		}
+
+		// Restore the heap property by moving down the tree starting at node k,
+		// exchanging a node with the smallest of its two sons if necessary,
+		// stopping
+		// when the heap property is re-established (each father smaller than its
+		// two sons).
+		that.pqdownheap = function(tree, // the tree to restore
+		k // node to move down
+		) {
+			var heap = that.heap;
+			var v = heap[k];
+			var j = k << 1; // left son of k
+			while (j <= that.heap_len) {
+				// Set j to the smallest of the two sons:
+				if (j < that.heap_len && smaller(tree, heap[j + 1], heap[j], that.depth)) {
+					j++;
+				}
+				// Exit if v is smaller than both sons
+				if (smaller(tree, v, heap[j], that.depth))
+					break;
+
+				// Exchange v with the smallest son
+				heap[k] = heap[j];
+				k = j;
+				// And continue down the tree, setting j to the left son of k
+				j <<= 1;
+			}
+			heap[k] = v;
+		};
+
+		// Scan a literal or distance tree to determine the frequencies of the codes
+		// in the bit length tree.
+		function scan_tree(tree,// the tree to be scanned
+		max_code // and its largest code of non zero frequency
+		) {
+			var n; // iterates over all tree elements
+			var prevlen = -1; // last emitted length
+			var curlen; // length of current code
+			var nextlen = tree[0 * 2 + 1]; // length of next code
+			var count = 0; // repeat count of the current code
+			var max_count = 7; // max repeat count
+			var min_count = 4; // min repeat count
+
+			if (nextlen === 0) {
+				max_count = 138;
+				min_count = 3;
+			}
+			tree[(max_code + 1) * 2 + 1] = 0xffff; // guard
+
+			for (n = 0; n <= max_code; n++) {
+				curlen = nextlen;
+				nextlen = tree[(n + 1) * 2 + 1];
+				if (++count < max_count && curlen == nextlen) {
+					continue;
+				} else if (count < min_count) {
+					bl_tree[curlen * 2] += count;
+				} else if (curlen !== 0) {
+					if (curlen != prevlen)
+						bl_tree[curlen * 2]++;
+					bl_tree[REP_3_6 * 2]++;
+				} else if (count <= 10) {
+					bl_tree[REPZ_3_10 * 2]++;
+				} else {
+					bl_tree[REPZ_11_138 * 2]++;
+				}
+				count = 0;
+				prevlen = curlen;
+				if (nextlen === 0) {
+					max_count = 138;
+					min_count = 3;
+				} else if (curlen == nextlen) {
+					max_count = 6;
+					min_count = 3;
+				} else {
+					max_count = 7;
+					min_count = 4;
+				}
+			}
+		}
+
+		// Construct the Huffman tree for the bit lengths and return the index in
+		// bl_order of the last bit length code to send.
+		function build_bl_tree() {
+			var max_blindex; // index of last bit length code of non zero freq
+
+			// Determine the bit length frequencies for literal and distance trees
+			scan_tree(dyn_ltree, l_desc.max_code);
+			scan_tree(dyn_dtree, d_desc.max_code);
+
+			// Build the bit length tree:
+			bl_desc.build_tree(that);
+			// opt_len now includes the length of the tree representations, except
+			// the lengths of the bit lengths codes and the 5+5+4 bits for the
+			// counts.
+
+			// Determine the number of bit length codes to send. The pkzip format
+			// requires that at least 4 bit length codes be sent. (appnote.txt says
+			// 3 but the actual value used is 4.)
+			for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
+				if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] !== 0)
+					break;
+			}
+			// Update opt_len to include the bit length tree and counts
+			that.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
+
+			return max_blindex;
+		}
+
+		// Output a byte on the stream.
+		// IN assertion: there is enough room in pending_buf.
+		function put_byte(p) {
+			that.pending_buf[that.pending++] = p;
+		}
+
+		function put_short(w) {
+			put_byte(w & 0xff);
+			put_byte((w >>> 8) & 0xff);
+		}
+
+		function putShortMSB(b) {
+			put_byte((b >> 8) & 0xff);
+			put_byte((b & 0xff) & 0xff);
+		}
+
+		function send_bits(value, length) {
+			var val, len = length;
+			if (bi_valid > Buf_size - len) {
+				val = value;
+				// bi_buf |= (val << bi_valid);
+				bi_buf |= ((val << bi_valid) & 0xffff);
+				put_short(bi_buf);
+				bi_buf = val >>> (Buf_size - bi_valid);
+				bi_valid += len - Buf_size;
+			} else {
+				// bi_buf |= (value) << bi_valid;
+				bi_buf |= (((value) << bi_valid) & 0xffff);
+				bi_valid += len;
+			}
+		}
+
+		function send_code(c, tree) {
+			var c2 = c * 2;
+			send_bits(tree[c2] & 0xffff, tree[c2 + 1] & 0xffff);
+		}
+
+		// Send a literal or distance tree in compressed form, using the codes in
+		// bl_tree.
+		function send_tree(tree,// the tree to be sent
+		max_code // and its largest code of non zero frequency
+		) {
+			var n; // iterates over all tree elements
+			var prevlen = -1; // last emitted length
+			var curlen; // length of current code
+			var nextlen = tree[0 * 2 + 1]; // length of next code
+			var count = 0; // repeat count of the current code
+			var max_count = 7; // max repeat count
+			var min_count = 4; // min repeat count
+
+			if (nextlen === 0) {
+				max_count = 138;
+				min_count = 3;
+			}
+
+			for (n = 0; n <= max_code; n++) {
+				curlen = nextlen;
+				nextlen = tree[(n + 1) * 2 + 1];
+				if (++count < max_count && curlen == nextlen) {
+					continue;
+				} else if (count < min_count) {
+					do {
+						send_code(curlen, bl_tree);
+					} while (--count !== 0);
+				} else if (curlen !== 0) {
+					if (curlen != prevlen) {
+						send_code(curlen, bl_tree);
+						count--;
+					}
+					send_code(REP_3_6, bl_tree);
+					send_bits(count - 3, 2);
+				} else if (count <= 10) {
+					send_code(REPZ_3_10, bl_tree);
+					send_bits(count - 3, 3);
+				} else {
+					send_code(REPZ_11_138, bl_tree);
+					send_bits(count - 11, 7);
+				}
+				count = 0;
+				prevlen = curlen;
+				if (nextlen === 0) {
+					max_count = 138;
+					min_count = 3;
+				} else if (curlen == nextlen) {
+					max_count = 6;
+					min_count = 3;
+				} else {
+					max_count = 7;
+					min_count = 4;
+				}
+			}
+		}
+
+		// Send the header for a block using dynamic Huffman trees: the counts, the
+		// lengths of the bit length codes, the literal tree and the distance tree.
+		// IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+		function send_all_trees(lcodes, dcodes, blcodes) {
+			var rank; // index in bl_order
+
+			send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt
+			send_bits(dcodes - 1, 5);
+			send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt
+			for (rank = 0; rank < blcodes; rank++) {
+				send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3);
+			}
+			send_tree(dyn_ltree, lcodes - 1); // literal tree
+			send_tree(dyn_dtree, dcodes - 1); // distance tree
+		}
+
+		// Flush the bit buffer, keeping at most 7 bits in it.
+		function bi_flush() {
+			if (bi_valid == 16) {
+				put_short(bi_buf);
+				bi_buf = 0;
+				bi_valid = 0;
+			} else if (bi_valid >= 8) {
+				put_byte(bi_buf & 0xff);
+				bi_buf >>>= 8;
+				bi_valid -= 8;
+			}
+		}
+
+		// Send one empty static block to give enough lookahead for inflate.
+		// This takes 10 bits, of which 7 may remain in the bit buffer.
+		// The current inflate code requires 9 bits of lookahead. If the
+		// last two codes for the previous block (real code plus EOB) were coded
+		// on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
+		// the last real code. In this case we send two empty static blocks instead
+		// of one. (There are no problems if the previous block is stored or fixed.)
+		// To simplify the code, we assume the worst case of last real code encoded
+		// on one bit only.
+		function _tr_align() {
+			send_bits(STATIC_TREES << 1, 3);
+			send_code(END_BLOCK, StaticTree.static_ltree);
+
+			bi_flush();
+
+			// Of the 10 bits for the empty block, we have already sent
+			// (10 - bi_valid) bits. The lookahead for the last real code (before
+			// the EOB of the previous block) was thus at least one plus the length
+			// of the EOB plus what we have just sent of the empty static block.
+			if (1 + last_eob_len + 10 - bi_valid < 9) {
+				send_bits(STATIC_TREES << 1, 3);
+				send_code(END_BLOCK, StaticTree.static_ltree);
+				bi_flush();
+			}
+			last_eob_len = 7;
+		}
+
+		// Save the match info and tally the frequency counts. Return true if
+		// the current block must be flushed.
+		function _tr_tally(dist, // distance of matched string
+		lc // match length-MIN_MATCH or unmatched char (if dist==0)
+		) {
+			var out_length, in_length, dcode;
+			that.pending_buf[d_buf + last_lit * 2] = (dist >>> 8) & 0xff;
+			that.pending_buf[d_buf + last_lit * 2 + 1] = dist & 0xff;
+
+			that.pending_buf[l_buf + last_lit] = lc & 0xff;
+			last_lit++;
+
+			if (dist === 0) {
+				// lc is the unmatched char
+				dyn_ltree[lc * 2]++;
+			} else {
+				matches++;
+				// Here, lc is the match length - MIN_MATCH
+				dist--; // dist = match distance - 1
+				dyn_ltree[(Tree._length_code[lc] + LITERALS + 1) * 2]++;
+				dyn_dtree[Tree.d_code(dist) * 2]++;
+			}
+
+			if ((last_lit & 0x1fff) === 0 && level > 2) {
+				// Compute an upper bound for the compressed length
+				out_length = last_lit * 8;
+				in_length = strstart - block_start;
+				for (dcode = 0; dcode < D_CODES; dcode++) {
+					out_length += dyn_dtree[dcode * 2] * (5 + Tree.extra_dbits[dcode]);
+				}
+				out_length >>>= 3;
+				if ((matches < Math.floor(last_lit / 2)) && out_length < Math.floor(in_length / 2))
+					return true;
+			}
+
+			return (last_lit == lit_bufsize - 1);
+			// We avoid equality with lit_bufsize because of wraparound at 64K
+			// on 16 bit machines and because stored blocks are restricted to
+			// 64K-1 bytes.
+		}
+
+		// Send the block data compressed using the given Huffman trees
+		function compress_block(ltree, dtree) {
+			var dist; // distance of matched string
+			var lc; // match length or unmatched char (if dist === 0)
+			var lx = 0; // running index in l_buf
+			var code; // the code to send
+			var extra; // number of extra bits to send
+
+			if (last_lit !== 0) {
+				do {
+					dist = ((that.pending_buf[d_buf + lx * 2] << 8) & 0xff00) | (that.pending_buf[d_buf + lx * 2 + 1] & 0xff);
+					lc = (that.pending_buf[l_buf + lx]) & 0xff;
+					lx++;
+
+					if (dist === 0) {
+						send_code(lc, ltree); // send a literal byte
+					} else {
+						// Here, lc is the match length - MIN_MATCH
+						code = Tree._length_code[lc];
+
+						send_code(code + LITERALS + 1, ltree); // send the length
+						// code
+						extra = Tree.extra_lbits[code];
+						if (extra !== 0) {
+							lc -= Tree.base_length[code];
+							send_bits(lc, extra); // send the extra length bits
+						}
+						dist--; // dist is now the match distance - 1
+						code = Tree.d_code(dist);
+
+						send_code(code, dtree); // send the distance code
+						extra = Tree.extra_dbits[code];
+						if (extra !== 0) {
+							dist -= Tree.base_dist[code];
+							send_bits(dist, extra); // send the extra distance bits
+						}
+					} // literal or match pair ?
+
+					// Check that the overlay between pending_buf and d_buf+l_buf is
+					// ok:
+				} while (lx < last_lit);
+			}
+
+			send_code(END_BLOCK, ltree);
+			last_eob_len = ltree[END_BLOCK * 2 + 1];
+		}
+
+		// Flush the bit buffer and align the output on a byte boundary
+		function bi_windup() {
+			if (bi_valid > 8) {
+				put_short(bi_buf);
+			} else if (bi_valid > 0) {
+				put_byte(bi_buf & 0xff);
+			}
+			bi_buf = 0;
+			bi_valid = 0;
+		}
+
+		// Copy a stored block, storing first the length and its
+		// one's complement if requested.
+		function copy_block(buf, // the input data
+		len, // its length
+		header // true if block header must be written
+		) {
+			bi_windup(); // align on byte boundary
+			last_eob_len = 8; // enough lookahead for inflate
+
+			if (header) {
+				put_short(len);
+				put_short(~len);
+			}
+
+			that.pending_buf.set(window.subarray(buf, buf + len), that.pending);
+			that.pending += len;
+		}
+
+		// Send a stored block
+		function _tr_stored_block(buf, // input block
+		stored_len, // length of input block
+		eof // true if this is the last block for a file
+		) {
+			send_bits((STORED_BLOCK << 1) + (eof ? 1 : 0), 3); // send block type
+			copy_block(buf, stored_len, true); // with header
+		}
+
+		// Determine the best encoding for the current block: dynamic trees, static
+		// trees or store, and output the encoded block to the zip file.
+		function _tr_flush_block(buf, // input block, or NULL if too old
+		stored_len, // length of input block
+		eof // true if this is the last block for a file
+		) {
+			var opt_lenb, static_lenb;// opt_len and static_len in bytes
+			var max_blindex = 0; // index of last bit length code of non zero freq
+
+			// Build the Huffman trees unless a stored block is forced
+			if (level > 0) {
+				// Construct the literal and distance trees
+				l_desc.build_tree(that);
+
+				d_desc.build_tree(that);
+
+				// At this point, opt_len and static_len are the total bit lengths
+				// of
+				// the compressed block data, excluding the tree representations.
+
+				// Build the bit length tree for the above two trees, and get the
+				// index
+				// in bl_order of the last bit length code to send.
+				max_blindex = build_bl_tree();
+
+				// Determine the best encoding. Compute first the block length in
+				// bytes
+				opt_lenb = (that.opt_len + 3 + 7) >>> 3;
+				static_lenb = (that.static_len + 3 + 7) >>> 3;
+
+				if (static_lenb <= opt_lenb)
+					opt_lenb = static_lenb;
+			} else {
+				opt_lenb = static_lenb = stored_len + 5; // force a stored block
+			}
+
+			if ((stored_len + 4 <= opt_lenb) && buf != -1) {
+				// 4: two words for the lengths
+				// The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+				// Otherwise we can't have processed more than WSIZE input bytes
+				// since
+				// the last block flush, because compression would have been
+				// successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+				// transform a block into a stored block.
+				_tr_stored_block(buf, stored_len, eof);
+			} else if (static_lenb == opt_lenb) {
+				send_bits((STATIC_TREES << 1) + (eof ? 1 : 0), 3);
+				compress_block(StaticTree.static_ltree, StaticTree.static_dtree);
+			} else {
+				send_bits((DYN_TREES << 1) + (eof ? 1 : 0), 3);
+				send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, max_blindex + 1);
+				compress_block(dyn_ltree, dyn_dtree);
+			}
+
+			// The above check is made mod 2^32, for files larger than 512 MB
+			// and uLong implemented on 32 bits.
+
+			init_block();
+
+			if (eof) {
+				bi_windup();
+			}
+		}
+
+		function flush_block_only(eof) {
+			_tr_flush_block(block_start >= 0 ? block_start : -1, strstart - block_start, eof);
+			block_start = strstart;
+			strm.flush_pending();
+		}
+
+		// Fill the window when the lookahead becomes insufficient.
+		// Updates strstart and lookahead.
+		//
+		// IN assertion: lookahead < MIN_LOOKAHEAD
+		// OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+		// At least one byte has been read, or avail_in === 0; reads are
+		// performed for at least two bytes (required for the zip translate_eol
+		// option -- not supported here).
+		function fill_window() {
+			var n, m;
+			var p;
+			var more; // Amount of free space at the end of the window.
+
+			do {
+				more = (window_size - lookahead - strstart);
+
+				// Deal with !@#$% 64K limit:
+				if (more === 0 && strstart === 0 && lookahead === 0) {
+					more = w_size;
+				} else if (more == -1) {
+					// Very unlikely, but possible on 16 bit machine if strstart ==
+					// 0
+					// and lookahead == 1 (input done one byte at time)
+					more--;
+
+					// If the window is almost full and there is insufficient
+					// lookahead,
+					// move the upper half to the lower one to make room in the
+					// upper half.
+				} else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) {
+					window.set(window.subarray(w_size, w_size + w_size), 0);
+
+					match_start -= w_size;
+					strstart -= w_size; // we now have strstart >= MAX_DIST
+					block_start -= w_size;
+
+					// Slide the hash table (could be avoided with 32 bit values
+					// at the expense of memory usage). We slide even when level ==
+					// 0
+					// to keep the hash table consistent if we switch back to level
+					// > 0
+					// later. (Using level 0 permanently is not an optimal usage of
+					// zlib, so we don't care about this pathological case.)
+
+					n = hash_size;
+					p = n;
+					do {
+						m = (head[--p] & 0xffff);
+						head[p] = (m >= w_size ? m - w_size : 0);
+					} while (--n !== 0);
+
+					n = w_size;
+					p = n;
+					do {
+						m = (prev[--p] & 0xffff);
+						prev[p] = (m >= w_size ? m - w_size : 0);
+						// If n is not on any hash chain, prev[n] is garbage but
+						// its value will never be used.
+					} while (--n !== 0);
+					more += w_size;
+				}
+
+				if (strm.avail_in === 0)
+					return;
+
+				// If there was no sliding:
+				// strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+				// more == window_size - lookahead - strstart
+				// => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+				// => more >= window_size - 2*WSIZE + 2
+				// In the BIG_MEM or MMAP case (not yet supported),
+				// window_size == input_size + MIN_LOOKAHEAD &&
+				// strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+				// Otherwise, window_size == 2*WSIZE so more >= 2.
+				// If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+
+				n = strm.read_buf(window, strstart + lookahead, more);
+				lookahead += n;
+
+				// Initialize the hash value now that we have some input:
+				if (lookahead >= MIN_MATCH) {
+					ins_h = window[strstart] & 0xff;
+					ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask;
+				}
+				// If the whole input has less than MIN_MATCH bytes, ins_h is
+				// garbage,
+				// but this is not important since only literal bytes will be
+				// emitted.
+			} while (lookahead < MIN_LOOKAHEAD && strm.avail_in !== 0);
+		}
+
+		// Copy without compression as much as possible from the input stream,
+		// return
+		// the current block state.
+		// This function does not insert new strings in the dictionary since
+		// uncompressible data is probably not useful. This function is used
+		// only for the level=0 compression option.
+		// NOTE: this function should be optimized to avoid extra copying from
+		// window to pending_buf.
+		function deflate_stored(flush) {
+			// Stored blocks are limited to 0xffff bytes, pending_buf is limited
+			// to pending_buf_size, and each stored block has a 5 byte header:
+
+			var max_block_size = 0xffff;
+			var max_start;
+
+			if (max_block_size > pending_buf_size - 5) {
+				max_block_size = pending_buf_size - 5;
+			}
+
+			// Copy as much as possible from input to output:
+			while (true) {
+				// Fill the window as much as possible:
+				if (lookahead <= 1) {
+					fill_window();
+					if (lookahead === 0 && flush == Z_NO_FLUSH)
+						return NeedMore;
+					if (lookahead === 0)
+						break; // flush the current block
+				}
+
+				strstart += lookahead;
+				lookahead = 0;
+
+				// Emit a stored block if pending_buf will be full:
+				max_start = block_start + max_block_size;
+				if (strstart === 0 || strstart >= max_start) {
+					// strstart === 0 is possible when wraparound on 16-bit machine
+					lookahead = (strstart - max_start);
+					strstart = max_start;
+
+					flush_block_only(false);
+					if (strm.avail_out === 0)
+						return NeedMore;
+
+				}
+
+				// Flush if we may have to slide, otherwise block_start may become
+				// negative and the data will be gone:
+				if (strstart - block_start >= w_size - MIN_LOOKAHEAD) {
+					flush_block_only(false);
+					if (strm.avail_out === 0)
+						return NeedMore;
+				}
+			}
+
+			flush_block_only(flush == Z_FINISH);
+			if (strm.avail_out === 0)
+				return (flush == Z_FINISH) ? FinishStarted : NeedMore;
+
+			return flush == Z_FINISH ? FinishDone : BlockDone;
+		}
+
+		function longest_match(cur_match) {
+			var chain_length = max_chain_length; // max hash chain length
+			var scan = strstart; // current string
+			var match; // matched string
+			var len; // length of current match
+			var best_len = prev_length; // best match length so far
+			var limit = strstart > (w_size - MIN_LOOKAHEAD) ? strstart - (w_size - MIN_LOOKAHEAD) : 0;
+			var _nice_match = nice_match;
+
+			// Stop when cur_match becomes <= limit. To simplify the code,
+			// we prevent matches with the string of window index 0.
+
+			var wmask = w_mask;
+
+			var strend = strstart + MAX_MATCH;
+			var scan_end1 = window[scan + best_len - 1];
+			var scan_end = window[scan + best_len];
+
+			// The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of
+			// 16.
+			// It is easy to get rid of this optimization if necessary.
+
+			// Do not waste too much time if we already have a good match:
+			if (prev_length >= good_match) {
+				chain_length >>= 2;
+			}
+
+			// Do not look for matches beyond the end of the input. This is
+			// necessary
+			// to make deflate deterministic.
+			if (_nice_match > lookahead)
+				_nice_match = lookahead;
+
+			do {
+				match = cur_match;
+
+				// Skip to next match if the match length cannot increase
+				// or if the match length is less than 2:
+				if (window[match + best_len] != scan_end || window[match + best_len - 1] != scan_end1 || window[match] != window[scan]
+						|| window[++match] != window[scan + 1])
+					continue;
+
+				// The check at best_len-1 can be removed because it will be made
+				// again later. (This heuristic is not always a win.)
+				// It is not necessary to compare scan[2] and match[2] since they
+				// are always equal when the other bytes match, given that
+				// the hash keys are equal and that HASH_BITS >= 8.
+				scan += 2;
+				match++;
+
+				// We check for insufficient lookahead only every 8th comparison;
+				// the 256th check will be made at strstart+258.
+				do {
+				} while (window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match]
+						&& window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match]
+						&& window[++scan] == window[++match] && window[++scan] == window[++match] && scan < strend);
+
+				len = MAX_MATCH - (strend - scan);
+				scan = strend - MAX_MATCH;
+
+				if (len > best_len) {
+					match_start = cur_match;
+					best_len = len;
+					if (len >= _nice_match)
+						break;
+					scan_end1 = window[scan + best_len - 1];
+					scan_end = window[scan + best_len];
+				}
+
+			} while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length !== 0);
+
+			if (best_len <= lookahead)
+				return best_len;
+			return lookahead;
+		}
+
+		// Compress as much as possible from the input stream, return the current
+		// block state.
+		// This function does not perform lazy evaluation of matches and inserts
+		// new strings in the dictionary only for unmatched strings or for short
+		// matches. It is used only for the fast compression options.
+		function deflate_fast(flush) {
+			// short hash_head = 0; // head of the hash chain
+			var hash_head = 0; // head of the hash chain
+			var bflush; // set if current block must be flushed
+
+			while (true) {
+				// Make sure that we always have enough lookahead, except
+				// at the end of the input file. We need MAX_MATCH bytes
+				// for the next match, plus MIN_MATCH bytes to insert the
+				// string following the next match.
+				if (lookahead < MIN_LOOKAHEAD) {
+					fill_window();
+					if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+						return NeedMore;
+					}
+					if (lookahead === 0)
+						break; // flush the current block
+				}
+
+				// Insert the string window[strstart .. strstart+2] in the
+				// dictionary, and set hash_head to the head of the hash chain:
+				if (lookahead >= MIN_MATCH) {
+					ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask;
+
+					// prev[strstart&w_mask]=hash_head=head[ins_h];
+					hash_head = (head[ins_h] & 0xffff);
+					prev[strstart & w_mask] = head[ins_h];
+					head[ins_h] = strstart;
+				}
+
+				// Find the longest match, discarding those <= prev_length.
+				// At this point we have always match_length < MIN_MATCH
+
+				if (hash_head !== 0 && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) {
+					// To simplify the code, we prevent matches with the string
+					// of window index 0 (in particular we have to avoid a match
+					// of the string with itself at the start of the input file).
+					if (strategy != Z_HUFFMAN_ONLY) {
+						match_length = longest_match(hash_head);
+					}
+					// longest_match() sets match_start
+				}
+				if (match_length >= MIN_MATCH) {
+					// check_match(strstart, match_start, match_length);
+
+					bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH);
+
+					lookahead -= match_length;
+
+					// Insert new strings in the hash table only if the match length
+					// is not too large. This saves time but degrades compression.
+					if (match_length <= max_lazy_match && lookahead >= MIN_MATCH) {
+						match_length--; // string at strstart already in hash table
+						do {
+							strstart++;
+
+							ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask;
+							// prev[strstart&w_mask]=hash_head=head[ins_h];
+							hash_head = (head[ins_h] & 0xffff);
+							prev[strstart & w_mask] = head[ins_h];
+							head[ins_h] = strstart;
+
+							// strstart never exceeds WSIZE-MAX_MATCH, so there are
+							// always MIN_MATCH bytes ahead.
+						} while (--match_length !== 0);
+						strstart++;
+					} else {
+						strstart += match_length;
+						match_length = 0;
+						ins_h = window[strstart] & 0xff;
+
+						ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask;
+						// If lookahead < MIN_MATCH, ins_h is garbage, but it does
+						// not
+						// matter since it will be recomputed at next deflate call.
+					}
+				} else {
+					// No match, output a literal byte
+
+					bflush = _tr_tally(0, window[strstart] & 0xff);
+					lookahead--;
+					strstart++;
+				}
+				if (bflush) {
+
+					flush_block_only(false);
+					if (strm.avail_out === 0)
+						return NeedMore;
+				}
+			}
+
+			flush_block_only(flush == Z_FINISH);
+			if (strm.avail_out === 0) {
+				if (flush == Z_FINISH)
+					return FinishStarted;
+				else
+					return NeedMore;
+			}
+			return flush == Z_FINISH ? FinishDone : BlockDone;
+		}
+
+		// Same as above, but achieves better compression. We use a lazy
+		// evaluation for matches: a match is finally adopted only if there is
+		// no better match at the next window position.
+		function deflate_slow(flush) {
+			// short hash_head = 0; // head of hash chain
+			var hash_head = 0; // head of hash chain
+			var bflush; // set if current block must be flushed
+			var max_insert;
+
+			// Process the input block.
+			while (true) {
+				// Make sure that we always have enough lookahead, except
+				// at the end of the input file. We need MAX_MATCH bytes
+				// for the next match, plus MIN_MATCH bytes to insert the
+				// string following the next match.
+
+				if (lookahead < MIN_LOOKAHEAD) {
+					fill_window();
+					if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+						return NeedMore;
+					}
+					if (lookahead === 0)
+						break; // flush the current block
+				}
+
+				// Insert the string window[strstart .. strstart+2] in the
+				// dictionary, and set hash_head to the head of the hash chain:
+
+				if (lookahead >= MIN_MATCH) {
+					ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask;
+					// prev[strstart&w_mask]=hash_head=head[ins_h];
+					hash_head = (head[ins_h] & 0xffff);
+					prev[strstart & w_mask] = head[ins_h];
+					head[ins_h] = strstart;
+				}
+
+				// Find the longest match, discarding those <= prev_length.
+				prev_length = match_length;
+				prev_match = match_start;
+				match_length = MIN_MATCH - 1;
+
+				if (hash_head !== 0 && prev_length < max_lazy_match && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) {
+					// To simplify the code, we prevent matches with the string
+					// of window index 0 (in particular we have to avoid a match
+					// of the string with itself at the start of the input file).
+
+					if (strategy != Z_HUFFMAN_ONLY) {
+						match_length = longest_match(hash_head);
+					}
+					// longest_match() sets match_start
+
+					if (match_length <= 5 && (strategy == Z_FILTERED || (match_length == MIN_MATCH && strstart - match_start > 4096))) {
+
+						// If prev_match is also MIN_MATCH, match_start is garbage
+						// but we will ignore the current match anyway.
+						match_length = MIN_MATCH - 1;
+					}
+				}
+
+				// If there was a match at the previous step and the current
+				// match is not better, output the previous match:
+				if (prev_length >= MIN_MATCH && match_length <= prev_length) {
+					max_insert = strstart + lookahead - MIN_MATCH;
+					// Do not insert strings in hash table beyond this.
+
+					// check_match(strstart-1, prev_match, prev_length);
+
+					bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH);
+
+					// Insert in hash table all strings up to the end of the match.
+					// strstart-1 and strstart are already inserted. If there is not
+					// enough lookahead, the last two strings are not inserted in
+					// the hash table.
+					lookahead -= prev_length - 1;
+					prev_length -= 2;
+					do {
+						if (++strstart <= max_insert) {
+							ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask;
+							// prev[strstart&w_mask]=hash_head=head[ins_h];
+							hash_head = (head[ins_h] & 0xffff);
+							prev[strstart & w_mask] = head[ins_h];
+							head[ins_h] = strstart;
+						}
+					} while (--prev_length !== 0);
+					match_available = 0;
+					match_length = MIN_MATCH - 1;
+					strstart++;
+
+					if (bflush) {
+						flush_block_only(false);
+						if (strm.avail_out === 0)
+							return NeedMore;
+					}
+				} else if (match_available !== 0) {
+
+					// If there was no match at the previous position, output a
+					// single literal. If there was a match but the current match
+					// is longer, truncate the previous match to a single literal.
+
+					bflush = _tr_tally(0, window[strstart - 1] & 0xff);
+
+					if (bflush) {
+						flush_block_only(false);
+					}
+					strstart++;
+					lookahead--;
+					if (strm.avail_out === 0)
+						return NeedMore;
+				} else {
+					// There is no previous match to compare with, wait for
+					// the next step to decide.
+
+					match_available = 1;
+					strstart++;
+					lookahead--;
+				}
+			}
+
+			if (match_available !== 0) {
+				bflush = _tr_tally(0, window[strstart - 1] & 0xff);
+				match_available = 0;
+			}
+			flush_block_only(flush == Z_FINISH);
+
+			if (strm.avail_out === 0) {
+				if (flush == Z_FINISH)
+					return FinishStarted;
+				else
+					return NeedMore;
+			}
+
+			return flush == Z_FINISH ? FinishDone : BlockDone;
+		}
+
+		function deflateReset(strm) {
+			strm.total_in = strm.total_out = 0;
+			strm.msg = null; //
+			
+			that.pending = 0;
+			that.pending_out = 0;
+
+			status = BUSY_STATE;
+
+			last_flush = Z_NO_FLUSH;
+
+			tr_init();
+			lm_init();
+			return Z_OK;
+		}
+
+		that.deflateInit = function(strm, _level, bits, _method, memLevel, _strategy) {
+			if (!_method)
+				_method = Z_DEFLATED;
+			if (!memLevel)
+				memLevel = DEF_MEM_LEVEL;
+			if (!_strategy)
+				_strategy = Z_DEFAULT_STRATEGY;
+
+			// byte[] my_version=ZLIB_VERSION;
+
+			//
+			// if (!version || version[0] != my_version[0]
+			// || stream_size != sizeof(z_stream)) {
+			// return Z_VERSION_ERROR;
+			// }
+
+			strm.msg = null;
+
+			if (_level == Z_DEFAULT_COMPRESSION)
+				_level = 6;
+
+			if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || _method != Z_DEFLATED || bits < 9 || bits > 15 || _level < 0 || _level > 9 || _strategy < 0
+					|| _strategy > Z_HUFFMAN_ONLY) {
+				return Z_STREAM_ERROR;
+			}
+
+			strm.dstate = that;
+
+			w_bits = bits;
+			w_size = 1 << w_bits;
+			w_mask = w_size - 1;
+
+			hash_bits = memLevel + 7;
+			hash_size = 1 << hash_bits;
+			hash_mask = hash_size - 1;
+			hash_shift = Math.floor((hash_bits + MIN_MATCH - 1) / MIN_MATCH);
+
+			window = new Uint8Array(w_size * 2);
+			prev = [];
+			head = [];
+
+			lit_bufsize = 1 << (memLevel + 6); // 16K elements by default
+
+			// We overlay pending_buf and d_buf+l_buf. This works since the average
+			// output size for (length,distance) codes is <= 24 bits.
+			that.pending_buf = new Uint8Array(lit_bufsize * 4);
+			pending_buf_size = lit_bufsize * 4;
+
+			d_buf = Math.floor(lit_bufsize / 2);
+			l_buf = (1 + 2) * lit_bufsize;
+
+			level = _level;
+
+			strategy = _strategy;
+			method = _method & 0xff;
+
+			return deflateReset(strm);
+		};
+
+		that.deflateEnd = function() {
+			if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) {
+				return Z_STREAM_ERROR;
+			}
+			// Deallocate in reverse order of allocations:
+			that.pending_buf = null;
+			head = null;
+			prev = null;
+			window = null;
+			// free
+			that.dstate = null;
+			return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+		};
+
+		that.deflateParams = function(strm, _level, _strategy) {
+			var err = Z_OK;
+
+			if (_level == Z_DEFAULT_COMPRESSION) {
+				_level = 6;
+			}
+			if (_level < 0 || _level > 9 || _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) {
+				return Z_STREAM_ERROR;
+			}
+
+			if (config_table[level].func != config_table[_level].func && strm.total_in !== 0) {
+				// Flush the last buffer:
+				err = strm.deflate(Z_PARTIAL_FLUSH);
+			}
+
+			if (level != _level) {
+				level = _level;
+				max_lazy_match = config_table[level].max_lazy;
+				good_match = config_table[level].good_length;
+				nice_match = config_table[level].nice_length;
+				max_chain_length = config_table[level].max_chain;
+			}
+			strategy = _strategy;
+			return err;
+		};
+
+		that.deflateSetDictionary = function(strm, dictionary, dictLength) {
+			var length = dictLength;
+			var n, index = 0;
+
+			if (!dictionary || status != INIT_STATE)
+				return Z_STREAM_ERROR;
+
+			if (length < MIN_MATCH)
+				return Z_OK;
+			if (length > w_size - MIN_LOOKAHEAD) {
+				length = w_size - MIN_LOOKAHEAD;
+				index = dictLength - length; // use the tail of the dictionary
+			}
+			window.set(dictionary.subarray(index, index + length), 0);
+
+			strstart = length;
+			block_start = length;
+
+			// Insert all strings in the hash table (except for the last two bytes).
+			// s->lookahead stays null, so s->ins_h will be recomputed at the next
+			// call of fill_window.
+
+			ins_h = window[0] & 0xff;
+			ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask;
+
+			for (n = 0; n <= length - MIN_MATCH; n++) {
+				ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask;
+				prev[n & w_mask] = head[ins_h];
+				head[ins_h] = n;
+			}
+			return Z_OK;
+		};
+
+		that.deflate = function(_strm, flush) {
+			var i, header, level_flags, old_flush, bstate;
+
+			if (flush > Z_FINISH || flush < 0) {
+				return Z_STREAM_ERROR;
+			}
+
+			if (!_strm.next_out || (!_strm.next_in && _strm.avail_in !== 0) || (status == FINISH_STATE && flush != Z_FINISH)) {
+				_strm.msg = z_errmsg[Z_NEED_DICT - (Z_STREAM_ERROR)];
+				return Z_STREAM_ERROR;
+			}
+			if (_strm.avail_out === 0) {
+				_strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)];
+				return Z_BUF_ERROR;
+			}
+
+			strm = _strm; // just in case
+			old_flush = last_flush;
+			last_flush = flush;
+
+			// Write the zlib header
+			if (status == INIT_STATE) {
+				header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8;
+				level_flags = ((level - 1) & 0xff) >> 1;
+
+				if (level_flags > 3)
+					level_flags = 3;
+				header |= (level_flags << 6);
+				if (strstart !== 0)
+					header |= PRESET_DICT;
+				header += 31 - (header % 31);
+
+				status = BUSY_STATE;
+				putShortMSB(header);
+			}
+
+			// Flush as much pending output as possible
+			if (that.pending !== 0) {
+				strm.flush_pending();
+				if (strm.avail_out === 0) {
+					// console.log(" avail_out==0");
+					// Since avail_out is 0, deflate will be called again with
+					// more output space, but possibly with both pending and
+					// avail_in equal to zero. There won't be anything to do,
+					// but this is not an error situation so make sure we
+					// return OK instead of BUF_ERROR at next call of deflate:
+					last_flush = -1;
+					return Z_OK;
+				}
+
+				// Make sure there is something to do and avoid duplicate
+				// consecutive
+				// flushes. For repeated and useless calls with Z_FINISH, we keep
+				// returning Z_STREAM_END instead of Z_BUFF_ERROR.
+			} else if (strm.avail_in === 0 && flush <= old_flush && flush != Z_FINISH) {
+				strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)];
+				return Z_BUF_ERROR;
+			}
+
+			// User must not provide more input after the first FINISH:
+			if (status == FINISH_STATE && strm.avail_in !== 0) {
+				_strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)];
+				return Z_BUF_ERROR;
+			}
+
+			// Start a new block or continue the current one.
+			if (strm.avail_in !== 0 || lookahead !== 0 || (flush != Z_NO_FLUSH && status != FINISH_STATE)) {
+				bstate = -1;
+				switch (config_table[level].func) {
+				case STORED:
+					bstate = deflate_stored(flush);
+					break;
+				case FAST:
+					bstate = deflate_fast(flush);
+					break;
+				case SLOW:
+					bstate = deflate_slow(flush);
+					break;
+				default:
+				}
+
+				if (bstate == FinishStarted || bstate == FinishDone) {
+					status = FINISH_STATE;
+				}
+				if (bstate == NeedMore || bstate == FinishStarted) {
+					if (strm.avail_out === 0) {
+						last_flush = -1; // avoid BUF_ERROR next call, see above
+					}
+					return Z_OK;
+					// If flush != Z_NO_FLUSH && avail_out === 0, the next call
+					// of deflate should use the same flush parameter to make sure
+					// that the flush is complete. So we don't have to output an
+					// empty block here, this will be done at next call. This also
+					// ensures that for a very small output buffer, we emit at most
+					// one empty block.
+				}
+
+				if (bstate == BlockDone) {
+					if (flush == Z_PARTIAL_FLUSH) {
+						_tr_align();
+					} else { // FULL_FLUSH or SYNC_FLUSH
+						_tr_stored_block(0, 0, false);
+						// For a full flush, this empty block will be recognized
+						// as a special marker by inflate_sync().
+						if (flush == Z_FULL_FLUSH) {
+							// state.head[s.hash_size-1]=0;
+							for (i = 0; i < hash_size/*-1*/; i++)
+								// forget history
+								head[i] = 0;
+						}
+					}
+					strm.flush_pending();
+					if (strm.avail_out === 0) {
+						last_flush = -1; // avoid BUF_ERROR at next call, see above
+						return Z_OK;
+					}
+				}
+			}
+
+			if (flush != Z_FINISH)
+				return Z_OK;
+			return Z_STREAM_END;
+		};
+	}
+
+	// ZStream
+
+	function ZStream() {
+		var that = this;
+		that.next_in_index = 0;
+		that.next_out_index = 0;
+		// that.next_in; // next input byte
+		that.avail_in = 0; // number of bytes available at next_in
+		that.total_in = 0; // total nb of input bytes read so far
+		// that.next_out; // next output byte should be put there
+		that.avail_out = 0; // remaining free space at next_out
+		that.total_out = 0; // total nb of bytes output so far
+		// that.msg;
+		// that.dstate;
+	}
+
+	ZStream.prototype = {
+		deflateInit : function(level, bits) {
+			var that = this;
+			that.dstate = new Deflate();
+			if (!bits)
+				bits = MAX_BITS;
+			return that.dstate.deflateInit(that, level, bits);
+		},
+
+		deflate : function(flush) {
+			var that = this;
+			if (!that.dstate) {
+				return Z_STREAM_ERROR;
+			}
+			return that.dstate.deflate(that, flush);
+		},
+
+		deflateEnd : function() {
+			var that = this;
+			if (!that.dstate)
+				return Z_STREAM_ERROR;
+			var ret = that.dstate.deflateEnd();
+			that.dstate = null;
+			return ret;
+		},
+
+		deflateParams : function(level, strategy) {
+			var that = this;
+			if (!that.dstate)
+				return Z_STREAM_ERROR;
+			return that.dstate.deflateParams(that, level, strategy);
+		},
+
+		deflateSetDictionary : function(dictionary, dictLength) {
+			var that = this;
+			if (!that.dstate)
+				return Z_STREAM_ERROR;
+			return that.dstate.deflateSetDictionary(that, dictionary, dictLength);
+		},
+
+		// Read a new buffer from the current input stream, update the
+		// total number of bytes read. All deflate() input goes through
+		// this function so some applications may wish to modify it to avoid
+		// allocating a large strm->next_in buffer and copying from it.
+		// (See also flush_pending()).
+		read_buf : function(buf, start, size) {
+			var that = this;
+			var len = that.avail_in;
+			if (len > size)
+				len = size;
+			if (len === 0)
+				return 0;
+			that.avail_in -= len;
+			buf.set(that.next_in.subarray(that.next_in_index, that.next_in_index + len), start);
+			that.next_in_index += len;
+			that.total_in += len;
+			return len;
+		},
+
+		// Flush as much pending output as possible. All deflate() output goes
+		// through this function so some applications may wish to modify it
+		// to avoid allocating a large strm->next_out buffer and copying into it.
+		// (See also read_buf()).
+		flush_pending : function() {
+			var that = this;
+			var len = that.dstate.pending;
+
+			if (len > that.avail_out)
+				len = that.avail_out;
+			if (len === 0)
+				return;
+
+			// if (that.dstate.pending_buf.length <= that.dstate.pending_out || that.next_out.length <= that.next_out_index
+			// || that.dstate.pending_buf.length < (that.dstate.pending_out + len) || that.next_out.length < (that.next_out_index +
+			// len)) {
+			// console.log(that.dstate.pending_buf.length + ", " + that.dstate.pending_out + ", " + that.next_out.length + ", " +
+			// that.next_out_index + ", " + len);
+			// console.log("avail_out=" + that.avail_out);
+			// }
+
+			that.next_out.set(that.dstate.pending_buf.subarray(that.dstate.pending_out, that.dstate.pending_out + len), that.next_out_index);
+
+			that.next_out_index += len;
+			that.dstate.pending_out += len;
+			that.total_out += len;
+			that.avail_out -= len;
+			that.dstate.pending -= len;
+			if (that.dstate.pending === 0) {
+				that.dstate.pending_out = 0;
+			}
+		}
+	};
+
+	// Deflater
+
+	return function Deflater(level) {
+		var that = this;
+		var z = new ZStream();
+		var bufsize = 512;
+		var flush = Z_NO_FLUSH;
+		var buf = new Uint8Array(bufsize);
+
+		if (typeof level == "undefined")
+			level = Z_DEFAULT_COMPRESSION;
+		z.deflateInit(level);
+		z.next_out = buf;
+
+		that.append = function(data, onprogress) {
+			var err, buffers = [], lastIndex = 0, bufferIndex = 0, bufferSize = 0, array;
+			if (!data.length)
+				return;
+			z.next_in_index = 0;
+			z.next_in = data;
+			z.avail_in = data.length;
+			do {
+				z.next_out_index = 0;
+				z.avail_out = bufsize;
+				err = z.deflate(flush);
+				if (err != Z_OK)
+					throw "deflating: " + z.msg;
+				if (z.next_out_index)
+					if (z.next_out_index == bufsize)
+						buffers.push(new Uint8Array(buf));
+					else
+						buffers.push(new Uint8Array(buf.subarray(0, z.next_out_index)));
+				bufferSize += z.next_out_index;
+				if (onprogress && z.next_in_index > 0 && z.next_in_index != lastIndex) {
+					onprogress(z.next_in_index);
+					lastIndex = z.next_in_index;
+				}
+			} while (z.avail_in > 0 || z.avail_out === 0);
+			array = new Uint8Array(bufferSize);
+			buffers.forEach(function(chunk) {
+				array.set(chunk, bufferIndex);
+				bufferIndex += chunk.length;
+			});
+			return array;
+		};
+		that.flush = function() {
+			var err, buffers = [], bufferIndex = 0, bufferSize = 0, array;
+			do {
+				z.next_out_index = 0;
+				z.avail_out = bufsize;
+				err = z.deflate(Z_FINISH);
+				if (err != Z_STREAM_END && err != Z_OK)
+					throw "deflating: " + z.msg;
+				if (bufsize - z.avail_out > 0)
+					buffers.push(new Uint8Array(buf.subarray(0, z.next_out_index)));
+				bufferSize += z.next_out_index;
+			} while (z.avail_in > 0 || z.avail_out === 0);
+			z.deflateEnd();
+			array = new Uint8Array(bufferSize);
+			buffers.forEach(function(chunk) {
+				array.set(chunk, bufferIndex);
+				bufferIndex += chunk.length;
+			});
+			return array;
+		};
+	};
+})(this);
+// Generated by CoffeeScript 1.4.0
+
+/*
+# PNG.js
+# Copyright (c) 2011 Devon Govett
+# MIT LICENSE
+# 
+# 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.
+*/
+
+
+(function(global) {
+  var PNG;
+
+  PNG = (function() {
+    var APNG_BLEND_OP_OVER, APNG_BLEND_OP_SOURCE, APNG_DISPOSE_OP_BACKGROUND, APNG_DISPOSE_OP_NONE, APNG_DISPOSE_OP_PREVIOUS, makeImage, scratchCanvas, scratchCtx;
+
+    PNG.load = function(url, canvas, callback) {
+      var xhr,
+        _this = this;
+      if (typeof canvas === 'function') {
+        callback = canvas;
+      }
+      xhr = new XMLHttpRequest;
+      xhr.open("GET", url, true);
+      xhr.responseType = "arraybuffer";
+      xhr.onload = function() {
+        var data, png;
+        data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+        png = new PNG(data);
+        if (typeof (canvas != null ? canvas.getContext : void 0) === 'function') {
+          png.render(canvas);
+        }
+        return typeof callback === "function" ? callback(png) : void 0;
+      };
+      return xhr.send(null);
+    };
+
+    APNG_DISPOSE_OP_NONE = 0;
+
+    APNG_DISPOSE_OP_BACKGROUND = 1;
+
+    APNG_DISPOSE_OP_PREVIOUS = 2;
+
+    APNG_BLEND_OP_SOURCE = 0;
+
+    APNG_BLEND_OP_OVER = 1;
+
+    function PNG(data) {
+      var chunkSize, colors, palLen, delayDen, delayNum, frame, i, index, key, section, palShort, text, _i, _j, _ref;
+      this.data = data;
+      this.pos = 8;
+      this.palette = [];
+      this.imgData = [];
+      this.transparency = {};
+      this.animation = null;
+      this.text = {};
+      frame = null;
+      while (true) {
+        chunkSize = this.readUInt32();
+        section = ((function() {
+          var _i, _results;
+          _results = [];
+          for (i = _i = 0; _i < 4; i = ++_i) {
+            _results.push(String.fromCharCode(this.data[this.pos++]));
+          }
+          return _results;
+        }).call(this)).join('');
+        switch (section) {
+          case 'IHDR':
+            this.width = this.readUInt32();
+            this.height = this.readUInt32();
+            this.bits = this.data[this.pos++];
+            this.colorType = this.data[this.pos++];
+            this.compressionMethod = this.data[this.pos++];
+            this.filterMethod = this.data[this.pos++];
+            this.interlaceMethod = this.data[this.pos++];
+            break;
+          case 'acTL':
+            this.animation = {
+              numFrames: this.readUInt32(),
+              numPlays: this.readUInt32() || Infinity,
+              frames: []
+            };
+            break;
+          case 'PLTE':
+            this.palette = this.read(chunkSize);
+            break;
+          case 'fcTL':
+            if (frame) {
+              this.animation.frames.push(frame);
+            }
+            this.pos += 4;
+            frame = {
+              width: this.readUInt32(),
+              height: this.readUInt32(),
+              xOffset: this.readUInt32(),
+              yOffset: this.readUInt32()
+            };
+            delayNum = this.readUInt16();
+            delayDen = this.readUInt16() || 100;
+            frame.delay = 1000 * delayNum / delayDen;
+            frame.disposeOp = this.data[this.pos++];
+            frame.blendOp = this.data[this.pos++];
+            frame.data = [];
+            break;
+          case 'IDAT':
+          case 'fdAT':
+            if (section === 'fdAT') {
+              this.pos += 4;
+              chunkSize -= 4;
+            }
+            data = (frame != null ? frame.data : void 0) || this.imgData;
+            for (i = _i = 0; 0 <= chunkSize ? _i < chunkSize : _i > chunkSize; i = 0 <= chunkSize ? ++_i : --_i) {
+              data.push(this.data[this.pos++]);
+            }
+            break;
+          case 'tRNS':
+            this.transparency = {};
+            switch (this.colorType) {
+              case 3:
+            	palLen = this.palette.length/3;
+                this.transparency.indexed = this.read(chunkSize);
+                if(this.transparency.indexed.length > palLen)
+                	throw new Error('More transparent colors than palette size');
+                /*
+                 * According to the PNG spec trns should be increased to the same size as palette if shorter
+                 */
+                //palShort = 255 - this.transparency.indexed.length;
+                palShort = palLen - this.transparency.indexed.length;
+                if (palShort > 0) {
+                  for (i = _j = 0; 0 <= palShort ? _j < palShort : _j > palShort; i = 0 <= palShort ? ++_j : --_j) {
+                    this.transparency.indexed.push(255);
+                  }
+                }
+                break;
+              case 0:
+                this.transparency.grayscale = this.read(chunkSize)[0];
+                break;
+              case 2:
+                this.transparency.rgb = this.read(chunkSize);
+            }
+            break;
+          case 'tEXt':
+            text = this.read(chunkSize);
+            index = text.indexOf(0);
+            key = String.fromCharCode.apply(String, text.slice(0, index));
+            this.text[key] = String.fromCharCode.apply(String, text.slice(index + 1));
+            break;
+          case 'IEND':
+            if (frame) {
+              this.animation.frames.push(frame);
+            }
+            this.colors = (function() {
+              switch (this.colorType) {
+                case 0:
+                case 3:
+                case 4:
+                  return 1;
+                case 2:
+                case 6:
+                  return 3;
+              }
+            }).call(this);
+            this.hasAlphaChannel = (_ref = this.colorType) === 4 || _ref === 6;
+            colors = this.colors + (this.hasAlphaChannel ? 1 : 0);
+            this.pixelBitlength = this.bits * colors;
+            this.colorSpace = (function() {
+              switch (this.colors) {
+                case 1:
+                  return 'DeviceGray';
+                case 3:
+                  return 'DeviceRGB';
+              }
+            }).call(this);
+            this.imgData = new Uint8Array(this.imgData);
+            return;
+          default:
+            this.pos += chunkSize;
+        }
+        this.pos += 4;
+        if (this.pos > this.data.length) {
+          throw new Error("Incomplete or corrupt PNG file");
+        }
+      }
+      return;
+    }
+
+    PNG.prototype.read = function(bytes) {
+      var i, _i, _results;
+      _results = [];
+      for (i = _i = 0; 0 <= bytes ? _i < bytes : _i > bytes; i = 0 <= bytes ? ++_i : --_i) {
+        _results.push(this.data[this.pos++]);
+      }
+      return _results;
+    };
+
+    PNG.prototype.readUInt32 = function() {
+      var b1, b2, b3, b4;
+      b1 = this.data[this.pos++] << 24;
+      b2 = this.data[this.pos++] << 16;
+      b3 = this.data[this.pos++] << 8;
+      b4 = this.data[this.pos++];
+      return b1 | b2 | b3 | b4;
+    };
+
+    PNG.prototype.readUInt16 = function() {
+      var b1, b2;
+      b1 = this.data[this.pos++] << 8;
+      b2 = this.data[this.pos++];
+      return b1 | b2;
+    };
+
+    PNG.prototype.decodePixels = function(data) {
+      var abyte, c, col, i, left, length, p, pa, paeth, pb, pc, pixelBytes, pixels, pos, row, scanlineLength, upper, upperLeft, _i, _j, _k, _l, _m;
+      if (data == null) {
+        data = this.imgData;
+      }
+      if (data.length === 0) {
+        return new Uint8Array(0);
+      }
+      data = new FlateStream(data);
+      data = data.getBytes();
+      pixelBytes = this.pixelBitlength / 8;
+      scanlineLength = pixelBytes * this.width;
+      pixels = new Uint8Array(scanlineLength * this.height);
+      length = data.length;
+      row = 0;
+      pos = 0;
+      c = 0;
+      while (pos < length) {
+        switch (data[pos++]) {
+          case 0:
+            for (i = _i = 0; _i < scanlineLength; i = _i += 1) {
+              pixels[c++] = data[pos++];
+            }
+            break;
+          case 1:
+            for (i = _j = 0; _j < scanlineLength; i = _j += 1) {
+              abyte = data[pos++];
+              left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
+              pixels[c++] = (abyte + left) % 256;
+            }
+            break;
+          case 2:
+            for (i = _k = 0; _k < scanlineLength; i = _k += 1) {
+              abyte = data[pos++];
+              col = (i - (i % pixelBytes)) / pixelBytes;
+              upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
+              pixels[c++] = (upper + abyte) % 256;
+            }
+            break;
+          case 3:
+            for (i = _l = 0; _l < scanlineLength; i = _l += 1) {
+              abyte = data[pos++];
+              col = (i - (i % pixelBytes)) / pixelBytes;
+              left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
+              upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
+              pixels[c++] = (abyte + Math.floor((left + upper) / 2)) % 256;
+            }
+            break;
+          case 4:
+            for (i = _m = 0; _m < scanlineLength; i = _m += 1) {
+              abyte = data[pos++];
+              col = (i - (i % pixelBytes)) / pixelBytes;
+              left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
+              if (row === 0) {
+                upper = upperLeft = 0;
+              } else {
+                upper = pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
+                upperLeft = col && pixels[(row - 1) * scanlineLength + (col - 1) * pixelBytes + (i % pixelBytes)];
+              }
+              p = left + upper - upperLeft;
+              pa = Math.abs(p - left);
+              pb = Math.abs(p - upper);
+              pc = Math.abs(p - upperLeft);
+              if (pa <= pb && pa <= pc) {
+                paeth = left;
+              } else if (pb <= pc) {
+                paeth = upper;
+              } else {
+                paeth = upperLeft;
+              }
+              pixels[c++] = (abyte + paeth) % 256;
+            }
+            break;
+          default:
+            throw new Error("Invalid filter algorithm: " + data[pos - 1]);
+        }
+        row++;
+      }
+      return pixels;
+    };
+
+    PNG.prototype.decodePalette = function() {
+      var c, i, length, palette, pos, ret, transparency, _i, _ref, _ref1;
+      palette = this.palette;
+      transparency = this.transparency.indexed || [];
+      ret = new Uint8Array((transparency.length || 0) + palette.length);
+      pos = 0;
+      length = palette.length;
+      c = 0;
+      for (i = _i = 0, _ref = palette.length; _i < _ref; i = _i += 3) {
+        ret[pos++] = palette[i];
+        ret[pos++] = palette[i + 1];
+        ret[pos++] = palette[i + 2];
+        ret[pos++] = (_ref1 = transparency[c++]) != null ? _ref1 : 255;
+      }
+      return ret;
+    };
+
+    PNG.prototype.copyToImageData = function(imageData, pixels) {
+      var alpha, colors, data, i, input, j, k, length, palette, v, _ref;
+      colors = this.colors;
+      palette = null;
+      alpha = this.hasAlphaChannel;
+      if (this.palette.length) {
+        palette = (_ref = this._decodedPalette) != null ? _ref : this._decodedPalette = this.decodePalette();
+        colors = 4;
+        alpha = true;
+      }
+      data = imageData.data || imageData;
+      length = data.length;
+      input = palette || pixels;
+      i = j = 0;
+      if (colors === 1) {
+        while (i < length) {
+          k = palette ? pixels[i / 4] * 4 : j;
+          v = input[k++];
+          data[i++] = v;
+          data[i++] = v;
+          data[i++] = v;
+          data[i++] = alpha ? input[k++] : 255;
+          j = k;
+        }
+      } else {
+        while (i < length) {
+          k = palette ? pixels[i / 4] * 4 : j;
+          data[i++] = input[k++];
+          data[i++] = input[k++];
+          data[i++] = input[k++];
+          data[i++] = alpha ? input[k++] : 255;
+          j = k;
+        }
+      }
+    };
+
+    PNG.prototype.decode = function() {
+      var ret;
+      ret = new Uint8Array(this.width * this.height * 4);
+      this.copyToImageData(ret, this.decodePixels());
+      return ret;
+    };
+
+    try {
+        scratchCanvas = global.document.createElement('canvas');
+        scratchCtx = scratchCanvas.getContext('2d');
+    } catch(e) {
+        return -1;
+    }
+
+    makeImage = function(imageData) {
+      var img;
+      scratchCtx.width = imageData.width;
+      scratchCtx.height = imageData.height;
+      scratchCtx.clearRect(0, 0, imageData.width, imageData.height);
+      scratchCtx.putImageData(imageData, 0, 0);
+      img = new Image;
+      img.src = scratchCanvas.toDataURL();
+      return img;
+    };
+
+    PNG.prototype.decodeFrames = function(ctx) {
+      var frame, i, imageData, pixels, _i, _len, _ref, _results;
+      if (!this.animation) {
+        return;
+      }
+      _ref = this.animation.frames;
+      _results = [];
+      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
+        frame = _ref[i];
+        imageData = ctx.createImageData(frame.width, frame.height);
+        pixels = this.decodePixels(new Uint8Array(frame.data));
+        this.copyToImageData(imageData, pixels);
+        frame.imageData = imageData;
+        _results.push(frame.image = makeImage(imageData));
+      }
+      return _results;
+    };
+
+    PNG.prototype.renderFrame = function(ctx, number) {
+      var frame, frames, prev;
+      frames = this.animation.frames;
+      frame = frames[number];
+      prev = frames[number - 1];
+      if (number === 0) {
+        ctx.clearRect(0, 0, this.width, this.height);
+      }
+      if ((prev != null ? prev.disposeOp : void 0) === APNG_DISPOSE_OP_BACKGROUND) {
+        ctx.clearRect(prev.xOffset, prev.yOffset, prev.width, prev.height);
+      } else if ((prev != null ? prev.disposeOp : void 0) === APNG_DISPOSE_OP_PREVIOUS) {
+        ctx.putImageData(prev.imageData, prev.xOffset, prev.yOffset);
+      }
+      if (frame.blendOp === APNG_BLEND_OP_SOURCE) {
+        ctx.clearRect(frame.xOffset, frame.yOffset, frame.width, frame.height);
+      }
+      return ctx.drawImage(frame.image, frame.xOffset, frame.yOffset);
+    };
+
+    PNG.prototype.animate = function(ctx) {
+      var doFrame, frameNumber, frames, numFrames, numPlays, _ref,
+        _this = this;
+      frameNumber = 0;
+      _ref = this.animation, numFrames = _ref.numFrames, frames = _ref.frames, numPlays = _ref.numPlays;
+      return (doFrame = function() {
+        var f, frame;
+        f = frameNumber++ % numFrames;
+        frame = frames[f];
+        _this.renderFrame(ctx, f);
+        if (numFrames > 1 && frameNumber / numFrames < numPlays) {
+          return _this.animation._timeout = setTimeout(doFrame, frame.delay);
+        }
+      })();
+    };
+
+    PNG.prototype.stopAnimation = function() {
+      var _ref;
+      return clearTimeout((_ref = this.animation) != null ? _ref._timeout : void 0);
+    };
+
+    PNG.prototype.render = function(canvas) {
+      var ctx, data;
+      if (canvas._png) {
+        canvas._png.stopAnimation();
+      }
+      canvas._png = this;
+      canvas.width = this.width;
+      canvas.height = this.height;
+      ctx = canvas.getContext("2d");
+      if (this.animation) {
+        this.decodeFrames(ctx);
+        return this.animate(ctx);
+      } else {
+        data = ctx.createImageData(this.width, this.height);
+        this.copyToImageData(data, this.decodePixels());
+        return ctx.putImageData(data, 0, 0);
+      }
+    };
+
+    return PNG;
+
+  })();
+
+  global.PNG = PNG;
+
+})(typeof window !== "undefined" && window || this);
+/*
+ * Extracted from pdf.js
+ * https://github.com/andreasgal/pdf.js
+ *
+ * Copyright (c) 2011 Mozilla Foundation
+ *
+ * Contributors: Andreas Gal <gal@mozilla.com>
+ *               Chris G Jones <cjones@mozilla.com>
+ *               Shaon Barman <shaon.barman@gmail.com>
+ *               Vivien Nicolas <21@vingtetun.org>
+ *               Justin D'Arcangelo <justindarc@gmail.com>
+ *               Yury Delendik
+ *
+ * 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.
+ */
+
+var DecodeStream = (function() {
+  function constructor() {
+    this.pos = 0;
+    this.bufferLength = 0;
+    this.eof = false;
+    this.buffer = null;
+  }
+
+  constructor.prototype = {
+    ensureBuffer: function decodestream_ensureBuffer(requested) {
+      var buffer = this.buffer;
+      var current = buffer ? buffer.byteLength : 0;
+      if (requested < current)
+        return buffer;
+      var size = 512;
+      while (size < requested)
+        size <<= 1;
+      var buffer2 = new Uint8Array(size);
+      for (var i = 0; i < current; ++i)
+        buffer2[i] = buffer[i];
+      return this.buffer = buffer2;
+    },
+    getByte: function decodestream_getByte() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return this.buffer[this.pos++];
+    },
+    getBytes: function decodestream_getBytes(length) {
+      var pos = this.pos;
+
+      if (length) {
+        this.ensureBuffer(pos + length);
+        var end = pos + length;
+
+        while (!this.eof && this.bufferLength < end)
+          this.readBlock();
+
+        var bufEnd = this.bufferLength;
+        if (end > bufEnd)
+          end = bufEnd;
+      } else {
+        while (!this.eof)
+          this.readBlock();
+
+        var end = this.bufferLength;
+      }
+
+      this.pos = end;
+      return this.buffer.subarray(pos, end);
+    },
+    lookChar: function decodestream_lookChar() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return String.fromCharCode(this.buffer[this.pos]);
+    },
+    getChar: function decodestream_getChar() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return String.fromCharCode(this.buffer[this.pos++]);
+    },
+    makeSubStream: function decodestream_makeSubstream(start, length, dict) {
+      var end = start + length;
+      while (this.bufferLength <= end && !this.eof)
+        this.readBlock();
+      return new Stream(this.buffer, start, length, dict);
+    },
+    skip: function decodestream_skip(n) {
+      if (!n)
+        n = 1;
+      this.pos += n;
+    },
+    reset: function decodestream_reset() {
+      this.pos = 0;
+    }
+  };
+
+  return constructor;
+})();
+
+var FlateStream = (function() {
+  if (typeof Uint32Array === 'undefined') {
+    return undefined;
+  }
+  var codeLenCodeMap = new Uint32Array([
+    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+  ]);
+
+  var lengthDecode = new Uint32Array([
+    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+  ]);
+
+  var distDecode = new Uint32Array([
+    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+  ]);
+
+  var fixedLitCodeTab = [new Uint32Array([
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+  ]), 9];
+
+  var fixedDistCodeTab = [new Uint32Array([
+    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+  ]), 5];
+  
+  function error(e) {
+      throw new Error(e)
+  }
+
+  function constructor(bytes) {
+    //var bytes = stream.getBytes();
+    var bytesPos = 0;
+
+    var cmf = bytes[bytesPos++];
+    var flg = bytes[bytesPos++];
+    if (cmf == -1 || flg == -1)
+      error('Invalid header in flate stream');
+    if ((cmf & 0x0f) != 0x08)
+      error('Unknown compression method in flate stream');
+    if ((((cmf << 8) + flg) % 31) != 0)
+      error('Bad FCHECK in flate stream');
+    if (flg & 0x20)
+      error('FDICT bit set in flate stream');
+
+    this.bytes = bytes;
+    this.bytesPos = bytesPos;
+
+    this.codeSize = 0;
+    this.codeBuf = 0;
+
+    DecodeStream.call(this);
+  }
+
+  constructor.prototype = Object.create(DecodeStream.prototype);
+
+  constructor.prototype.getBits = function(bits) {
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var bytes = this.bytes;
+    var bytesPos = this.bytesPos;
+
+    var b;
+    while (codeSize < bits) {
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad encoding in flate stream');
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    b = codeBuf & ((1 << bits) - 1);
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+    this.bytesPos = bytesPos;
+    return b;
+  };
+
+  constructor.prototype.getCode = function(table) {
+    var codes = table[0];
+    var maxLen = table[1];
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var bytes = this.bytes;
+    var bytesPos = this.bytesPos;
+
+    while (codeSize < maxLen) {
+      var b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad encoding in flate stream');
+      codeBuf |= (b << codeSize);
+      codeSize += 8;
+    }
+    var code = codes[codeBuf & ((1 << maxLen) - 1)];
+    var codeLen = code >> 16;
+    var codeVal = code & 0xffff;
+    if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
+      error('Bad encoding in flate stream');
+    this.codeBuf = (codeBuf >> codeLen);
+    this.codeSize = (codeSize - codeLen);
+    this.bytesPos = bytesPos;
+    return codeVal;
+  };
+
+  constructor.prototype.generateHuffmanTable = function(lengths) {
+    var n = lengths.length;
+
+    // find max code length
+    var maxLen = 0;
+    for (var i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen)
+        maxLen = lengths[i];
+    }
+
+    // build the table
+    var size = 1 << maxLen;
+    var codes = new Uint32Array(size);
+    for (var len = 1, code = 0, skip = 2;
+         len <= maxLen;
+         ++len, code <<= 1, skip <<= 1) {
+      for (var val = 0; val < n; ++val) {
+        if (lengths[val] == len) {
+          // bit-reverse the code
+          var code2 = 0;
+          var t = code;
+          for (var i = 0; i < len; ++i) {
+            code2 = (code2 << 1) | (t & 1);
+            t >>= 1;
+          }
+
+          // fill the table entries
+          for (var i = code2; i < size; i += skip)
+            codes[i] = (len << 16) | val;
+
+          ++code;
+        }
+      }
+    }
+
+    return [codes, maxLen];
+  };
+
+  constructor.prototype.readBlock = function() {
+    function repeat(stream, array, len, offset, what) {
+      var repeat = stream.getBits(len) + offset;
+      while (repeat-- > 0)
+        array[i++] = what;
+    }
+
+    // read block header
+    var hdr = this.getBits(3);
+    if (hdr & 1)
+      this.eof = true;
+    hdr >>= 1;
+
+    if (hdr == 0) { // uncompressed block
+      var bytes = this.bytes;
+      var bytesPos = this.bytesPos;
+      var b;
+
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      var blockLen = b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      blockLen |= (b << 8);
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      var check = b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      check |= (b << 8);
+      if (check != (~blockLen & 0xffff))
+        error('Bad uncompressed block length in flate stream');
+
+      this.codeBuf = 0;
+      this.codeSize = 0;
+
+      var bufferLength = this.bufferLength;
+      var buffer = this.ensureBuffer(bufferLength + blockLen);
+      var end = bufferLength + blockLen;
+      this.bufferLength = end;
+      for (var n = bufferLength; n < end; ++n) {
+        if (typeof (b = bytes[bytesPos++]) == 'undefined') {
+          this.eof = true;
+          break;
+        }
+        buffer[n] = b;
+      }
+      this.bytesPos = bytesPos;
+      return;
+    }
+
+    var litCodeTable;
+    var distCodeTable;
+    if (hdr == 1) { // compressed block, fixed codes
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr == 2) { // compressed block, dynamic codes
+      var numLitCodes = this.getBits(5) + 257;
+      var numDistCodes = this.getBits(5) + 1;
+      var numCodeLenCodes = this.getBits(4) + 4;
+
+      // build the code lengths code table
+      var codeLenCodeLengths = Array(codeLenCodeMap.length);
+      var i = 0;
+      while (i < numCodeLenCodes)
+        codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3);
+      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+      // build the literal and distance code tables
+      var len = 0;
+      var i = 0;
+      var codes = numLitCodes + numDistCodes;
+      var codeLengths = new Array(codes);
+      while (i < codes) {
+        var code = this.getCode(codeLenCodeTab);
+        if (code == 16) {
+          repeat(this, codeLengths, 2, 3, len);
+        } else if (code == 17) {
+          repeat(this, codeLengths, 3, 3, len = 0);
+        } else if (code == 18) {
+          repeat(this, codeLengths, 7, 11, len = 0);
+        } else {
+          codeLengths[i++] = len = code;
+        }
+      }
+
+      litCodeTable =
+        this.generateHuffmanTable(codeLengths.slice(0, numLitCodes));
+      distCodeTable =
+        this.generateHuffmanTable(codeLengths.slice(numLitCodes, codes));
+    } else {
+      error('Unknown block type in flate stream');
+    }
+
+    var buffer = this.buffer;
+    var limit = buffer ? buffer.length : 0;
+    var pos = this.bufferLength;
+    while (true) {
+      var code1 = this.getCode(litCodeTable);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
+        buffer[pos++] = code1;
+        continue;
+      }
+      if (code1 == 256) {
+        this.bufferLength = pos;
+        return;
+      }
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      var code2 = code1 >> 16;
+      if (code2 > 0)
+        code2 = this.getBits(code2);
+      var len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+      if (code2 > 0)
+        code2 = this.getBits(code2);
+      var dist = (code1 & 0xffff) + code2;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
+      for (var k = 0; k < len; ++k, ++pos)
+        buffer[pos] = buffer[pos - dist];
+    }
+  };
+
+  return constructor;
+})();/**
+ * JavaScript Polyfill functions for jsPDF
+ * Collected from public resources by
+ * https://github.com/diegocr
+ */
+
+(function (global) {
+	var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+	if (typeof global.btoa === 'undefined') {
+		global.btoa = function(data) {
+			//  discuss at: http://phpjs.org/functions/base64_encode/
+			// original by: Tyler Akins (http://rumkin.com)
+			// improved by: Bayron Guevara
+			// improved by: Thunder.m
+			// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+			// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+			// improved by: Rafal Kukawski (http://kukawski.pl)
+			// bugfixed by: Pellentesque Malesuada
+			//   example 1: base64_encode('Kevin van Zonneveld');
+			//   returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
+
+			var o1,o2,o3,h1,h2,h3,h4,bits,i = 0,ac = 0,enc = '',tmp_arr = [];
+
+			if (!data) {
+				return data;
+			}
+
+			do { // pack three octets into four hexets
+				o1 = data.charCodeAt(i++);
+				o2 = data.charCodeAt(i++);
+				o3 = data.charCodeAt(i++);
+
+				bits = o1 << 16 | o2 << 8 | o3;
+
+				h1 = bits >> 18 & 0x3f;
+				h2 = bits >> 12 & 0x3f;
+				h3 = bits >> 6 & 0x3f;
+				h4 = bits & 0x3f;
+
+				// use hexets to index into b64, and append result to encoded string
+				tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
+			} while (i < data.length);
+
+			enc = tmp_arr.join('');
+
+			var r = data.length % 3;
+
+			return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
+		};
+	}
+
+	if (typeof global.atob === 'undefined') {
+		global.atob = function(data) {
+			//  discuss at: http://phpjs.org/functions/base64_decode/
+			// original by: Tyler Akins (http://rumkin.com)
+			// improved by: Thunder.m
+			// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+			// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+			//    input by: Aman Gupta
+			//    input by: Brett Zamir (http://brett-zamir.me)
+			// bugfixed by: Onno Marsman
+			// bugfixed by: Pellentesque Malesuada
+			// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+			//   example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
+			//   returns 1: 'Kevin van Zonneveld'
+
+			var o1,o2,o3,h1,h2,h3,h4,bits,i = 0,ac = 0,dec = '',tmp_arr = [];
+
+			if (!data) {
+				return data;
+			}
+
+			data += '';
+
+			do { // unpack four hexets into three octets using index points in b64
+				h1 = b64.indexOf(data.charAt(i++));
+				h2 = b64.indexOf(data.charAt(i++));
+				h3 = b64.indexOf(data.charAt(i++));
+				h4 = b64.indexOf(data.charAt(i++));
+
+				bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
+
+				o1 = bits >> 16 & 0xff;
+				o2 = bits >> 8 & 0xff;
+				o3 = bits & 0xff;
+
+				if (h3 == 64) {
+					tmp_arr[ac++] = String.fromCharCode(o1);
+				} else if (h4 == 64) {
+					tmp_arr[ac++] = String.fromCharCode(o1, o2);
+				} else {
+					tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
+				}
+			} while (i < data.length);
+
+			dec = tmp_arr.join('');
+
+			return dec;
+		};
+	}
+
+	if (!Array.prototype.map) {
+		Array.prototype.map = function(fun /*, thisArg */) {
+			if (this === void 0 || this === null || typeof fun !== "function")
+				throw new TypeError();
+
+			var t = Object(this), len = t.length >>> 0, res = new Array(len);
+			var thisArg = arguments.length > 1 ? arguments[1] : void 0;
+			for (var i = 0; i < len; i++) {
+				// NOTE: Absolute correctness would demand Object.defineProperty
+				//       be used.  But this method is fairly new, and failure is
+				//       possible only if Object.prototype or Array.prototype
+				//       has a property |i| (very unlikely), so use a less-correct
+				//       but more portable alternative.
+				if (i in t)
+					res[i] = fun.call(thisArg, t[i], i, t);
+			}
+
+			return res;
+		};
+	}
+
+
+	if(!Array.isArray) {
+		Array.isArray = function(arg) {
+			return Object.prototype.toString.call(arg) === '[object Array]';
+		};
+	}
+
+	if (!Array.prototype.forEach) {
+		Array.prototype.forEach = function(fun, thisArg) {
+			"use strict";
+
+			if (this === void 0 || this === null || typeof fun !== "function")
+				throw new TypeError();
+
+			var t = Object(this), len = t.length >>> 0;
+			for (var i = 0; i < len; i++) {
+				if (i in t)
+					fun.call(thisArg, t[i], i, t);
+			}
+		};
+	}
+
+	if (!Object.keys) {
+		Object.keys = (function () {
+			'use strict';
+
+			var hasOwnProperty = Object.prototype.hasOwnProperty,
+				hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
+				dontEnums = ['toString','toLocaleString','valueOf','hasOwnProperty',
+					'isPrototypeOf','propertyIsEnumerable','constructor'],
+				dontEnumsLength = dontEnums.length;
+
+			return function (obj) {
+				if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
+					throw new TypeError();
+				}
+				var result = [], prop, i;
+
+				for (prop in obj) {
+					if (hasOwnProperty.call(obj, prop)) {
+						result.push(prop);
+					}
+				}
+
+				if (hasDontEnumBug) {
+					for (i = 0; i < dontEnumsLength; i++) {
+						if (hasOwnProperty.call(obj, dontEnums[i])) {
+							result.push(dontEnums[i]);
+						}
+					}
+				}
+				return result;
+			};
+		}());
+	}
+
+	if (!String.prototype.trim) {
+		String.prototype.trim = function () {
+			return this.replace(/^\s+|\s+$/g, '');
+		};
+	}
+	if (!String.prototype.trimLeft) {
+		String.prototype.trimLeft = function() {
+			return this.replace(/^\s+/g, "");
+		};
+	}
+	if (!String.prototype.trimRight) {
+		String.prototype.trimRight = function() {
+			return this.replace(/\s+$/g, "");
+		};
+	}
+
+})(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this);
diff --git a/module/javascript/vitis/controllers/documentationHelpCtrl.js b/module/javascript/vitis/controllers/documentationHelpCtrl.js
new file mode 100755
index 0000000000000000000000000000000000000000..834e639f35cff722583326733ec30e40ed76eeb5
--- /dev/null
+++ b/module/javascript/vitis/controllers/documentationHelpCtrl.js
@@ -0,0 +1,19 @@
+// Google closure
+goog.provide("vitis.controllers.documentationHelp");
+goog.require("vitis.modules.main");
+
+/**
+ * documentationHelp Controller.
+ * .
+ * @param {angular.$log} $log Angular log service.
+ * @param {angular.$scope} $scope Angular scope.
+ * @param {service} propertiesSrvc Paramètres des properties.
+  * @ngInject
+**/
+vitisApp.documentationHelpCtrl = function ($log, $scope, $sce, propertiesSrvc) {
+        // Initialisation
+        $log.info("initDocumentationHelp");
+        // Url de la doc.
+        $scope["sUrlDocumentationHelp"] = $sce.trustAsResourceUrl('https://vmap.readthedocs.io/fr/latest/');
+};
+vitisApp.module.controller("documentationHelpCtrl", vitisApp.documentationHelpCtrl);
diff --git a/module/javascript/vitis/controllers/exportVexCtrl.js b/module/javascript/vitis/controllers/exportVexCtrl.js
new file mode 100755
index 0000000000000000000000000000000000000000..0c420f219355f5a2490ecb4330ebc10ce47a76e4
--- /dev/null
+++ b/module/javascript/vitis/controllers/exportVexCtrl.js
@@ -0,0 +1,2045 @@
+/* global goog, nsVmap, oVmap, bootbox, vitisApp, this */
+
+goog.provide('nsVmap.exportVexCtrl');
+goog.require('oVmap');
+
+/**
+ * ExportVex controller
+ * @param {object} $scope
+ * @param {object} $log
+ * @param {object} $q
+ * @param {object} $translate
+ * @returns {nsVmap.exportVexCtrl}
+ * @export
+ * @ngInject
+ */
+nsVmap.exportVexCtrl = function ($scope, $log, $q, $translate) {
+    $log.info("nsVmap.exportVexCtrl");
+
+    this.$log_ = $log;
+    this.$scope_ = $scope;
+    this.$q_ = $q;
+    this.$translate_ = $translate;
+    this.mainScope_ = angular.element(vitisApp.appMainDrtv).scope();
+
+    this['oProperties'] = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]);
+    this['sToken'] = sessionStorage['session_token'];
+    this['oTranslations'] = {};
+
+    this.aExportedObjects_ = [];
+    this.schemaRegexp_ = new RegExp(/^([a-zA-Z0-9_]*)$/);
+
+    /**
+     * Current step
+     */
+    $scope['displayedStep'] = '';
+
+    // Étapes
+    $scope['steps'] = ['select_vmap_objects', 'select_web_services', 'select_sql_objects', 'execute_export'];
+
+    /**
+     * Export efectué avec succés
+     */
+    $scope['bExportOk'] = false;
+
+    /**
+     * Listes des objets vMap exportables
+     */
+    $scope['oVmapObjects'] = {
+        'maps': [],
+        'calques': [],
+        'vm4ms_layers': [],
+        'business_objects': []
+    };
+
+    /**
+     * Objets vMap à exporter
+     */
+    $scope['oSelectedVmapObjects'] = {
+        'maps': [],
+        'calques': [],
+        'vm4ms_layers': [],
+        'business_objects': []
+    };
+
+    /**
+     * Liste des services web exploitables
+     */
+    $scope['aWebServices'] = [];
+
+    /**
+     * Liste des services web sélectionnés
+     */
+    $scope['aSelectedWebServices'] = [];
+
+    /**
+     * Liste des bases de données exploitables
+     */
+    $scope['aAvaliableDatabases'] = [];
+
+    /**
+     * Base de données sélectionnée
+     */
+    $scope['sSelectedDatabase'] = null;
+
+    /**
+     * Objets SQL exploitables
+     */
+    $scope['aSQLObjects'] = null;
+
+    /**
+     * Objets SQL sélectionnés
+     */
+    $scope['aSelectedSQLObjects'] = [];
+
+    // Traductions
+    this.importTranslations_();
+
+    // Première étape
+    this.goStep('select_vmap_objects');
+};
+
+
+// Fonctions publiques
+
+/**
+ * Function called to submit a step
+ * @param {string} step
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.submitStep = function (step) {
+    this.$log_.info("nsVmap.exportVexCtrl.submitStep");
+
+    var this_ = this;
+
+    switch (step) {
+        case 'select_vmap_objects':
+            this.validateSelectedVMapObjects_().then(function () {
+                this_.nextStep();
+            });
+            break;
+        case 'select_web_services':
+            this.validateSelectedWebServices_().then(function () {
+                this_.nextStep();
+            });
+            break;
+        case 'select_sql_objects':
+            this.validateSelectedSQLObjects_().then(function () {
+                this_.nextStep();
+            });
+            break;
+        default:
+            this.nextStep();
+            break;
+    }
+};
+
+/**
+ * Function called to display the next step
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.nextStep = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.nextStep");
+
+    var this_ = this;
+    var step = angular.copy(this.$scope_['displayedStep']);
+    var nextStep;
+
+    // Changement de step
+    var stepIndex = this.$scope_['steps'].indexOf(step);
+    if (stepIndex !== -1) {
+        if (goog.isDefAndNotNull(this.$scope_['steps'][stepIndex + 1])) {
+            nextStep = this.$scope_['steps'][stepIndex + 1];
+        } else {
+            console.error('next step doesn\'t exists');
+            return null;
+        }
+    } else {
+        console.error('this step doesn\'t exists');
+        return null;
+    }
+
+    this.goStep(nextStep);
+};
+
+/**
+ * Function called to display the previous step
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.prevStep = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.prevStep");
+
+    var this_ = this;
+    var step = angular.copy(this.$scope_['displayedStep']);
+    var prevStep;
+
+    // Changement de step
+    var stepIndex = this.$scope_['steps'].indexOf(step);
+    if (stepIndex !== -1) {
+        if (goog.isDefAndNotNull(this.$scope_['steps'][stepIndex - 1])) {
+            prevStep = this.$scope_['steps'][stepIndex - 1];
+        } else {
+            console.error('previous step doesn\'t exists');
+            return null;
+        }
+    } else {
+        console.error('this step doesn\'t exists');
+        return null;
+    }
+
+    this.goStep(prevStep);
+};
+
+/**
+ * Go to the specified step
+ * @param {string} step
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.goStep = function (step) {
+    this.$log_.info("nsVmap.exportVexCtrl.goStep");
+
+    var this_ = this;
+
+    var currentIndex = this_.$scope_['steps'].indexOf(this_.$scope_['displayedStep']);
+    var stepIndex = this_.$scope_['steps'].indexOf(step);
+
+    // Marche avant
+    if (!(currentIndex > stepIndex)) {
+        switch (step) {
+            case 'select_vmap_objects':
+                this.loadVMapObjects_().then(function () {
+                    this_.$scope_['displayedStep'] = step;
+                    this_.loadVMapObjectsTreeview_();
+                });
+                break;
+            case 'select_web_services':
+                this.loadWebServices_().then(function success() {
+                    this_.$scope_['displayedStep'] = step;
+                    this_.loadWebServicesTreeview_();
+                }, function error() {
+                    // En cas d'erreur passe à l'étape suivante/précédante
+                    if (currentIndex !== -1 && stepIndex !== -1) {
+                        this_.$scope_['displayedStep'] = step;
+                        if (currentIndex < stepIndex) {
+                            this_.nextStep();
+                            return true;
+                        }
+                        if (currentIndex > stepIndex) {
+                            this_.prevStep();
+                            return true;
+                        }
+                    }
+                });
+                break;
+            case 'select_sql_objects':
+                this.loadSQLObjects_().then(function () {
+                    this_.$scope_['displayedStep'] = step;
+                });
+                break;
+            default:
+                this.$scope_['displayedStep'] = step;
+                break;
+        }
+    }
+
+    // Marche arrière
+    if (currentIndex > stepIndex) {
+        switch (step) {
+            case 'select_web_services':
+                this.loadWebServices_().then(function success() {
+                    this_.$scope_['displayedStep'] = step;
+                    this_.loadWebServicesTreeview_();
+                }, function error() {
+                    // En cas d'erreur passe à l'étape suivante/précédante
+                    if (currentIndex !== -1 && stepIndex !== -1) {
+                        this_.$scope_['displayedStep'] = step;
+                        if (currentIndex < stepIndex) {
+                            this_.nextStep();
+                            return true;
+                        }
+                        if (currentIndex > stepIndex) {
+                            this_.prevStep();
+                            return true;
+                        }
+                    }
+                });
+                break;
+            default:
+                this.$scope_['displayedStep'] = step;
+                break;
+        }
+    }
+};
+
+/**
+ * Close the export modal
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.closeExportModal = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.closeExportModal");
+
+    $('.bootbox.modal').each(function () {
+        $(this).modal('hide');
+    });
+
+    this.mainScope_['setMode']('development');
+};
+
+
+// Utiles
+
+/**
+ * Export the translations in this.oTranslations
+ * @private
+ */
+nsVmap.exportVexCtrl.prototype.importTranslations_ = function () {
+
+    var this_ = this;
+
+    var aTranslationsCodes = [];
+
+    // étapes
+    for (var i = 0; i < this.$scope_['steps'].length; i++) {
+        aTranslationsCodes.push('CTRL_EXPORT_VEX_STEP_' + this.$scope_['steps'][i]);
+    }
+
+    // erreurs
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_NO_RESULT_REQUEST_GET_WEB_SERVICES');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX');
+    aTranslationsCodes.push('CTRL_EXPORT_VEX_SELECT_DB');
+
+    this.$translate_(aTranslationsCodes).then(function (aTranslations) {
+        this_['oTranslations'] = aTranslations;
+    });
+};
+
+
+
+// Étape Selection objets vMap
+
+/**
+ * Load the avaliable databases list
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.exportVexCtrl.prototype.loadVMapObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // Chargement Ajax des objets vMap
+    this.getVMapObjects_().then(function (aVmapObjects) {
+
+        var aMaps = [];
+        var aCalques = [];
+        var aBos = [];
+        var aVm4msLayers = [];
+
+        // Ajout des couches
+        for (var i = 0; i < aVmapObjects.length; i++) {
+            if (aVmapObjects[i]['type'] === 'map') {
+                aMaps.push({
+                    'type': 'map',
+                    'map_id': aVmapObjects[i]['map_id'],
+                    'name': aVmapObjects[i]['name'],
+                    'properties_': aVmapObjects[i]
+                });
+
+                // Ajout des calques
+                if (goog.isArray(aVmapObjects[i]['calques'])) {
+                    for (var ii = 0; ii < aVmapObjects[i]['calques'].length; ii++) {
+                        if (aVmapObjects[i]['calques'][ii]['type'] === 'calque') {
+                            aCalques.push({
+                                'type': 'calque',
+                                'map_id': aVmapObjects[i]['map_id'],
+                                'layer_id': aVmapObjects[i]['calques'][ii]['layer_id'],
+                                'name': aVmapObjects[i]['calques'][ii]['name'],
+                                'properties_': aVmapObjects[i]['calques'][ii]
+                            });
+                        }
+
+                        // Ajout des objets métier
+                        if (goog.isArray(aVmapObjects[i]['calques'][ii]['business_objects'])) {
+                            for (var iii = 0; iii < aVmapObjects[i]['calques'][ii]['business_objects'].length; iii++) {
+                                if (aVmapObjects[i]['calques'][ii]['business_objects'][iii]['type'] === 'business_object') {
+                                    aBos.push({
+                                        'type': 'business_object',
+                                        'map_id': aVmapObjects[i]['map_id'],
+                                        'layer_id': aVmapObjects[i]['calques'][ii]['layer_id'],
+                                        'business_object_id': aVmapObjects[i]['calques'][ii]['business_objects'][iii]['name'],
+                                        'properties_': aVmapObjects[i]['calques'][ii]['business_objects'][iii]
+                                    });
+                                }
+                            }
+                        }
+
+                        // Ajout des couches vm4ms
+                        if (goog.isArray(aVmapObjects[i]['calques'][ii]['vm4ms_layers'])) {
+                            for (var iii = 0; iii < aVmapObjects[i]['calques'][ii]['vm4ms_layers'].length; iii++) {
+                                if (aVmapObjects[i]['calques'][ii]['vm4ms_layers'][iii]['type'] === 'vm4ms_layer') {
+                                    aVm4msLayers.push({
+                                        'type': 'vm4ms_layer',
+                                        'map_id': aVmapObjects[i]['map_id'],
+                                        'layer_id': aVmapObjects[i]['calques'][ii]['layer_id'],
+                                        'name': aVmapObjects[i]['calques'][ii]['vm4ms_layers'][iii]['name'],
+                                        'properties_': aVmapObjects[i]['calques'][ii]['vm4ms_layers'][iii]
+                                    });
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        this_.$scope_['oVmapObjects']['maps'] = aMaps;
+        this_.$scope_['oVmapObjects']['calques'] = aCalques;
+        this_.$scope_['oVmapObjects']['business_objects'] = aBos;
+        this_.$scope_['oVmapObjects']['vm4ms_layers'] = aVm4msLayers;
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Chargement de la liste des objets vMap
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.getVMapObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.getVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/vmap_objects',
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['vmap_objects'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['vmap_objects'][0])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS'], "error");
+                deferred.reject();
+                return null;
+            }
+
+            deferred.resolve(response['data']['vmap_objects']);
+
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the treeview to select vMap objects
+ */
+nsVmap.exportVexCtrl.prototype.loadVMapObjectsTreeview_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadVMapObjectsTreeview_");
+
+    var this_ = this;
+
+    $('#export-vex-vmap-objects-treeview')['treeview']({
+        'data': this.getTreeviewDataFromVMapObjects_(),
+        'onNodeChecked': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeChecked', oNode);
+        },
+        'onNodeCollapsed': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeCollapsed', oNode);
+        },
+        'onNodeExpanded': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeExpanded', oNode);
+        },
+        'onNodeUnchecked': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeUnchecked', oNode);
+        },
+        'expandIcon': '',
+        'collapseIcon': '',
+        'showBorder': false,
+        'showCheckbox': true
+    });
+};
+
+/**
+ * Get the treeview formed objects from scope.oVmapObjects
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewDataFromVMapObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewDataFromVMapObjects_");
+
+    var aData = [];
+    var oMap;
+
+    if (goog.isArray(this.$scope_['oVmapObjects']['maps'])) {
+        for (var i = 0; i < this.$scope_['oVmapObjects']['maps'].length; i++) {
+
+            // Cartes
+            oMap = {
+                'text': 'Carte: ' + this.$scope_['oVmapObjects']['maps'][i]['name'],
+                'icon': 'icon-map',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'properties_': this.$scope_['oVmapObjects']['maps'][i],
+                'nodes': this.getTreeviewCalquesFromMap_(this.$scope_['oVmapObjects']['maps'][i])
+            };
+
+            aData.push(oMap);
+        }
+    } else {
+        console.error('oVmapObjects.maps undefined');
+    }
+
+    return aData;
+};
+
+/**
+ * Get the treeview formed calques from the given map
+ * @param {object} oMap
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewCalquesFromMap_ = function (oMap) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewCalqueFromMap_");
+
+    var aCalques = [], oCalque;
+    for (var i = 0; i < this.$scope_['oVmapObjects']['calques'].length; i++) {
+        if (this.$scope_['oVmapObjects']['calques'][i]['map_id'] === oMap['map_id']) {
+
+            var aVm4msLayers = this.getTreeviewVm4msLayersFromCalque_(this.$scope_['oVmapObjects']['calques'][i]);
+            var aBos = this.getTreeviewBOsFromCalque_(this.$scope_['oVmapObjects']['calques'][i]);
+
+            oCalque = {
+                'text': 'Calque: ' + this.$scope_['oVmapObjects']['calques'][i]['name'],
+                'icon': 'icon-layers2',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'properties_': this.$scope_['oVmapObjects']['calques'][i],
+                'nodes': goog.array.join(aVm4msLayers, aBos)
+            };
+
+            if (!goog.isArray(aCalques)) {
+                aCalques = [];
+            }
+            aCalques.push(oCalque);
+        }
+    }
+
+    return aCalques;
+};
+
+/**
+ * Get the treeview formed vm4ms layers from a calque
+ * @param {object} oCalque
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewVm4msLayersFromCalque_ = function (oCalque) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewVm4msLayersFromCalque_");
+
+    var aVm4msLayers = [], oVm4msLayer;
+    for (var i = 0; i < this.$scope_['oVmapObjects']['vm4ms_layers'].length; i++) {
+        if (this.$scope_['oVmapObjects']['vm4ms_layers'][i]['layer_id'] === oCalque['layer_id']
+            && this.$scope_['oVmapObjects']['vm4ms_layers'][i]['map_id'] === oCalque['map_id']) {
+
+            oVm4msLayer = {
+                'text': 'Couche Mapserver: ' + this.$scope_['oVmapObjects']['vm4ms_layers'][i]['name'],
+                'icon': 'icon-layers',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'nodes': [],
+                'properties_': this.$scope_['oVmapObjects']['vm4ms_layers'][i]
+            };
+
+            if (!goog.isArray(aVm4msLayers)) {
+                aVm4msLayers = [];
+            }
+            aVm4msLayers.push(oVm4msLayer);
+        }
+    }
+
+    return aVm4msLayers;
+};
+
+/**
+ * Get the treeview formed business objects from a calque
+ * @param {object} oCalque
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewBOsFromCalque_ = function (oCalque) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewBOsFromCalque_");
+
+    var aBOs = [], oBO;
+    for (var i = 0; i < this.$scope_['oVmapObjects']['business_objects'].length; i++) {
+        if (this.$scope_['oVmapObjects']['business_objects'][i]['layer_id'] === oCalque['layer_id']
+            && this.$scope_['oVmapObjects']['business_objects'][i]['map_id'] === oCalque['map_id']) {
+
+            oBO = {
+                'text': 'Objet métier: ' + this.$scope_['oVmapObjects']['business_objects'][i]['business_object_id'],
+                'icon': 'icon-vmap_business_object',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'nodes': [],
+                'properties_': this.$scope_['oVmapObjects']['business_objects'][i]
+            };
+
+            if (!goog.isArray(aBOs)) {
+                aBOs = [];
+            }
+            aBOs.push(oBO);
+        }
+    }
+
+    return aBOs;
+};
+
+/**
+ * Function called when a node state is updated
+ * @param {string} sEvent
+ * @param {object} oNode
+ */
+nsVmap.exportVexCtrl.prototype.onVMapObjectsTreeviewUpdate_ = function (sEvent, oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.onVMapObjectsTreeviewUpdate_");
+
+    // Sélectionne automatiquement les noeuds ouverts
+    if (sEvent === 'nodeCollapsed' || sEvent === 'nodeExpanded') {
+        // Sélectionne tous les noeuds ouverts
+        var aExpandedNodes = $('#export-vex-vmap-objects-treeview').data('treeview')['getExpanded']();
+        for (var i = 0; i < aExpandedNodes.length; i++) {
+            if (aExpandedNodes[i]['state']['checked'] === false) {
+                $('#export-vex-vmap-objects-treeview').data('treeview')['checkNode'](aExpandedNodes[i]);
+            }
+        }
+        // Dé-sélectionne tous les noeuds fermés
+        var aCollapsedNodes = $('#export-vex-vmap-objects-treeview').data('treeview')['getCollapsed']();
+        for (var i = 0; i < aCollapsedNodes.length; i++) {
+            if (aCollapsedNodes[i]['state']['checked'] === true) {
+                $('#export-vex-vmap-objects-treeview').data('treeview')['uncheckNode'](aCollapsedNodes[i]);
+            }
+        }
+    }
+
+    // Ouvre automatiquement les noeuds fermés
+    if (sEvent === 'nodeChecked' || sEvent === 'nodeUnchecked') {
+        // Ouvre tous les noeuds sélectionnés
+        var aCheckedNodes = $('#export-vex-vmap-objects-treeview').data('treeview')['getChecked']();
+        for (var i = 0; i < aCheckedNodes.length; i++) {
+            if (aCheckedNodes[i]['state']['expanded'] === false) {
+                $('#export-vex-vmap-objects-treeview').data('treeview')['expandNode'](aCheckedNodes[i]);
+            }
+        }
+        // Ferme tous les noeuds non sélectionnés
+        var aUncheckedNodes = $('#export-vex-vmap-objects-treeview').data('treeview')['getUnchecked']();
+        for (var i = 0; i < aUncheckedNodes.length; i++) {
+            if (aUncheckedNodes[i]['state']['expanded'] === true) {
+                $('#export-vex-vmap-objects-treeview').data('treeview')['collapseNode'](aUncheckedNodes[i]);
+            }
+        }
+    }
+
+    // Ouvre recursivement les enfants du noeud ouvert
+    if (sEvent === 'nodeExpanded') {
+        // Ouvre tous les enfants
+        if (goog.isArray(oNode['nodes'])) {
+            for (var i = 0; i < oNode['nodes'].length; i++) {
+                if (oNode['nodes'][i]['state']['expanded'] === false) {
+                    $('#export-vex-vmap-objects-treeview').data('treeview')['expandNode'](oNode['nodes'][i]['nodeId']);
+                }
+            }
+        }
+    }
+};
+
+/**
+ * Update scope.oSelectedVmapObjects from the treeview data
+ */
+nsVmap.exportVexCtrl.prototype.updateSelectedVMapObjectsFromTreeviewData_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.updateSelectedVMapObjectsFromTreeviewData_");
+
+    var this_ = this;
+
+    // Vide les listes
+    goog.array.clear(this.$scope_['oSelectedVmapObjects']['maps']);
+    goog.array.clear(this.$scope_['oSelectedVmapObjects']['calques']);
+    goog.array.clear(this.$scope_['oSelectedVmapObjects']['vm4ms_layers']);
+    goog.array.clear(this.$scope_['oSelectedVmapObjects']['business_objects']);
+
+    var aCheckedNodes = $('#export-vex-vmap-objects-treeview').data('treeview')['getChecked']();
+
+    for (var i = 0; i < aCheckedNodes.length; i++) {
+        if (aCheckedNodes[i]['properties_']['type'] === 'map') {
+            this_.$scope_['oSelectedVmapObjects']['maps'].push(aCheckedNodes[i]['properties_']['map_id']);
+            goog.array.removeDuplicates(this_.$scope_['oSelectedVmapObjects']['maps']);
+        }
+        if (aCheckedNodes[i]['properties_']['type'] === 'calque') {
+            this_.$scope_['oSelectedVmapObjects']['calques'].push(aCheckedNodes[i]['properties_']['layer_id']);
+            goog.array.removeDuplicates(this_.$scope_['oSelectedVmapObjects']['calques']);
+        }
+        if (aCheckedNodes[i]['properties_']['type'] === 'vm4ms_layer') {
+            this_.$scope_['oSelectedVmapObjects']['vm4ms_layers'].push(aCheckedNodes[i]['properties_']['name']);
+            goog.array.removeDuplicates(this_.$scope_['oSelectedVmapObjects']['vm4ms_layers']);
+        }
+        if (aCheckedNodes[i]['properties_']['type'] === 'business_object') {
+            this_.$scope_['oSelectedVmapObjects']['business_objects'].push(aCheckedNodes[i]['properties_']['business_object_id']);
+            goog.array.removeDuplicates(this_.$scope_['oSelectedVmapObjects']['business_objects']);
+        }
+    }
+};
+
+/**
+ * Check if the given vMap objects are valid
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.validateSelectedVMapObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.validateSelectedVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    this.updateSelectedVMapObjectsFromTreeviewData_();
+    console.log("this.$scope_['oSelectedVmapObjects']: ", this_.$scope_['oSelectedVmapObjects']);
+    setTimeout(function () {
+        if (goog.isArray(this_.$scope_['oSelectedVmapObjects']['maps']) &&
+                goog.isArray(this_.$scope_['oSelectedVmapObjects']['calques']) &&
+                goog.isArray(this_.$scope_['oSelectedVmapObjects']['vm4ms_layers']) &&
+                goog.isArray(this_.$scope_['oSelectedVmapObjects']['business_objects'])) {
+            deferred.resolve();
+        }
+    });
+
+    return deferred.promise;
+};
+
+
+
+// Étape web services
+
+/**
+ * Load the avaliable web services list
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.exportVexCtrl.prototype.loadWebServices_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    this.getBoWebServices_(this.$scope_['oSelectedVmapObjects']['business_objects']).then(function success(aWebServices) {
+        this_.$scope_['aWebServices'] = aWebServices;
+        deferred.resolve();
+    }, function error() {
+        deferred.reject();
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Make Ajax request to get the web services list
+ * @param {array} aBOs
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.getBoWebServices_ = function (aBOs) {
+    this.$log_.info("nsVmap.exportVexCtrl.getBoWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    setTimeout(function () {
+        if (!goog.isArray(aBOs)) {
+            deferred.reject();
+            return 0;
+        }
+        if (!aBOs.length > 0) {
+            deferred.reject();
+            return 0;
+        }
+
+        ajaxRequest({
+            'method': 'GET',
+            'url': this_['oProperties']['web_server_name'] + '/' + this_['oProperties']['services_alias'] + '/vmap/vex/web_services',
+            'headers': {
+                'Accept': 'application/json'
+            },
+            'params': {
+                'business_objects': aBOs.join('|')
+            },
+            'scope': this_.$scope_,
+            'success': function (response) {
+
+                if (!goog.isDefAndNotNull(response['data'])) {
+                    $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES'], "error");
+                    deferred.reject();
+                    return null;
+                }
+                if (goog.isDefAndNotNull(response['data'])) {
+                    if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                        angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                            "className": "modal-danger",
+                            "message": response['data']['errorMessage']
+                        });
+                        deferred.reject();
+                        return null;
+                    }
+                }
+                if (response['data']['status'] !== 1) {
+                    $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES'], "error");
+                    deferred.reject();
+                    return null;
+                }
+                if (!goog.isDefAndNotNull(response['data']['web_services'])) {
+                    $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES'], "error");
+                    deferred.reject();
+                    return null;
+                }
+                if (!goog.isDefAndNotNull(response['data']['web_services'][0])) {
+                    $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_NO_RESULT_REQUEST_GET_WEB_SERVICES'], "success");
+                    deferred.reject();
+                    return null;
+                }
+
+                deferred.resolve(response['data']['web_services']);
+
+            },
+            'error': function (response) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES'], "error");
+                deferred.reject();
+            }
+        });
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the treeview to select web services
+ */
+nsVmap.exportVexCtrl.prototype.loadWebServicesTreeview_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadWebServicesTreeview_");
+
+    var this_ = this;
+
+    $('#export-vex-web-services-treeview')['treeview']({
+        'data': this.getTreeviewDataFromWebServices_(),
+        'onNodeChecked': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeChecked', oNode);
+        },
+        'onNodeCollapsed': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeCollapsed', oNode);
+        },
+        'onNodeExpanded': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeExpanded', oNode);
+        },
+        'onNodeUnchecked': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeUnchecked', oNode);
+        },
+        'expandIcon': '',
+        'collapseIcon': '',
+        'showBorder': false,
+        'showCheckbox': true
+    });
+};
+
+/**
+ * Get the treeview formed objects from scope.aWebServices
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewDataFromWebServices_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewDataFromWebServices_");
+
+    var aData = [];
+    var oWebService;
+
+    if (goog.isArray(this.$scope_['aWebServices'])) {
+        for (var i = 0; i < this.$scope_['aWebServices'].length; i++) {
+
+            oWebService = {
+                'text': this.$scope_['aWebServices'][i]['name'],
+                'icon': 'glyphicon glyphicon-folder-open',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'properties_': {
+                    'type': 'folder',
+                    'name': this.$scope_['aWebServices'][i]['name']
+                },
+                'nodes': this.getTreeviewFilesFromWebService_(this.$scope_['aWebServices'][i])
+            };
+
+            aData.push(oWebService);
+        }
+    } else {
+        console.error('aWebServices undefined');
+    }
+
+    return aData;
+};
+
+/**
+ * Get the treeview formed files from the given web service
+ * @param {object} oWebService
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewFilesFromWebService_ = function (oWebService) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewFilesFromWebService_");
+
+    var aFiles = [];
+    var oFile;
+    if (goog.isArray(oWebService['files'])) {
+        for (var i = 0; i < oWebService['files'].length; i++) {
+            oFile = {
+                'text': oWebService['files'][i],
+                'selectable': false,
+                'properties_': {
+                    'type': 'file'
+                }
+            };
+            aFiles.push(oFile);
+        }
+    }
+
+    return aFiles;
+};
+
+/**
+ * Function called when a node state is updated
+ * @param {string} sEvent
+ * @param {object} oNode
+ */
+nsVmap.exportVexCtrl.prototype.onWebServicesTreeviewUpdate_ = function (sEvent, oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.onWebServicesTreeviewUpdate_");
+
+    // Ignore les événements venus des fichiers
+    if (oNode['properties_']['type'] === 'file') {
+        if (sEvent === 'nodeUnchecked') {
+            $('#export-vex-web-services-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    if (oNode['properties_']['type'] === 'folder') {
+        if (sEvent === 'nodeChecked') {
+            $('#export-vex-web-services-treeview').data('treeview')['expandNode'](oNode['nodeId']);
+        }
+        if (sEvent === 'nodeUnchecked') {
+            $('#export-vex-web-services-treeview').data('treeview')['collapseNode'](oNode['nodeId']);
+        }
+    }
+
+    // Sélectionne tous les noeuds ouverts
+    var aExpandedNodes = $('#export-vex-web-services-treeview').data('treeview')['getExpanded']();
+    for (var i = 0; i < aExpandedNodes.length; i++) {
+        if (aExpandedNodes[i]['properties_']['type'] === 'folder') {
+            if (aExpandedNodes[i]['state']['checked'] === false) {
+                $('#export-vex-web-services-treeview').data('treeview')['checkNode'](aExpandedNodes[i]);
+            }
+            // Sélectionne les enfants
+            if (goog.isArray(aExpandedNodes[i]['nodes'])) {
+                for (var ii = 0; ii < aExpandedNodes[i]['nodes'].length; ii++) {
+                    if (aExpandedNodes[i]['nodes'][ii]['state']['checked'] === false) {
+                        $('#export-vex-web-services-treeview').data('treeview')['checkNode'](aExpandedNodes[i]['nodes'][ii]['nodeId'], {'silent': true});
+                    }
+                }
+            }
+        }
+    }
+
+    // Dé-sélectionne tous les noeuds fermés
+    var aCollapsedNodes = $('#export-vex-web-services-treeview').data('treeview')['getCollapsed']();
+    for (var i = 0; i < aCollapsedNodes.length; i++) {
+        if (aCollapsedNodes[i]['properties_']['type'] === 'folder') {
+            if (aCollapsedNodes[i]['state']['checked'] === true) {
+                $('#export-vex-web-services-treeview').data('treeview')['uncheckNode'](aCollapsedNodes[i]);
+            }
+            // Dé-sélectionne les enfants
+            if (goog.isArray(aCollapsedNodes[i]['nodes'])) {
+                for (var ii = 0; ii < aCollapsedNodes[i]['nodes'].length; ii++) {
+                    if (aCollapsedNodes[i]['nodes'][ii]['state']['checked'] === true) {
+                        $('#export-vex-web-services-treeview').data('treeview')['uncheckNode'](aCollapsedNodes[i]['nodes'][ii]['nodeId'], {'silent': true});
+                    }
+                }
+            }
+        }
+    }
+
+};
+
+/**
+ * Update scope.aSelectedWebServices from the treeview data
+ */
+nsVmap.exportVexCtrl.prototype.updateSelectedWebServicesFromTreeviewData_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.updateSelectedWebServicesFromTreeviewData_");
+
+    // Vide les listes
+    goog.array.clear(this.$scope_['aSelectedWebServices']);
+
+    var aCheckedNodes = $('#export-vex-web-services-treeview').data('treeview')['getChecked']();
+
+    for (var i = 0; i < aCheckedNodes.length; i++) {
+        if (goog.isDefAndNotNull(aCheckedNodes[i]['properties_'])) {
+            if (goog.isDefAndNotNull(aCheckedNodes[i]['properties_']['type'])) {
+                if (aCheckedNodes[i]['properties_']['type'] === 'folder') {
+                    this.$scope_['aSelectedWebServices'].push(aCheckedNodes[i]['properties_']['name']);
+                }
+            }
+        }
+    }
+};
+
+/**
+ * Check if the given Web services are valid
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.validateSelectedWebServices_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.validateSelectedWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    this.updateSelectedWebServicesFromTreeviewData_();
+    setTimeout(function () {
+        console.log("this.$scope_['aSelectedWebServices']: ", this_.$scope_['aSelectedWebServices']);
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+
+
+// Étape SQL
+
+/**
+ * Load the avaliable SQL objects list
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.exportVexCtrl.prototype.loadSQLObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadSQLObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // Vide les anciennes valeurs
+    if (goog.isDefAndNotNull(this.selectedDatabaseWatcher)) {
+        this.selectedDatabaseWatcher();
+    }
+    this.$scope_['sSelectedDatabase'] = null;
+    goog.array.clear(this_.$scope_['aAvaliableDatabases']);
+    if (goog.isDefAndNotNull($('#export-vex-sql-objects-treeview')['treeview'])) {
+        $('#export-vex-sql-objects-treeview')['treeview']('remove');
+    }
+
+
+    // Ajoute les nouvelles valeurs
+    this.geAvaliableDatabases_().then(function success(aAvaliableDatabases) {
+
+        // set scope.aAvaliableDatabases
+        for (var i = 0; i < aAvaliableDatabases.length; i++) {
+            this_.$scope_['aAvaliableDatabases'].push(aAvaliableDatabases[i]['database']);
+        }
+
+        // watch scope.sSelectedDatabase et charge les objets correspondants
+        this_.selectedDatabaseWatcher = this_.$scope_.$watch('sSelectedDatabase', function () {
+            if (goog.isDefAndNotNull(this_.$scope_['sSelectedDatabase'])) {
+                this_.getSQLObjects_(this_.$scope_['sSelectedDatabase']).then(function (oSqlObjects) {
+                    this_.$scope_['aSQLObjects'] = oSqlObjects;
+
+                    // Vérifie que les couches utilisent bien cette base de données
+                    this_.checkLayersDatabase_();
+
+                    // Vérifie que les objets métiers utilisent bien cette base de données
+                    this_.checkBOsDatabase_();
+
+                    // Charge le treeview
+                    this_.loadSQLObjectsTreeview_();
+                });
+            }
+        });
+
+        // Trouve la base de données utilisée par les objets métier et les couches vm4ms
+        var sDefaultDatabase = this_.findDefaultDatabase_();
+        if (goog.isDefAndNotNull(sDefaultDatabase)) {
+            this_.$scope_['sSelectedDatabase'] = sDefaultDatabase;
+        }
+
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Make Ajax request to get the avaliable databases
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.geAvaliableDatabases_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.geAvaliableDatabases_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vitis/genericquerys/databases',
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+            if (!goog.isDefAndNotNull(response['data']['genericquerys'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['genericquerys'][0])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES'], "error");
+                console.error('error');
+                return null;
+            }
+
+            deferred.resolve(response['data']['genericquerys']);
+
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Make Ajax request to get schemas, tables, views list
+ * @param {string} sDatabase
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.getSQLObjects_ = function (sDatabase) {
+    this.$log_.info("nsVmap.exportVexCtrl.getSQLObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/sql_objects',
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'params': {
+            'database': sDatabase
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['sql_objects'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['sql_objects'][0])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+
+            deferred.resolve(response['data']['sql_objects']);
+
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the treeview to select sql objects
+ */
+nsVmap.exportVexCtrl.prototype.loadSQLObjectsTreeview_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.loadSQLObjectsTreeview_");
+
+    var this_ = this;
+
+    $('#export-vex-sql-objects-treeview')['treeview']({
+        'data': this.getTreeviewDataFromSQLObjects_(),
+        'onNodeChecked': function (event, oNode) {
+            this_.onSQLObjcetsTreeviewUpdate_('nodeChecked', oNode);
+        },
+        'onNodeCollapsed': function (event, oNode) {
+            this_.onSQLObjcetsTreeviewUpdate_('nodeCollapsed', oNode);
+        },
+        'onNodeExpanded': function (event, oNode) {
+            this_.onSQLObjcetsTreeviewUpdate_('nodeExpanded', oNode);
+        },
+        'onNodeUnchecked': function (event, oNode) {
+            this_.onSQLObjcetsTreeviewUpdate_('nodeUnchecked', oNode);
+        },
+        'expandIcon': '',
+        'collapseIcon': '',
+        'showBorder': false,
+        'showCheckbox': true
+    });
+};
+
+/**
+ * Get the treeview formed objects from scope.aSQLObjects
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewDataFromSQLObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewDataFromSQLObjects_");
+
+    var aData = [];
+    var oSchema;
+
+    if (goog.isArray(this.$scope_['aSQLObjects'])) {
+        for (var i = 0; i < this.$scope_['aSQLObjects'].length; i++) {
+
+            oSchema = {
+                'text': this.$scope_['aSQLObjects'][i]['name'],
+                'icon': 'icon-tree',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'properties_': {
+                    'type': 'schema',
+                    'name': this.$scope_['aSQLObjects'][i]['name']
+                },
+                'nodes': goog.array.concat(this.getTreeviewTablesFromSchema_(this.$scope_['aSQLObjects'][i]), this.getTreeviewViewsFromSchema_(this.$scope_['aSQLObjects'][i]), this.getTreeviewSequencesFromSchema_(this.$scope_['aSQLObjects'][i]))
+            };
+
+            aData.push(oSchema);
+        }
+    } else {
+        console.error('aSQLObjects undefined');
+    }
+
+    // Sélectionne automatiquement les talbes mentionnées dans les couches vm4ms
+    aData = this.autoSelectVm4msLayersTables_(aData);
+
+    // Sélectionne automatiquement les talbes mentionnées dans les objets métier
+    aData = this.autoSelectBusinessObjectsTables_(aData);
+
+    return aData;
+};
+
+/**
+ * Sélectionne automatiquement les schémas et tables utilisés dans les couches
+ * @param {array} aData
+ */
+nsVmap.exportVexCtrl.prototype.autoSelectVm4msLayersTables_ = function (aData) {
+    this.$log_.info("nsVmap.exportVexCtrl.autoSelectVm4msLayersTables_");
+
+    var sSelectedDatabase = this.$scope_['sSelectedDatabase'];
+    var aVm4msLayers = this.$scope_['oVmapObjects']['vm4ms_layers'];
+    var aSelectedVm4msLayers = this.$scope_['oSelectedVmapObjects']['vm4ms_layers'];
+
+    var aUsedSchemas = [];
+    var aUsedTables = [];
+
+    // Stoke la liste des schémas et tables/vues
+    if (goog.isArray(aVm4msLayers) && goog.isArray(aSelectedVm4msLayers)) {
+        for (var i = 0; i < aVm4msLayers.length; i++) {
+            if (aSelectedVm4msLayers.indexOf(aVm4msLayers[i]['name']) !== -1) {
+                if (goog.isDefAndNotNull(aVm4msLayers[i]['properties_'])) {
+                    if (aVm4msLayers[i]['properties_']['database'] === sSelectedDatabase) {
+                        // Schemas
+                        if (aUsedSchemas.indexOf(aVm4msLayers[i]['properties_']['schema']) === -1) {
+                            aUsedSchemas.push(aVm4msLayers[i]['properties_']['schema']);
+                        }
+                        // Tables/vues
+                        if (aUsedTables.indexOf(aVm4msLayers[i]['properties_']['table']) === -1) {
+                            aUsedTables.push(aVm4msLayers[i]['properties_']['table']);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Sélectionne les schemas, tables, vues
+    for (var i = 0; i < aData.length; i++) {
+        if (goog.isDefAndNotNull(aData[i]['properties_'])) {
+            if (aData[i]['properties_']['type'] === 'schema') {
+                if (aUsedSchemas.indexOf(aData[i]['properties_']['name']) !== -1) {
+                    aData[i]['state']['checked'] = true;
+                    aData[i]['state']['expanded'] = true;
+
+                    // Sélectionne les tables, vues
+                    if (goog.isArray(aData[i]['nodes'])) {
+                        for (var ii = 0; ii < aData[i]['nodes'].length; ii++) {
+                            if (goog.isDefAndNotNull(aData[i]['nodes'][ii]['properties_'])) {
+                                if (aData[i]['nodes'][ii]['properties_']['type'] === 'table' ||
+                                        aData[i]['nodes'][ii]['properties_']['type'] === 'view') {
+                                    if (aUsedTables.indexOf(aData[i]['nodes'][ii]['properties_']['name']) !== -1) {
+                                        aData[i]['nodes'][ii]['state']['checked'] = true;
+                                        aData[i]['nodes'][ii]['state']['expanded'] = true;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return aData;
+};
+
+/**
+ * Sélectionne automatiquement les schémas et tables utilisés dans les objets métier
+ * @param {array} aData
+ */
+nsVmap.exportVexCtrl.prototype.autoSelectBusinessObjectsTables_ = function (aData) {
+    this.$log_.info("nsVmap.exportVexCtrl.autoSelectBusinessObjectsTables_");
+
+    var sSelectedDatabase = this.$scope_['sSelectedDatabase'];
+    var aBusinessObjects = this.$scope_['oVmapObjects']['business_objects'];
+    var aSelectedaBusinessObjects = this.$scope_['oSelectedVmapObjects']['business_objects'];
+
+    var aUsedSchemas = [];
+    var aUsedTables = [];
+
+    // Stoke la liste des schémas et tables/vues
+    if (goog.isArray(aBusinessObjects) && goog.isArray(aSelectedaBusinessObjects)) {
+        for (var i = 0; i < aBusinessObjects.length; i++) {
+            if (aSelectedaBusinessObjects.indexOf(aBusinessObjects[i]['business_object_id']) !== -1) {
+                if (goog.isDefAndNotNull(aBusinessObjects[i]['properties_'])) {
+                    if (aBusinessObjects[i]['properties_']['database'] === sSelectedDatabase) {
+                        // Schemas
+                        if (aUsedSchemas.indexOf(aBusinessObjects[i]['properties_']['schema']) === -1) {
+                            aUsedSchemas.push(aBusinessObjects[i]['properties_']['schema']);
+                        }
+                        // Tables/vues
+                        if (aUsedTables.indexOf(aBusinessObjects[i]['properties_']['table']) === -1) {
+                            aUsedTables.push(aBusinessObjects[i]['properties_']['table']);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Sélectionne les schemas, talbes, vues
+    for (var i = 0; i < aData.length; i++) {
+        if (goog.isDefAndNotNull(aData[i]['properties_'])) {
+            if (aData[i]['properties_']['type'] === 'schema') {
+                if (aUsedSchemas.indexOf(aData[i]['properties_']['name']) !== -1) {
+                    aData[i]['state']['checked'] = true;
+                    aData[i]['state']['expanded'] = true;
+
+                    // Sélectionne les tables/vues
+                    if (goog.isArray(aData[i]['nodes'])) {
+                        for (var ii = 0; ii < aData[i]['nodes'].length; ii++) {
+                            if (goog.isDefAndNotNull(aData[i]['nodes'][ii]['properties_'])) {
+                                if (aData[i]['nodes'][ii]['properties_']['type'] === 'table' ||
+                                        aData[i]['nodes'][ii]['properties_']['type'] === 'view') {
+                                    if (aUsedTables.indexOf(aData[i]['nodes'][ii]['properties_']['name']) !== -1) {
+                                        aData[i]['nodes'][ii]['state']['checked'] = true;
+                                        aData[i]['nodes'][ii]['state']['expanded'] = true;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return aData;
+};
+
+/**
+ * Vérifie que toutes les couches vm4ms utilisent bien cette base de données et affiche un warning en cas contraire
+ * @returns {boolean}
+ */
+nsVmap.exportVexCtrl.prototype.checkLayersDatabase_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.checkLayersDatabase_");
+
+    var sSelectedDatabase = this.$scope_['sSelectedDatabase'];
+    var aVm4msLayers = this.$scope_['oVmapObjects']['vm4ms_layers'];
+    var aSelectedVm4msLayers = this.$scope_['oSelectedVmapObjects']['vm4ms_layers'];
+
+    var bReturn = false;
+    if (goog.isArray(aVm4msLayers) && goog.isArray(aSelectedVm4msLayers)) {
+        bReturn = true;
+        for (var i = 0; i < aVm4msLayers.length; i++) {
+            if (aSelectedVm4msLayers.indexOf(aVm4msLayers[i]['name']) !== -1) {
+                if (goog.isDefAndNotNull(aVm4msLayers[i]['properties_'])) {
+                    if (aVm4msLayers[i]['properties_']['database'] !== sSelectedDatabase) {
+                        $.notify('La couche ' + aVm4msLayers[i]['name'] + ' utilise une autre base de données');
+                        bReturn = false;
+                    }
+                }
+            }
+        }
+    }
+
+    return bReturn;
+};
+
+/**
+ * Vérifie que tous les objets métier utilisent bien cette base de données et affiche un warning en cas contraire
+ * @returns {boolean}
+ */
+nsVmap.exportVexCtrl.prototype.checkBOsDatabase_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.checkBOsDatabase_");
+
+    var sSelectedDatabase = this.$scope_['sSelectedDatabase'];
+    var aBusinessObjects = this.$scope_['oVmapObjects']['business_objects'];
+    var aSelectedaBusinessObjects = this.$scope_['oSelectedVmapObjects']['business_objects'];
+
+    var bReturn = false;
+    if (goog.isArray(aBusinessObjects) && goog.isArray(aSelectedaBusinessObjects)) {
+        bReturn = true;
+        for (var i = 0; i < aBusinessObjects.length; i++) {
+            if (aSelectedaBusinessObjects.indexOf(aBusinessObjects[i]['business_object_id']) !== -1) {
+                if (goog.isDefAndNotNull(aBusinessObjects[i]['properties_'])) {
+                    if (aBusinessObjects[i]['properties_']['database'] !== sSelectedDatabase) {
+                        $.notify('L\'objet métier ' + aBusinessObjects[i]['business_object_id'] + ' utilise une autre base de données');
+                        bReturn = false;
+                    }
+                }
+            }
+        }
+    }
+
+    return bReturn;
+};
+
+/**
+ * Trouve la base de données utilisée par les objets métiers et couches vm4ms
+ * si la valeur difère, retourne null
+ * @returns {null|string}
+ */
+nsVmap.exportVexCtrl.prototype.findDefaultDatabase_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.findDefaultDatabase_");
+
+    var sDatabase = null;
+    var aBusinessObjects = this.$scope_['oVmapObjects']['business_objects'];
+    var aSelectedaBusinessObjects = this.$scope_['oSelectedVmapObjects']['business_objects'];
+    var aVm4msLayers = this.$scope_['oVmapObjects']['vm4ms_layers'];
+    var aSelectedVm4msLayers = this.$scope_['oSelectedVmapObjects']['vm4ms_layers'];
+
+    // Recherche dans les couches vm4ms
+    if (goog.isArray(aVm4msLayers) && goog.isArray(aSelectedVm4msLayers)) {
+        for (var i = 0; i < aVm4msLayers.length; i++) {
+            if (aSelectedVm4msLayers.indexOf(aVm4msLayers[i]['name']) !== -1) {
+                if (goog.isDefAndNotNull(aVm4msLayers[i]['properties_'])) {
+                    if (!goog.isDefAndNotNull(sDatabase)) {
+                        // Première valeur
+                        sDatabase = aVm4msLayers[i]['properties_']['database'];
+                    } else {
+                        // Si la valeur difère c'est qu'il y a multiple databases, alors return null
+                        if (aVm4msLayers[i]['properties_']['database'] !== sDatabase) {
+                            return null;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Recherche dans les objets métier
+    if (goog.isArray(aBusinessObjects) && goog.isArray(aSelectedaBusinessObjects)) {
+        for (var i = 0; i < aBusinessObjects.length; i++) {
+            if (aSelectedaBusinessObjects.indexOf(aBusinessObjects[i]['business_object_id']) !== -1) {
+                if (goog.isDefAndNotNull(aBusinessObjects[i]['properties_'])) {
+                    if (!goog.isDefAndNotNull(sDatabase)) {
+                        // Première valeur
+                        sDatabase = aBusinessObjects[i]['properties_']['database'];
+                    } else {
+                        // Si la valeur difère c'est qu'il y a multiple databases, alors return null
+                        if (aBusinessObjects[i]['properties_']['database'] !== sDatabase) {
+                            return null;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return sDatabase;
+};
+
+/**
+ * Get the treeview formed tables from the given sql schema
+ * @param {object} oSchema
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewTablesFromSchema_ = function (oSchema) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewTablesFromSchema_");
+
+    var aFiles = [];
+    var oFile;
+    if (goog.isArray(oSchema['tables'])) {
+        for (var i = 0; i < oSchema['tables'].length; i++) {
+            oFile = {
+                'text': oSchema['tables'][i],
+                'icon': 'icon-table',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'nodes': [{
+                        'text': 'Modèle',
+                        'icon': 'icon-code',
+                        'selectable': false,
+                        'state': {
+                            'checked': true,
+                            'expanded': false
+                        },
+                        'nodes': [],
+                        'properties_': {
+                            'type': 'model'
+                        }
+                    }, {
+                        'text': 'Données',
+                        'icon': 'icon-format_list_bulleted',
+                        'selectable': false,
+                        'state': {
+                            'checked': false,
+                            'expanded': false
+                        },
+                        'nodes': [],
+                        'properties_': {
+                            'type': 'data'
+                        }
+                    }],
+                'properties_': {
+                    'type': 'table',
+                    'name': oSchema['tables'][i]
+                }
+            };
+            aFiles.push(oFile);
+        }
+    }
+
+    return aFiles;
+};
+
+/**
+ * Get the treeview formed views from the given sql schema
+ * @param {object} oSchema
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewViewsFromSchema_ = function (oSchema) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewViewsFromSchema_");
+
+    var aFiles = [];
+    var oFile;
+    if (goog.isArray(oSchema['views'])) {
+        for (var i = 0; i < oSchema['views'].length; i++) {
+            oFile = {
+                'text': 'Vue: ' + oSchema['views'][i],
+                'icon': 'icon-code',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'nodes': [],
+                'properties_': {
+                    'type': 'view',
+                    'name': oSchema['views'][i]
+                }
+            };
+            aFiles.push(oFile);
+        }
+    }
+
+    return aFiles;
+};
+
+/**
+ * Get the treeview formed sequences from the given sql schema
+ * @param {object} oSchema
+ * @returns {Array}
+ */
+nsVmap.exportVexCtrl.prototype.getTreeviewSequencesFromSchema_ = function (oSchema) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTreeviewSequencesFromSchema_");
+
+    var aFiles = [];
+    var oFile;
+    if (goog.isArray(oSchema['sequences'])) {
+        for (var i = 0; i < oSchema['sequences'].length; i++) {
+            oFile = {
+                'text': 'Séquence: ' + oSchema['sequences'][i],
+                'icon': 'icon-code',
+                'selectable': false,
+                'state': {
+                    'checked': false,
+                    'expanded': false
+                },
+                'nodes': [],
+                'properties_': {
+                    'type': 'sequence',
+                    'name': oSchema['sequences'][i]
+                }
+            };
+            aFiles.push(oFile);
+        }
+    }
+
+    return aFiles;
+};
+
+/**
+ * Function called when a node state is updated
+ * @param {string} sEvent
+ * @param {object} oNode
+ */
+nsVmap.exportVexCtrl.prototype.onSQLObjcetsTreeviewUpdate_ = function (sEvent, oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.onSQLObjcetsTreeviewUpdate_");
+
+    // Sélectionne un schéma quand il s'ouvre
+    if (sEvent === 'nodeExpanded' && oNode['properties_']['type'] === 'schema') {
+        if (oNode['state']['checked'] === false) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    // Dé-sélectionne un schéma ainsi que ses tables quand il se ferme
+    if (sEvent === 'nodeCollapsed' && oNode['properties_']['type'] === 'schema') {
+        if (oNode['state']['checked'] === true) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['uncheckNode'](oNode['nodeId'], {'silent': true});
+        }
+        if (goog.isArray(oNode['nodes'])) {
+            for (var i = 0; i < oNode['nodes'].length; i++) {
+                if (oNode['nodes'][i]['state']['checked'] === true) {
+                    $('#export-vex-sql-objects-treeview').data('treeview')['uncheckNode'](oNode['nodes'][i]['nodeId'], {'silent': true});
+                }
+            }
+        }
+        return 0;
+    }
+
+    // Ouvre un schéma ou une table quand on le sélectionne
+    if (sEvent === 'nodeChecked' && (oNode['properties_']['type'] === 'schema' || oNode['properties_']['type'] === 'table')) {
+        if (oNode['state']['expanded'] === false) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['expandNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    // Ferme une table quand on la déselectionne
+    if (sEvent === 'nodeUnchecked' && oNode['properties_']['type'] === 'table') {
+        if (oNode['state']['expanded'] === true) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['collapseNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    // Ferme un schéma quand on le déselectionne et désélectionne ses tables au passage
+    if (sEvent === 'nodeUnchecked' && oNode['properties_']['type'] === 'schema') {
+        if (oNode['state']['expanded'] === true) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['collapseNode'](oNode['nodeId']);
+        }
+        return 0;
+    }
+
+    //Re-sélectionne un modèle quand on le dé-sélectionne ou qu'on le ferme
+    if ((sEvent === 'nodeUnchecked' || sEvent === 'nodeCollapsed') && oNode['properties_']['type'] === 'model') {
+        if (oNode['state']['expanded'] === false) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['expandNode'](oNode['nodeId'], {'silent': true});
+        }
+        if (oNode['state']['checked'] === false) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    // Sélectionne table ou modele ou donnée quand on l'ouvre
+    if (sEvent === 'nodeExpanded' &&
+            (oNode['properties_']['type'] === 'table' ||
+                    oNode['properties_']['type'] === 'sequence' ||
+                    oNode['properties_']['type'] === 'model' ||
+                    oNode['properties_']['type'] === 'data')) {
+        if (oNode['state']['checked'] === false) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+    // Dé-sélectionne table ou donnée quand on la ferme
+    if (sEvent === 'nodeCollapsed' &&
+            (oNode['properties_']['type'] === 'table' ||
+                    oNode['properties_']['type'] === 'sequence' ||
+                    oNode['properties_']['type'] === 'data')) {
+        if (oNode['state']['checked'] === true) {
+            $('#export-vex-sql-objects-treeview').data('treeview')['uncheckNode'](oNode['nodeId'], {'silent': true});
+        }
+        return 0;
+    }
+
+
+};
+
+/**
+ * Update scope.aSelectedSQLObjects from the treeview data
+ */
+nsVmap.exportVexCtrl.prototype.updateSelectedSQLObjectsFromTreeviewData_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.updateSelectedSQLObjectsFromTreeviewData_");
+
+    // Vide les listes
+    goog.array.clear(this.$scope_['aSelectedSQLObjects']);
+
+    if (!goog.isDefAndNotNull($('#export-vex-sql-objects-treeview').data('treeview'))) {
+        return false;
+    }
+
+    var aCheckedNodes = $('#export-vex-sql-objects-treeview').data('treeview')['getChecked']();
+
+    var oSchema;
+    for (var i = 0; i < aCheckedNodes.length; i++) {
+        if (goog.isDefAndNotNull(aCheckedNodes[i]['properties_'])) {
+            if (goog.isDefAndNotNull(aCheckedNodes[i]['properties_']['type'])) {
+                if (aCheckedNodes[i]['properties_']['type'] === 'schema') {
+
+                    oSchema = this.getSchemaFromTreeViewData_(aCheckedNodes[i]);
+                    if (goog.isDefAndNotNull(oSchema)) {
+                        this.$scope_['aSelectedSQLObjects'].push(oSchema);
+                    }
+                }
+            }
+        }
+    }
+    return true;
+};
+
+/**
+ * Get the schema from the tree view data node
+ * @param {object} oNode
+ * @returns {object}
+ */
+nsVmap.exportVexCtrl.prototype.getSchemaFromTreeViewData_ = function (oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.getSchemaFromTreeViewData_");
+
+    var aTables = [];
+    var aViews = [];
+    var aSequences = [];
+    var oSchema, oTable, oView, oSequence;
+    if (goog.isArray(oNode['nodes'])) {
+        for (var i = 0; i < oNode['nodes'].length; i++) {
+            if (goog.isDefAndNotNull(oNode['nodes'][i]['state'])) {
+                if (oNode['nodes'][i]['state']['checked'] === true) {
+                    // Tables
+                    if (oNode['nodes'][i]['properties_']['type'] === 'table') {
+                        oTable = this.getTableFromTreeViewData_(oNode['nodes'][i]);
+                        if (goog.isDefAndNotNull(oTable)) {
+                            aTables.push(oTable);
+                        }
+                    }
+                    // Vues
+                    if (oNode['nodes'][i]['properties_']['type'] === 'view') {
+                        oView = this.getViewFromTreeViewData_(oNode['nodes'][i]);
+                        if (goog.isDefAndNotNull(oView)) {
+                            aViews.push(oView);
+                        }
+                    }
+                    // Séquences
+                    if (oNode['nodes'][i]['properties_']['type'] === 'sequence') {
+                        oSequence = this.getSequenceFromTreeViewData_(oNode['nodes'][i]);
+                        if (goog.isDefAndNotNull(oSequence)) {
+                            aSequences.push(oSequence);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (aTables.length > 0) {
+        oSchema = {
+            'type': 'schema',
+            'name': oNode['properties_']['name'],
+            'tables': angular.copy(aTables),
+            'views': angular.copy(aViews),
+            'sequences': angular.copy(aSequences)
+        };
+    }
+
+    return oSchema;
+};
+
+/**
+ * Get the table from the tree view data node
+ * @param {object} oNode
+ * @returns {object}
+ */
+nsVmap.exportVexCtrl.prototype.getTableFromTreeViewData_ = function (oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.getTableFromTreeViewData_");
+
+    var oTable;
+    var isModelChecked = false;
+    var isDataChecked = false;
+
+    if (goog.isArray(oNode['nodes'])) {
+        for (var i = 0; i < oNode['nodes'].length; i++) {
+            if (goog.isDefAndNotNull(oNode['nodes'][i]['properties_'])) {
+                if (oNode['nodes'][i]['properties_']['type'] === 'model') {
+                    if (oNode['nodes'][i]['state']['checked'] === true) {
+                        isModelChecked = true;
+                    }
+                }
+                if (oNode['nodes'][i]['properties_']['type'] === 'data') {
+                    if (oNode['nodes'][i]['state']['checked'] === true) {
+                        isDataChecked = true;
+                    }
+                }
+            }
+        }
+    }
+
+    if (isModelChecked) {
+        oTable = {
+            'type': 'table',
+            'name': oNode['properties_']['name'],
+            'model': isModelChecked,
+            'data': isDataChecked
+        };
+    }
+
+    return oTable;
+};
+
+/**
+ * Get the sequence from the tree view data node
+ * @param {object} oNode
+ * @returns {object}
+ */
+nsVmap.exportVexCtrl.prototype.getSequenceFromTreeViewData_ = function (oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.getSequenceFromTreeViewData_");
+
+    var oSequence;
+    oSequence = {
+        'type': 'sequence',
+        'name': oNode['properties_']['name']
+    };
+
+    return oSequence;
+};
+
+/**
+ * Get the view from the tree view data node
+ * @param {object} oNode
+ * @returns {object}
+ */
+nsVmap.exportVexCtrl.prototype.getViewFromTreeViewData_ = function (oNode) {
+    this.$log_.info("nsVmap.exportVexCtrl.getViewFromTreeViewData_");
+
+    var oView;
+    oView = {
+        'type': 'view',
+        'name': oNode['properties_']['name']
+    };
+
+    return oView;
+};
+
+/**
+ * Check if the given SQL objects are valid
+ * @returns {defer.promise}
+ */
+nsVmap.exportVexCtrl.prototype.validateSelectedSQLObjects_ = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.validateSelectedSQLObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var bSelectedSQLObjectsUpdated = this.updateSelectedSQLObjectsFromTreeviewData_();
+    setTimeout(function () {
+        console.log("this.$scope_['aSelectedSQLObjects']: ", this_.$scope_['aSelectedSQLObjects']);
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+
+// Execution export
+
+/**
+ * Execute the export
+ * @export
+ */
+nsVmap.exportVexCtrl.prototype.executeExport = function () {
+    this.$log_.info("nsVmap.exportVexCtrl.executeExport");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var oRequestParams = {};
+
+    if (goog.isDefAndNotNull(this.$scope_['oSelectedVmapObjects'])) {
+        oRequestParams['vmap_objects'] = JSON.stringify(this.$scope_['oSelectedVmapObjects']);
+    }
+
+    if (goog.isDefAndNotNull(this.$scope_['aSelectedWebServices'])) {
+        oRequestParams['web_services'] = this.$scope_['aSelectedWebServices'];
+    }
+
+    if (goog.isDefAndNotNull(this.$scope_['sSelectedDatabase']) && goog.isDefAndNotNull(this.$scope_['aSelectedSQLObjects'])) {
+
+        var oSQLObjects = {
+            'type': 'database',
+            'name': this.$scope_['sSelectedDatabase'],
+            'schemas': this.$scope_['aSelectedSQLObjects']
+        };
+        oRequestParams['sql_objects'] = JSON.stringify(oSQLObjects);
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/export_vex',
+        'headers': {
+            'Accept': 'application/json'
+        },
+        'data': oRequestParams,
+        'scope': this.$scope_,
+        'responseType': 'blob',
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['size'])) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!response['data']['size'] > 0) {
+                $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+
+            // IE
+            if (window.navigator['msSaveOrOpenBlob']) {
+                window.navigator['msSaveOrOpenBlob'](response['data'], 'vmap_export.vex');
+            }
+            // Others
+            else {
+                oVmap.downloadBlob(response['data'], 'vmap_export.vex');
+            }
+
+            this_.$scope_['bExportOk'] = true;
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+
+// Definition du controlleur angular
+oVmap.module.controller('AppExportVexController', nsVmap.exportVexCtrl);
diff --git a/module/javascript/vitis/controllers/importVexCtrl.js b/module/javascript/vitis/controllers/importVexCtrl.js
new file mode 100755
index 0000000000000000000000000000000000000000..37c87294c2fa5bcf30da4e99259f4a344cf73552
--- /dev/null
+++ b/module/javascript/vitis/controllers/importVexCtrl.js
@@ -0,0 +1,2436 @@
+/* global goog, nsVmap, oVmap, bootbox, vitisApp, this */
+
+goog.provide('nsVmap.importVexCtrl');
+goog.require('oVmap');
+
+/**
+ * ImportVex controller
+ * @param {object} $scope
+ * @param {object} $log
+ * @param {object} $q
+ * @param {object} $translate
+ * @returns {nsVmap.importVexCtrl}
+ * @export
+ * @ngInject
+ */
+nsVmap.importVexCtrl = function ($scope, $log, $q, $translate) {
+    $log.info("nsVmap.importVexCtrl");
+
+    this.$log_ = $log;
+    this.$scope_ = $scope;
+    this.$q_ = $q;
+    this.$translate_ = $translate;
+    this.mainScope_ = angular.element(vitisApp.appMainDrtv).scope();
+
+    this['oProperties'] = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]);
+    this['sToken'] = sessionStorage['session_token'];
+    this['oTranslations'] = {};
+
+    this.aImportedObjects_ = [];
+    this.schemaRegexp_ = new RegExp(/^([a-zA-Z0-9_]*)$/);
+
+    /**
+     * Current step
+     */
+    $scope['displayedStep'] = '';
+
+    // Étapes
+    $scope['steps'] = ['import_vex_file', 'config', 'vmap_objects', 'web_services', 'import_sql', 'execute_import', 'finalize'];
+
+    /**
+     * Objets SQL exploitables
+     */
+    $scope['oSql'] = null;
+
+    /**
+     * Objets vMap exportables
+     */
+    $scope['oVMapObjects'] = null;
+
+    /**
+     * Liste des services web exploitables
+     */
+    $scope['aWebServices'] = null;
+
+
+    // Sélections
+
+    /**
+     * Base de données sélectionnée
+     * par défaut vaut la valaur de la connexion privée
+     */
+    $scope['usedDatabase'] = null;
+
+    /**
+     * Schema sélectionné
+     */
+    $scope['usedSchema'] = null;
+
+    /**
+     * SRID sélectionné
+     * par défaut vaut 2154
+     */
+    $scope['usedSRID'] = null;
+
+    /**
+     * User role in database
+     */
+    $scope['usedUserRole'] = null;
+
+    /**
+     * Admin role in database
+     */
+    $scope['usedAdminRole'] = null;
+
+
+    // Listes
+
+    /**
+     * Liste des bases de données disponibles
+     */
+    $scope['aDatabases'] = [];
+
+    /**
+     * Liste des schemas disponibles
+     */
+    $scope['aSchemas'] = [];
+
+    /**
+     * Liste des roles group disponibles
+     */
+    $scope['aRoleGroups'] = [];
+
+    /**
+     * Liste des coordsys disponibles
+     */
+    $scope['aCoordsys'] = [];
+
+    /**
+     * Connexion privée
+     */
+    $scope['oPrivateConnection'] = null;
+
+
+    // Interface
+
+    /**
+     * Étapes à passer
+     */
+    $scope['selectedSteps'] = {
+        'import_vex_file': true,
+        'config': true,
+        'vmap_objects': true,
+        'import_sql': true,
+        'web_services': true,
+        'execute_import': true,
+        'finalize': true
+    };
+
+    /**
+     * Modèle de données SQL
+     */
+    $scope['sSQLModel'] = '';
+
+    /**
+     * Données SQL
+     */
+    $scope['sSQLData'] = '';
+
+    /**
+     * Étapes de l'import
+     */
+    $scope['oImportSteps'] = {
+        'vmap_objects': null,
+        'vmap_objects_maps': null,
+        'vmap_objects_services': null,
+        'vmap_objects_calques': null,
+        'vmap_objects_calque_themes': null,
+        'vmap_objects_vm4ms_layers': null,
+        'vmap_objects_business_objects': null,
+        'vmap_objects_events': null,
+        'vmap_objects_reports': null,
+        'web_services': null,
+        'sql': null,
+        'sql_model': null,
+        'sql_data': null
+    };
+
+    $scope['bImportDone'] = false;
+
+    // temporaires
+    this.lastParentCollapseTimeout_ = 0;
+    this.selectedDatabaseWatcher = null;
+    this.oExistingVMapObjects_ = null;
+    this.aExistingWebServices_ = null;
+    this.oImportedVmapObjects_ = null;
+
+    // Traductions
+    this.importTranslations_();
+
+    // Première étape
+    this.goStep('import_vex_file');
+};
+
+
+// Fonctions publiques
+
+/**
+ * Function called to submit a step
+ * @param {string} step
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.submitStep = function (step) {
+    this.$log_.info("nsVmap.importVexCtrl.submitStep");
+
+    var this_ = this;
+
+    switch (step) {
+        case 'import_vex_file':
+            this.parseVexFile_().then(function () {
+                this_.nextStep();
+            });
+            break;
+        case 'config':
+            if (this.isConfigStateValid()) {
+                this_.nextStep();
+            }
+            break;
+        case 'vmap_objects':
+            if (goog.isObject(this_.oExistingVMapObjects_)) {
+                if (Object.keys(this_.oExistingVMapObjects_).length > 0) {
+
+                    var iNumber = 0;
+                    var sMessage = this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_EXISTING_VMAP_OBJETS'];
+                    for (var key in this_.oExistingVMapObjects_) {
+                        if (goog.isArray(this_.oExistingVMapObjects_[key])) {
+                            iNumber += this_.oExistingVMapObjects_[key].length;
+                        }
+                    }
+                    sMessage = sMessage.replace('[number]', iNumber);
+
+                    bootbox.confirm('<h4>' + sMessage + '</h4>', function (result) {
+                        if (result) {
+                            this_.$scope_.$applyAsync(function () {
+                                this_.nextStep();
+                            });
+                        }
+                    });
+                    break;
+                }
+            }
+            this_.nextStep();
+            break;
+        case 'import_sql':
+            bootbox.confirm('<h4>' + this_['oTranslations']['CTRL_IMPORT_VEX_WARNING_SQL'] + '</h4>', function (result) {
+                if (result) {
+                    this_.$scope_.$applyAsync(function () {
+                        this_.nextStep();
+                    });
+                }
+            });
+            break;
+            break;
+        default:
+            this.nextStep();
+            break;
+    }
+};
+
+/**
+ * Function called to display the next step
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.nextStep = function () {
+    this.$log_.info("nsVmap.importVexCtrl.nextStep");
+
+    var this_ = this;
+    var step = angular.copy(this.$scope_['displayedStep']);
+    var nextStep;
+
+    // Changement de step
+    var stepIndex = this.$scope_['steps'].indexOf(step);
+    if (stepIndex !== -1) {
+        if (goog.isDefAndNotNull(this.$scope_['steps'][stepIndex + 1])) {
+            nextStep = this.$scope_['steps'][stepIndex + 1];
+        } else {
+            console.error('next step doesn\'t exists');
+            return null;
+        }
+    } else {
+        console.error('this step doesn\'t exists');
+        return null;
+    }
+
+    this.goStep(nextStep);
+};
+
+/**
+ * Function called to display the previous step
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.prevStep = function () {
+    this.$log_.info("nsVmap.importVexCtrl.prevStep");
+
+    var this_ = this;
+    var step = angular.copy(this.$scope_['displayedStep']);
+    var prevStep;
+
+    // Changement de step
+    var stepIndex = this.$scope_['steps'].indexOf(step);
+    if (stepIndex !== -1) {
+        if (goog.isDefAndNotNull(this.$scope_['steps'][stepIndex - 1])) {
+            prevStep = this.$scope_['steps'][stepIndex - 1];
+        } else {
+            console.error('previous step doesn\'t exists');
+            return null;
+        }
+    } else {
+        console.error('this step doesn\'t exists');
+        return null;
+    }
+
+    this.goStep(prevStep);
+};
+
+/**
+ * Go to the specified step
+ * @param {string} step
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.goStep = function (step) {
+    this.$log_.info("nsVmap.importVexCtrl.goStep");
+
+    var this_ = this;
+
+    var currentIndex = this_.$scope_['steps'].indexOf(this_.$scope_['displayedStep']);
+    var stepIndex = this_.$scope_['steps'].indexOf(step);
+
+    // Marche avant
+    if (!(currentIndex > stepIndex)) {
+        if (this_.$scope_['selectedSteps'][step] !== false) {
+            switch (step) {
+                case 'config':
+                    this.loadConfigObjects_().then(function () {
+                        this_.$scope_['displayedStep'] = step;
+                    });
+                    break;
+                case 'vmap_objects':
+                    this.loadVMapObjects_().then(function () {
+                        this_.$scope_['displayedStep'] = step;
+                    }, function () {
+                        this_.$scope_['displayedStep'] = step;
+                        this_.nextStep();
+                    });
+                    break;
+                case 'import_sql':
+                    this.loadSql_().then(function () {
+                        this_.$scope_['displayedStep'] = step;
+                    }, function () {
+                        this_.$scope_['displayedStep'] = step;
+                        this_.nextStep();
+                    });
+                    break;
+                case 'web_services':
+                    this.loadWebServices_().then(function () {
+                        this_.$scope_['displayedStep'] = step;
+                    }, function () {
+                        this_.$scope_['displayedStep'] = step;
+                        this_.nextStep();
+                    });
+                    break;
+                case 'execute_import':
+                    this_.$scope_['oImportSteps']['vmap_objects'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_maps'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_services'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_calques'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_calque_themes'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_vm4ms_layers'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_business_objects'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_events'] = null;
+                    this_.$scope_['oImportSteps']['vmap_objects_reports'] = null;
+                    this_.$scope_['oImportSteps']['web_services'] = null;
+                    this_.$scope_['oImportSteps']['sql'] = null;
+                    this_.$scope_['oImportSteps']['sql_model'] = null;
+                    this_.$scope_['oImportSteps']['sql_data'] = null;
+                    this_.$scope_['displayedStep'] = step;
+                    break;
+                default:
+                    this.$scope_['displayedStep'] = step;
+                    break;
+            }
+        } else {
+
+            // Cas où l'étape ait été sautée
+            switch (step) {
+                case 'vmap_objects':
+                    this_.$scope_['oVMapObjects'] = null;
+                    this.$scope_['displayedStep'] = step;
+                    this.nextStep();
+                    break;
+                case 'import_sql':
+                    this_.$scope_['oSql'] = null;
+                    this_.$scope_['sSQLModel'] = '';
+                    this_.$scope_['sSQLData'] = '';
+                    this.$scope_['displayedStep'] = step;
+                    this.nextStep();
+                    break;
+                case 'web_services':
+                    this_.$scope_['aWebServices'] = null;
+                    this.$scope_['displayedStep'] = step;
+                    this.nextStep();
+                    break;
+                default:
+                    this.$scope_['displayedStep'] = step;
+                    this.nextStep();
+                    break;
+            }
+        }
+    }
+
+    // Marche arrière
+    if (currentIndex > stepIndex) {
+        if (this_.$scope_['selectedSteps'][step] !== false) {
+            switch (step) {
+                case 'vmap_objects':
+                    this.$scope_['displayedStep'] = step;
+                    if (this.$scope_['oVMapObjects'] === null) {
+                        this_.prevStep();
+                    }
+                    break;
+                case 'import_sql':
+                    this.$scope_['displayedStep'] = step;
+                    if (this.$scope_['oSql'] === null) {
+                        this_.prevStep();
+                    }
+                    break;
+                case 'web_services':
+                    this.$scope_['displayedStep'] = step;
+                    if (this.$scope_['aWebServices'] === null) {
+                        this_.prevStep();
+                    }
+                    break;
+                default:
+                    this.$scope_['displayedStep'] = step;
+                    break;
+            }
+        } else {
+            this_.$scope_['displayedStep'] = step;
+            this_.prevStep();
+        }
+    }
+};
+
+/**
+ * Close the import modal
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.closeImportModal = function () {
+    this.$log_.info("nsVmap.importVexCtrl.closeImportModal");
+
+    $('.bootbox.modal').each(function () {
+        $(this).modal('hide');
+    });
+
+    this.mainScope_['setMode']('development');
+};
+
+
+// Utiles
+
+/**
+ * Import the translations in this.oTranslations
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.importTranslations_ = function () {
+
+    var this_ = this;
+
+    var aTranslationsCodes = [];
+
+    // étapes
+    for (var i = 0; i < this.$scope_['steps'].length; i++) {
+        aTranslationsCodes.push('CTRL_IMPORT_VEX_STEP_' + this.$scope_['steps'][i]);
+    }
+
+    // erreurs
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_SELECT_VEX_FILE');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_GET_DATABASES');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_GET_SCHEMAS');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_GET_ROLEGROUPS');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_GET_COORDSYS');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_PRIVATE_CONNECTION_DATABASE_DIFFERENT');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_DATABASE_REQUIRED');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_SCHEMA_REQUIRED');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_COORDSYS_REQUIRED');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_EDIT_NAME_NOT_VALID');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_USER_ROLE_REQUIRED');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_ADMIN_ROLE_REQUIRED');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_EXISTING_VMAP_OBJETS');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_WARNING_SQL');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES');
+    aTranslationsCodes.push('CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL');
+
+    this.$translate_(aTranslationsCodes).then(function (aTranslations) {
+        this_['oTranslations'] = aTranslations;
+    });
+};
+
+/**
+ * Get if a schema is new
+ * @param {string} sSchema
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.isNewSchema_ = function (sSchema) {
+    var bIsNew = this.$scope_['aSchemas'].indexOf(sSchema) === -1;
+    return bIsNew;
+};
+
+
+// Etape Import du fichier
+
+/**
+ * Récupère le contenu du fichier vex sélectionné
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.parseVexFile_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.parseVexFile_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var aFiles = $('#import-vex-file-input').prop('files');
+
+    if (!goog.isDefAndNotNull(aFiles[0])) {
+        $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_SELECT_VEX_FILE'], 'error');
+        return null;
+    }
+
+    // Récupère le contenu au format JSON
+    this.getVexFileContent_(aFiles[0]).then(function (oVexContent) {
+
+        // SQL
+        if (goog.isDefAndNotNull(oVexContent['sql'])) {
+            this_.$scope_['oSql'] = oVexContent['sql'];
+        }
+
+        // Web services
+        if (goog.isDefAndNotNull(oVexContent['web_services'])) {
+            this_.$scope_['aWebServices'] = oVexContent['web_services'];
+        }
+
+        // Objets vMap
+        if (goog.isDefAndNotNull(oVexContent['vmap_objects'])) {
+            this_.$scope_['oVMapObjects'] = oVexContent['vmap_objects'];
+        }
+
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Récupère le contenu du fichier vex passé en paramètre
+ * @param {object} oVexFile
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.getVexFileContent_ = function (oVexFile) {
+    this.$log_.info("nsVmap.importVexCtrl.getVexFileContent_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var oFormData_ = new FormData();
+    oFormData_.append('vex_file', oVexFile);
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/parse_vex',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': oFormData_,
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL'], "error");
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['vex'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL'], "error");
+                return null;
+            }
+            deferred.resolve(response['data']['vex']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+
+// Etape Configuration
+
+/**
+ * Charge aDatabases, aSchemas, aCoordsys et oPrivateConnection
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.loadConfigObjects_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadConfigObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var tmpCounter = 0;
+    var tmpCounterLimit = 3;
+    var displayNextStepOnListsLoaded = function () {
+        tmpCounter++;
+        if (tmpCounter >= tmpCounterLimit) {
+            deferred.resolve();
+        }
+    };
+
+    // Charge la connexion privée
+    this.loadVm4msPrivateConnection_().then(function () {
+
+        // Set la base de données en fonction de la connexion privée
+        if (!goog.isDefAndNotNull(this_.$scope_['oPrivateConnection'])) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION'], "error");
+            return null;
+        }
+        if (!goog.isDefAndNotNull(this_.$scope_['oPrivateConnection']['database'])) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION'], "error");
+            return null;
+        }
+
+        // Charge les bases de données
+        this_.loadDatabases_(this_.$scope_['oPrivateConnection']['database']).then(function () {
+
+            // Vérifie que la base de données soit bien celle de la connexion privée
+            if (goog.isDefAndNotNull(this_.selectedDatabaseWatcher)) {
+                this_.selectedDatabaseWatcher();
+            }
+
+            // Chargement des schémas et coordsys
+            this_.loadSchemas_().then(displayNextStepOnListsLoaded);
+            this_.loadRoleGroups_().then(displayNextStepOnListsLoaded);
+            this_.loadCoordsys_().then(displayNextStepOnListsLoaded);
+
+            // Évènement sur le changement de database
+            this_.selectedDatabaseWatcher = this_.$scope_.$watch('usedDatabase', function (newVal, oldVal) {
+                if (newVal == oldVal) {
+                    return;
+                }
+
+                if (goog.isDefAndNotNull(this_.$scope_['oPrivateConnection'])) {
+                    if (goog.isDefAndNotNull(this_.$scope_['oPrivateConnection']['database'])) {
+                        this_.loadSchemas_();
+                        this_.loadRoleGroups_();
+                        if (this_.$scope_['usedDatabase'] !== this_.$scope_['oPrivateConnection']['database']) {
+                            bootbox.alert('<h4>' + this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_PRIVATE_CONNECTION_DATABASE_DIFFERENT'] + '</h4>');
+                        }
+                    }
+                }
+            });
+        });
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the avaliable databases list
+ * @param {string} sDefaultDatabase
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadDatabases_ = function (sDefaultDatabase) {
+    this.$log_.info("nsVmap.importVexCtrl.loadDatabases_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+    var aUnallowedDatabases = ['postgres'];
+
+    goog.array.clear(this.$scope_['aDatabases']);
+    this.$scope_['usedDatabase'] = null;
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vitis/genericquerys/databases',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_DATABASES'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                console.error("Aucun résultat: databases", response);
+                return null;
+            }
+
+            for (var i = 0; i < response['data']['data'].length; i++) {
+                if (goog.isDefAndNotNull(response['data']['data'][i]['database'])) {
+                    if (aUnallowedDatabases.indexOf(response['data']['data'][i]['database']) === -1) {
+                        this_.$scope_['aDatabases'].push(response['data']['data'][i]['database']);
+                    }
+                }
+            }
+
+            if (this_.$scope_['aDatabases'].indexOf(sDefaultDatabase) !== 1) {
+                this_.$scope_['usedDatabase'] = sDefaultDatabase;
+            } else {
+                bootbox.alert(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_PRIVATE_CONNECTION_DATABASE_DIFFERENT']);
+                this_.$scope_['usedDatabase'] = this_['oProperties']['database'];
+            }
+
+            deferred.resolve();
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_DATABASES'], "error");
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the avaliable schemas list
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadSchemas_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadSchemas_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+    var aUnallowedSchemas = ['pg_catalog', 'information_schema'];
+
+    goog.array.clear(this.$scope_['aSchemas']);
+    this.$scope_['usedSchema'] = null;
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vitis/genericquerys/' + this_.$scope_['usedDatabase'] + '/schemas',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_SCHEMAS'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                console.error("Aucun résultat: schemas", response);
+                return null;
+            }
+
+            for (var i = 0; i < response['data']['data'].length; i++) {
+                if (goog.isDefAndNotNull(response['data']['data'][i]['schema_name'])) {
+                    if (aUnallowedSchemas.indexOf(response['data']['data'][i]['schema_name']) === -1) {
+                        this_.$scope_['aSchemas'].push(response['data']['data'][i]['schema_name']);
+                    }
+                }
+            }
+
+            deferred.resolve();
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_SCHEMAS'], "error");
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the avaliable role groups list
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadRoleGroups_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadRoleGroups_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    goog.array.clear(this.$scope_['aRoleGroups']);
+    this.$scope_['usedSchema'] = null;
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vitis/genericquerys/',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'database': this_.$scope_['usedDatabase'],
+            'schema': 'pg_catalog',
+            'table': 'pg_group'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_ROLEGROUPS'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                console.error("Aucun résultat", response);
+                return null;
+            }
+
+            for (var i = 0; i < response['data']['data'].length; i++) {
+                if (goog.isDefAndNotNull(response['data']['data'][i]['groname'])) {
+                    this_.$scope_['aRoleGroups'].push(response['data']['data'][i]['groname']);
+                }
+            }
+
+            deferred.resolve();
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_ROLEGROUPS'], "error");
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Load the avaliable coordinate systems
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadCoordsys_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadCoordsys_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    goog.array.clear(this.$scope_['aCoordsys']);
+    this.$scope_['usedSRID'] = null;
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vm4ms/coordinatesystems',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'order_by': 'coordsys_id'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_COORDSYS'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                console.error("Aucun résultat: coordinatesystems", response);
+                return null;
+            }
+
+            this_.$scope_['aCoordsys'] = response['data']['data'];
+            this_.$scope_['usedSRID'] = 2154;
+
+            deferred.resolve();
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_COORDSYS'], "error");
+        }
+    });
+
+
+    return deferred.promise;
+};
+
+/**
+ * Load the vm4ms private connection
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadVm4msPrivateConnection_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadVm4msPrivateConnection_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vm4ms/layerconnections',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'filter': '{"column":"private","compare_operator":"=","value":true}'
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'])) {
+                console.error("Aucun résultat: coordinatesystems", response);
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['data'][0])) {
+                console.error("Aucun résultat: coordinatesystems", response);
+                return null;
+            }
+
+            this_.$scope_['oPrivateConnection'] = response['data']['data'][0];
+            if (!goog.isDefAndNotNull(this_.$scope_['oPrivateConnection']['database'])) {
+                this_.$scope_['oPrivateConnection']['database'] = this_['oProperties']['database'];
+            }
+
+            deferred.resolve();
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION'], "error");
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Set scope.usedSchema (called in html view)
+ * @param {boolean} bIsNew
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.setUsedSchema = function (bIsNew) {
+    this.$log_.info("nsVmap.importVexCtrl.setUsedSchema");
+
+    if (bIsNew) {
+        this.$scope_['selectedExistingSchema'] = '';
+        this.$scope_['usedSchema'] = this.$scope_['createdNewSchema'];
+    } else {
+        this.$scope_['createdNewSchema'] = '';
+        this.$scope_['usedSchema'] = this.$scope_['selectedExistingSchema'];
+    }
+};
+
+/**
+ * Return true if the state is valid, otherwise display an error and return false
+ * @returns {Boolean}
+ */
+nsVmap.importVexCtrl.prototype.isConfigStateValid = function () {
+    this.$log_.info("nsVmap.importVexCtrl.isConfigStateValid");
+
+    if (!goog.isDefAndNotNull(this.$scope_['usedDatabase'])) {
+        $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_DATABASE_REQUIRED'], "error");
+        return false;
+    }
+    if (!goog.isDefAndNotNull(this.$scope_['usedSchema'])) {
+        $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_SCHEMA_REQUIRED'], "error");
+        return false;
+    }
+    if (!goog.isDefAndNotNull(this.$scope_['usedSRID'])) {
+        $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_COORDSYS_REQUIRED'], "error");
+        return false;
+    }
+    if (!goog.isDefAndNotNull(this.$scope_['usedUserRole'])) {
+        $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_USER_ROLE_REQUIRED'], "error");
+        return false;
+    }
+    if (!goog.isDefAndNotNull(this.$scope_['usedAdminRole'])) {
+        $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_ADMIN_ROLE_REQUIRED'], "error");
+        return false;
+    }
+    return true;
+};
+
+
+// Étape Objets vMap
+
+/**
+ * Load the vmap_objects step
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.loadVMapObjects_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+    this.oExistingVMapObjects_ = {};
+
+    // Récupère les objets vMap ayant les mêmes noms que ceux définis dans $scope.vmap_objects
+    if (goog.isDefAndNotNull(this.$scope_['oVMapObjects'])) {
+        this.getExistingVMapObjects_().then(function (oExistingVMapObjects) {
+
+            this_.oExistingVMapObjects_ = oExistingVMapObjects;
+
+            // Chage les données sur l'arbre
+            this_.loadVMapObjectsTreeview_();
+            setTimeout(function () {
+                deferred.resolve();
+            });
+        });
+    } else {
+        setTimeout(function () {
+            deferred.reject();
+        });
+    }
+
+    return deferred.promise;
+};
+
+/**
+ * Récupère les objets vMap qui existent déjà (vérification par le nom)
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.getExistingVMapObjects_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.getExistingVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var oVMapObjectsNames = this.getVMapObjectNames_(true);
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/existing_vmap_objects',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': oVMapObjectsNames,
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS'], "error");
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['vmap_objects'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS'], "error");
+                return null;
+            }
+            deferred.resolve(response['data']['vmap_objects']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Get the vMap objets names defined in scope.oVMapObjects
+ * @param {boolean} bAsString trus to return the result on strings delimited by pipes
+ * @returns {Object}
+ */
+nsVmap.importVexCtrl.prototype.getVMapObjectNames_ = function (bAsString) {
+    this.$log_.info("nsVmap.importVexCtrl.getVMapObjectNames_");
+
+    bAsString = goog.isDefAndNotNull(bAsString) ? bAsString : false;
+
+    var this_ = this;
+
+    if (!goog.isDefAndNotNull(this_.$scope_['oVMapObjects'])) {
+        return;
+    }
+
+    /**
+     * get the vMap objects names
+     * @param {string} sObjectKey object key (map, calque ...)
+     * @param {string} sNameField name field (name, business_object_id)
+     * @returns {Array}
+     */
+    var getObjectNamesGeniric = function (sObjectKey, sNameField) {
+        var aNames = [];
+        if (goog.isArray(this_.$scope_['oVMapObjects'][sObjectKey])) {
+            for (var i = 0; i < this_.$scope_['oVMapObjects'][sObjectKey].length; i++) {
+                if (this_.$scope_['oVMapObjects'][sObjectKey][i][sNameField]) {
+                    aNames.push(this_.$scope_['oVMapObjects'][sObjectKey][i][sNameField]);
+                }
+            }
+        }
+        return aNames;
+    };
+
+    var oVMapObjectsNames = {};
+    if (goog.isDefAndNotNull(this.$scope_['oVMapObjects'])) {
+
+        // Cartes
+        var aMapNames = getObjectNamesGeniric('maps', 'name');
+        if (aMapNames.length > 0) {
+            oVMapObjectsNames['maps'] = !bAsString ? aMapNames : aMapNames.join('|');
+        }
+
+        // Services
+        var aServiceNames = getObjectNamesGeniric('services', 'name');
+        if (aServiceNames.length > 0) {
+            oVMapObjectsNames['services'] = !bAsString ? aServiceNames : aServiceNames.join('|');
+        }
+
+        // Calques
+        var aCalqueNames = getObjectNamesGeniric('calques', 'name');
+        if (aCalqueNames.length > 0) {
+            oVMapObjectsNames['calques'] = !bAsString ? aCalqueNames : aCalqueNames.join('|');
+        }
+
+        // Thème des calques
+        var aCalqueThemeNames = getObjectNamesGeniric('calque_themes', 'name');
+        if (aCalqueThemeNames.length > 0) {
+            oVMapObjectsNames['calque_themes'] = !bAsString ? aCalqueThemeNames : aCalqueThemeNames.join('|');
+        }
+
+        // Couches Mapserver
+        var aVm4msLayerNames = getObjectNamesGeniric('vm4ms_layers', 'name');
+        if (aVm4msLayerNames.length > 0) {
+            oVMapObjectsNames['vm4ms_layers'] = !bAsString ? aVm4msLayerNames : aVm4msLayerNames.join('|');
+        }
+
+        // Objets métier
+        var aBONames = getObjectNamesGeniric('business_objects', 'business_object_id');
+        if (aBONames.length > 0) {
+            oVMapObjectsNames['business_objects'] = !bAsString ? aBONames : aBONames.join('|');
+        }
+
+        // Événements
+        var aEventNames = getObjectNamesGeniric('events', 'event_id');
+        if (aEventNames.length > 0) {
+            oVMapObjectsNames['events'] = !bAsString ? aEventNames : aEventNames.join('|');
+        }
+
+        // Rapports
+        var aReportNames = getObjectNamesGeniric('reports', 'name');
+        if (aReportNames.length > 0) {
+            oVMapObjectsNames['reports'] = !bAsString ? aReportNames : aReportNames.join('|');
+        }
+    }
+
+    return oVMapObjectsNames;
+};
+
+/**
+ * Load the treeview to select vMap objects
+ */
+nsVmap.importVexCtrl.prototype.loadVMapObjectsTreeview_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadVMapObjectsTreeview_");
+
+    var this_ = this;
+
+    $('#import-vex-vmap-objects-treeview')['treeview']({
+        'data': this.getTreeviewDataFromVMapObjects_(),
+        'onNodeChecked': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeChecked', oNode);
+        },
+        'onNodeCollapsed': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeCollapsed', oNode);
+        },
+        'onNodeExpanded': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeExpanded', oNode);
+        },
+        'onNodeUnchecked': function (event, oNode) {
+            this_.onVMapObjectsTreeviewUpdate_('nodeUnchecked', oNode);
+        },
+        'expandIcon': '',
+        'collapseIcon': '',
+        'showBorder': false,
+        'showCheckbox': false
+    });
+};
+
+/**
+ * Get the treeview format node for vMap Objects
+ * @returns {array}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewDataFromVMapObjects_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewDataFromVMapObjects_");
+
+    var aData = [];
+
+    if (goog.isDefAndNotNull(this.$scope_['oVMapObjects'])) {
+
+        // maps
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['maps'])) {
+            aData.push(this.getTreeviewMaps_(this.$scope_['oVMapObjects']['maps']));
+        }
+
+        // services
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['services'])) {
+            aData.push(this.getTreeviewServices_(this.$scope_['oVMapObjects']['services']));
+        }
+
+        // calques
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['calques'])) {
+            aData.push(this.getTreeviewCalques_(this.$scope_['oVMapObjects']['calques']));
+        }
+
+        // calque_themes
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['calque_themes'])) {
+            aData.push(this.getTreeviewCalqueThemes_(this.$scope_['oVMapObjects']['calque_themes']));
+        }
+
+        // vm4ms_layers
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['vm4ms_layers'])) {
+            aData.push(this.getTreeviewVm4msLayers_(this.$scope_['oVMapObjects']['vm4ms_layers']));
+        }
+
+        // business_objects
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['business_objects'])) {
+            aData.push(this.getTreeviewBOs_(this.$scope_['oVMapObjects']['business_objects']));
+        }
+
+        // events
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['events'])) {
+            aData.push(this.getTreeviewEvents_(this.$scope_['oVMapObjects']['events']));
+        }
+
+        // reports
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['reports'])) {
+            aData.push(this.getTreeviewReports_(this.$scope_['oVMapObjects']['reports']));
+        }
+    }
+
+    return aData;
+};
+
+/**
+ * Get the treeview format node for maps
+ * @param {array} aMaps
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewMaps_ = function (aMaps) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewMaps_");
+
+    var oNode = {
+        'text': 'Cartes',
+        'icon': 'icon-map',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aMaps)) {
+        for (var i = 0; i < aMaps.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('maps', 'name', aMaps[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Carte: ' + aMaps[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-map',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'map',
+                'properties_': aMaps[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for services
+ * @param {array} aServices
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewServices_ = function (aServices) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewServices_");
+
+    var oNode = {
+        'text': 'Services',
+        'icon': 'icon-link-external',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aServices)) {
+        for (var i = 0; i < aServices.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('services', 'name', aServices[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Service: ' + aServices[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-link-external',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'service',
+                'properties_': aServices[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for calques
+ * @param {array} aCalques
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewCalques_ = function (aCalques) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewCalques_");
+
+    var oNode = {
+        'text': 'Calques',
+        'icon': 'icon-layers',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aCalques)) {
+        for (var i = 0; i < aCalques.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('calques', 'name', aCalques[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Calque: ' + aCalques[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-layers',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'calque',
+                'properties_': aCalques[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for calque themes
+ * @param {array} aCalqueThemes
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewCalqueThemes_ = function (aCalqueThemes) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewCalqueThemes_");
+
+    var oNode = {
+        'text': 'Thèmes des calques',
+        'icon': 'icon-layers',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aCalqueThemes)) {
+        for (var i = 0; i < aCalqueThemes.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('calque_themes', 'name', aCalqueThemes[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Thème : ' + aCalqueThemes[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-layers',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'calque_theme',
+                'properties_': aCalqueThemes[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for vm4ms_layers
+ * @param {array} aVm4msLayers
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewVm4msLayers_ = function (aVm4msLayers) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewVm4msLayers_");
+
+    var oNode = {
+        'text': 'Couches Mapserver',
+        'icon': 'icon-layers2',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aVm4msLayers)) {
+        for (var i = 0; i < aVm4msLayers.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('vm4ms_layers', 'name', aVm4msLayers[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Couche Mapserver: ' + aVm4msLayers[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-layers2',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'vm4ms_layer',
+                'properties_': aVm4msLayers[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for business_objects
+ * @param {array} aBOs
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewBOs_ = function (aBOs) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewBOs_");
+
+    var oNode = {
+        'text': 'Objets métiers',
+        'icon': 'icon-vmap_business_object',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aBOs)) {
+        for (var i = 0; i < aBOs.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('business_objects', 'business_object_id', aBOs[i]['business_object_id']);
+            oNode['nodes'].push({
+                'text': 'Objet métier: ' + aBOs[i]['business_object_id'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-vmap_business_object',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'business_object',
+                'properties_': aBOs[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for events
+ * @param {array} aEvents
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewEvents_ = function (aEvents) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewEvents_");
+
+    var oNode = {
+        'text': 'Evènements',
+        'icon': 'icon-vmap_business_object',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aEvents)) {
+        for (var i = 0; i < aEvents.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('events', 'event_id', aEvents[i]['event_id']);
+            oNode['nodes'].push({
+                'text': 'Evènement: ' + aEvents[i]['event_id'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-vmap_business_object',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'event',
+                'properties_': aEvents[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Get the treeview format node for reports
+ * @param {array} aReports
+ * @returns {object}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewReports_ = function (aReports) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewReports_");
+
+    var oNode = {
+        'text': 'Rapports',
+        'icon': 'icon-vmap_business_object',
+        'selectable': false,
+        'state': {
+            'checked': true,
+            'expanded': true
+        },
+        'nodes': []
+    };
+
+    var isExistingObject;
+    if (goog.isArray(aReports)) {
+        for (var i = 0; i < aReports.length; i++) {
+            isExistingObject = this.isVMapObjectAlreadyPresent('reports', 'name', aReports[i]['name']);
+            oNode['nodes'].push({
+                'text': 'Rapport: ' + aReports[i]['name'] + (isExistingObject ? ' (Déjà présent sur l\'application) <span class="icon-draw"></span>' : ''),
+                'color': isExistingObject ? "#337ab7" : "#333",
+                'icon': 'icon-vmap_business_object',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'type_': 'report',
+                'properties_': aReports[i],
+                'isExisting_': isExistingObject,
+                'nodes': []
+            });
+        }
+    }
+
+    return oNode;
+};
+
+/**
+ * Return true if the object already exists
+ * @param {string} sObjectKey object key (map, calque ...)
+ * @param {string} sNameField name field (name, business_object_id)
+ * @param {string} sTestName the name to test with
+ * @returns {Boolean}
+ */
+nsVmap.importVexCtrl.prototype.isVMapObjectAlreadyPresent = function (sObjectKey, sNameField, sTestName) {
+    this.$log_.info("nsVmap.importVexCtrl.isVMapObjectAlreadyPresent");
+
+    var isExisting = false;
+
+    if (goog.isDefAndNotNull(this.oExistingVMapObjects_)) {
+        if (goog.isArray(this.oExistingVMapObjects_[sObjectKey])) {
+            for (var i = 0; i < this.oExistingVMapObjects_[sObjectKey].length; i++) {
+                if (goog.isDefAndNotNull(this.oExistingVMapObjects_[sObjectKey][i][sNameField])) {
+                    if (this.oExistingVMapObjects_[sObjectKey][i][sNameField] === sTestName) {
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+
+    return isExisting;
+};
+
+/**
+ * Function called when a node state is updated
+ * @param {string} sEvent
+ * @param {object} oNode
+ */
+nsVmap.importVexCtrl.prototype.onVMapObjectsTreeviewUpdate_ = function (sEvent, oNode) {
+    this.$log_.info("nsVmap.importVexCtrl.onVMapObjectsTreeviewUpdate_");
+
+    // Empèche le collapse et la sélection
+    if (sEvent === 'nodeCollapsed') {
+        $('#import-vex-vmap-objects-treeview').data('treeview')['expandNode'](oNode['nodeId'], {'silent': true});
+    }
+    if (sEvent === 'nodeUnchecked') {
+        $('#import-vex-vmap-objects-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+    }
+
+    if (sEvent === 'nodeCollapsed' || sEvent === 'nodeExpanded') {
+        if (goog.isDefAndNotNull(oNode['type_']) && goog.isDefAndNotNull(oNode['properties_'])) {
+            if (this.lastParentCollapseTimeout_ + 500 < Date.now()) {
+                this.editVMapObject_(oNode['properties_'], oNode['type_']);
+            }
+        } else {
+            this.lastParentCollapseTimeout_ = Date.now();
+        }
+    }
+};
+
+/**
+ * Edit the vMap object name in a modal
+ * @param {object} oObject treeview node
+ * @param {string} sType
+ */
+nsVmap.importVexCtrl.prototype.editVMapObject_ = function (oObject, sType) {
+    this.$log_.info("nsVmap.importVexCtrl.editVMapObject_");
+
+    var this_ = this;
+
+    var sValue;
+    switch (sType) {
+        case 'map':
+        case 'service':
+        case 'calque':
+        case 'calque_theme':
+        case 'vm4ms_layer':
+        case 'report':
+            sValue = oObject['name'];
+            break;
+        case 'business_object':
+            sValue = oObject['business_object_id'];
+            break;
+        case 'event':
+            sValue = oObject['event_id'];
+            break;
+        default:
+            break;
+    }
+
+    bootbox['prompt']({
+        'title': 'Modifier le nom',
+        'inputType': 'text',
+        'value': sValue,
+        'callback': function (result) {
+            if (goog.isDefAndNotNull(result)) {
+                this_.changeVMapObjectName_(oObject, sType, result);
+            }
+        }
+    });
+};
+
+/**
+ * Permet d'éditer génériquement le nom d'un objet vMap ayant un identificant numérique
+ * @param {object} oObject
+ * @param {string} sType
+ * @param {string} sNewName
+ */
+nsVmap.importVexCtrl.prototype.changeVMapObjectName_ = function (oObject, sType, sNewName) {
+    this.$log_.info("nsVmap.importVexCtrl.changeVMapObjectName_");
+
+    var this_ = this;
+    var sIdField, sNameField, sVMapObjectsKey, sPattern, bEdited = false;
+    switch (sType) {
+        case 'map':
+            sIdField = 'map_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'maps';
+            break;
+        case 'service':
+            sIdField = 'service_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'services';
+            break;
+        case 'calque':
+            sIdField = 'layer_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'calques';
+            break;
+        case 'calque_theme':
+            sIdField = 'layertheme_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'calque_themes';
+            break;
+        case 'vm4ms_layer':
+            sIdField = 'ms_layer_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'vm4ms_layers';
+            sPattern = "^[A-Za-z0-9_]{1,32}$";
+            break;
+        case 'business_object':
+            sIdField = 'business_object_id';
+            sNameField = 'business_object_id';
+            sVMapObjectsKey = 'business_objects';
+            sPattern = "^[A-Za-z0-9_]{1,32}$";
+            break;
+        case 'report':
+            sIdField = 'printreport_id';
+            sNameField = 'name';
+            sVMapObjectsKey = 'reports';
+            break;
+        case 'event':
+            sIdField = 'event_id';
+            sNameField = 'event_id';
+            sVMapObjectsKey = 'events';
+            sPattern = "^[A-Za-z0-9_]{1,32}$";
+            break;
+        default:
+            break;
+    }
+
+    // Regexp
+    if (goog.isDefAndNotNull(sPattern)) {
+        if (RegExp(sPattern).test(sNewName) !== true) {
+            $.notify(this['oTranslations']['CTRL_IMPORT_VEX_ERROR_EDIT_NAME_NOT_VALID'], "error");
+            return false;
+        }
+    }
+
+    // Met à jour le nom
+    if (goog.isDefAndNotNull(sIdField) &&
+            goog.isDefAndNotNull(sNameField) &&
+            goog.isDefAndNotNull(sVMapObjectsKey)) {
+
+        if (goog.isDefAndNotNull(oObject[sIdField]) &&
+                goog.isDefAndNotNull(this.$scope_['oVMapObjects'][sVMapObjectsKey])) {
+
+            for (var i = 0; i < this.$scope_['oVMapObjects'][sVMapObjectsKey].length; i++) {
+                if (this.$scope_['oVMapObjects'][sVMapObjectsKey][i][sIdField] === oObject[sIdField]) {
+                    this.$scope_['oVMapObjects'][sVMapObjectsKey][i][sNameField] = sNewName;
+                    bEdited = true;
+                }
+            }
+        }
+
+    }
+
+    // Change le nom dans les dépendances
+    if (bEdited) {
+        if (sType === 'business_object') {
+            // Calques
+            this.changeVMapObjectNameInDependencies_('calques', 'bo_id_list', oObject[sNameField], sNewName);
+            // Rapports
+            this.changeVMapObjectNameInDependencies_('reports', 'business_object_id', oObject[sNameField], sNewName);
+            // Formulaires objet métier
+            this.changeBONameFormDependencies(oObject[sNameField], sNewName);
+        }
+        if (sType === 'event') {
+            // Objets métiers
+            this.changeVMapObjectNameInDependencies_('business_objects', 'event_id', oObject[sNameField], sNewName);
+        }
+        if (sType === 'vm4ms_layer') {
+            // Calques
+            this.changeVMapObjectNameInDependencies_('calques', 'layer_list', oObject[sNameField], sNewName);
+        }
+    }
+
+    setTimeout(function () {
+        this_.loadVMapObjects_();
+    });
+};
+
+/**
+ * Édite le nom d'un objet dans les dépendances
+ * @param {string} sVMapObjectsDepKey
+ * @param {string} sDepNameField
+ * @param {object} oldName
+ * @param {string} sNewName
+ */
+nsVmap.importVexCtrl.prototype.changeVMapObjectNameInDependencies_ = function (sVMapObjectsDepKey, sDepNameField, oldName, sNewName) {
+    this.$log_.info("nsVmap.importVexCtrl.changeVMapObjectNameInDependencies_");
+
+    var oRegex = new RegExp("\\b" + oldName + "\\b");
+    if (goog.isDefAndNotNull(this.$scope_['oVMapObjects'][sVMapObjectsDepKey])) {
+        for (var i = 0; i < this.$scope_['oVMapObjects'][sVMapObjectsDepKey].length; i++) {
+            if (goog.isString(this.$scope_['oVMapObjects'][sVMapObjectsDepKey][i][sDepNameField])) {
+                if (oRegex.test(this.$scope_['oVMapObjects'][sVMapObjectsDepKey][i][sDepNameField])) {
+                    this.$scope_['oVMapObjects'][sVMapObjectsDepKey][i][sDepNameField] = this.$scope_['oVMapObjects'][sVMapObjectsDepKey][i][sDepNameField].replace(oRegex, sNewName);
+                }
+            }
+        }
+    }
+};
+
+/**
+ * Change le nom des clés permettant de lier un objet métier à ses formulaires
+ * @param {string} oldName
+ * @param {string} newName
+ */
+nsVmap.importVexCtrl.prototype.changeBONameFormDependencies = function (oldName, newName) {
+    this.$log_.info("nsVmap.importVexCtrl.changeBONameFormDependencies");
+
+    if (goog.isDefAndNotNull(this.$scope_['oVMapObjects'])) {
+        if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['business_objects_forms'])) {
+            if (goog.isDefAndNotNull(this.$scope_['oVMapObjects']['business_objects_forms'][oldName])) {
+                this.$scope_['oVMapObjects']['business_objects_forms'][newName] = this.$scope_['oVMapObjects']['business_objects_forms'][oldName];
+                delete this.$scope_['oVMapObjects']['business_objects_forms'][oldName];
+            }
+        }
+    }
+};
+
+
+// Etape SQL
+
+/**
+ * Load the SQL step
+ */
+nsVmap.importVexCtrl.prototype.loadSql_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadSql_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // Init codemirror
+    this.$scope_['codemirrorSQLModelOptions'] = {
+        'mode': 'sql'
+    };
+    this.$scope_['codemirrorSQLDataOptions'] = {
+//        'mode': 'sql'
+    };
+
+    this.$scope_['sSQLModel'] = '';
+    this.$scope_['sSQLData'] = '';
+
+    if (goog.isDefAndNotNull(this.$scope_['oSql'])) {
+        if (goog.isDefAndNotNull(this.$scope_['oSql']['export_model_sql'])) {
+
+            // Schéma
+            if (this.isNewSchema_(this.$scope_['usedSchema'])) {
+                if (this.$scope_['usedSchema'].length > 0) {
+                    this.$scope_['sSQLModel'] += '\n--';
+                    this.$scope_['sSQLModel'] += '\n-- GENERATED BY VMAP';
+                    this.$scope_['sSQLModel'] += '\n-- Creation Schema';
+                    this.$scope_['sSQLModel'] += '\n--';
+                    this.$scope_['sSQLModel'] += '\n';
+                    this.$scope_['sSQLModel'] += '\nCREATE SCHEMA [SCHEMA_NAME] AUTHORIZATION u_vitis;';
+                    this.$scope_['sSQLModel'] += '\nGRANT ALL ON SCHEMA [SCHEMA_NAME] TO u_vitis;';
+                    this.$scope_['sSQLModel'] += '\n';
+                    this.$scope_['sSQLModel'] += '\n';
+                }
+            }
+
+            this.$scope_['sSQLModel'] = this.getReplacedSQL_(this.$scope_['sSQLModel'] += this.$scope_['oSql']['export_model_sql']);
+        }
+        if (goog.isDefAndNotNull(this.$scope_['oSql']['export_data_sql'])) {
+            this.$scope_['sSQLData'] = this.getReplacedSQL_(this.$scope_['sSQLData'] += this.$scope_['oSql']['export_data_sql']);
+        }
+    } else {
+        setTimeout(function () {
+            deferred.reject();
+        });
+    }
+
+    this.$scope_['refreshCodeMirror']();
+
+    setTimeout(function () {
+        deferred.resolve();
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Make the SQL replacements et return the result
+ * @param {string} sSQL
+ * @returns {string}
+ */
+nsVmap.importVexCtrl.prototype.getReplacedSQL_ = function (sSQL) {
+    this.$log_.info("nsVmap.importVexCtrl.getReplacedSQL_");
+
+    if (goog.isDefAndNotNull(this.$scope_['usedDatabase'])) {
+        sSQL = sSQL.replace(/\[DATABASE_NAME\]/g, this.$scope_['usedDatabase']);
+    }
+    if (goog.isDefAndNotNull(this.$scope_['usedSchema'])) {
+        sSQL = sSQL.replace(/\[SCHEMA_NAME\]/g, this.$scope_['usedSchema']);
+    }
+    if (goog.isDefAndNotNull(this.$scope_['usedSRID'])) {
+        sSQL = sSQL.replace(/\[SRID\]/g, this.$scope_['usedSRID']);
+    }
+    if (goog.isDefAndNotNull(this.$scope_['usedUserRole'])) {
+        sSQL = sSQL.replace(/\[ROLE_USER\]/g, this.$scope_['usedUserRole']);
+    }
+    if (goog.isDefAndNotNull(this.$scope_['usedAdminRole'])) {
+        sSQL = sSQL.replace(/\[ROLE_ADMIN\]/g, this.$scope_['usedAdminRole']);
+    }
+
+    return sSQL;
+};
+
+// Étape services WEB
+
+/**
+ * Load the avaliable web services list
+ * @returns {defer.promise}
+ * @private
+ */
+nsVmap.importVexCtrl.prototype.loadWebServices_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // Récupère les objets vMap ayant les mêmes noms que ceux définis dans $scope.vmap_objects
+    if (goog.isDefAndNotNull(this.$scope_['aWebServices'])) {
+        this.getExistingWebServices_().then(function (aExistingWebServices) {
+
+            this_.aExistingWebServices_ = aExistingWebServices;
+
+            // Charge les données sur l'arbre
+            this_.loadWebServicesTreeview_();
+            setTimeout(function () {
+                deferred.resolve();
+            });
+        });
+    } else {
+        setTimeout(function () {
+            deferred.reject();
+        });
+    }
+
+    return deferred.promise;
+};
+
+/**
+ * Récupère les objets vMap qui existent déjà (vérification par le nom)
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.getExistingWebServices_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.getExistingWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    var sWebServiceNames = this.getWebServicesNames_(true);
+
+    ajaxRequest({
+        'method': 'GET',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/existing_web_services',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'params': {
+            'web_services': sWebServiceNames
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES'], "error");
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES'], "error");
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['web_services'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES'], "error");
+                return null;
+            }
+            deferred.resolve(response['data']['web_services']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Get the web services names defined in scope.aWebServices
+ * @param {boolean} bAsString trus to return the result on strings delimited by pipes
+ * @returns {Object}
+ */
+nsVmap.importVexCtrl.prototype.getWebServicesNames_ = function (bAsString) {
+    this.$log_.info("nsVmap.importVexCtrl.getWebServicesNames_");
+
+    bAsString = goog.isDefAndNotNull(bAsString) ? bAsString : false;
+
+    if (!goog.isDefAndNotNull(this.$scope_['aWebServices'])) {
+        return;
+    }
+
+    var aWebServiceNames = [];
+
+    for (var i = 0; i < this.$scope_['aWebServices'].length; i++) {
+        if (goog.isDefAndNotNull(this.$scope_['aWebServices'][i]['name'])) {
+            aWebServiceNames.push(this.$scope_['aWebServices'][i]['name']);
+        }
+    }
+
+    return bAsString ? aWebServiceNames.join('|') : aWebServiceNames;
+};
+
+/**
+ * Load the treeview to select web services
+ */
+nsVmap.importVexCtrl.prototype.loadWebServicesTreeview_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.loadWebServicesTreeview_");
+
+    var this_ = this;
+
+    $('#import-vex-web-services-treeview')['treeview']({
+        'data': this.getTreeviewDataFromWebServices_(),
+        'onNodeChecked': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeChecked', oNode);
+        },
+        'onNodeCollapsed': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeCollapsed', oNode);
+        },
+        'onNodeExpanded': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeExpanded', oNode);
+        },
+        'onNodeUnchecked': function (event, oNode) {
+            this_.onWebServicesTreeviewUpdate_('nodeUnchecked', oNode);
+        },
+        'expandIcon': '',
+        'collapseIcon': '',
+        'showBorder': false,
+        'showCheckbox': true
+    });
+};
+
+/**
+ * Get the treeview formed objects from scope.aWebServices
+ * @returns {Array}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewDataFromWebServices_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewDataFromWebServices_");
+
+    var aData = [];
+    var oWebService, isExistingWebService;
+
+    if (goog.isArray(this.$scope_['aWebServices'])) {
+        for (var i = 0; i < this.$scope_['aWebServices'].length; i++) {
+            isExistingWebService = this.isWebServiceAlreadyPresent(this.$scope_['aWebServices'][i]['name']);
+            oWebService = {
+                'text': this.$scope_['aWebServices'][i]['name'] + (isExistingWebService ? ' (Déjà présent sur l\'application)' : ''),
+                'color': isExistingWebService ? "#ff0700" : "#333",
+                'icon': 'glyphicon glyphicon-folder-open',
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'properties_': {
+                    'type': 'folder',
+                    'name': this.$scope_['aWebServices'][i]['name']
+                },
+                'isExisting_': isExistingWebService,
+                'nodes': this.getTreeviewFilesFromWebService_(this.$scope_['aWebServices'][i])
+            };
+
+            aData.push(oWebService);
+        }
+    } else {
+        console.error('aWebServices undefined');
+    }
+
+    return aData;
+};
+
+/**
+ * Return true if the web service already exists
+ * @param {string} sWebService web service name
+ * @returns {Boolean}
+ */
+nsVmap.importVexCtrl.prototype.isWebServiceAlreadyPresent = function (sWebService) {
+    var bIsPresent = false;
+
+    if (goog.isDefAndNotNull(this.aExistingWebServices_)) {
+        if (this.aExistingWebServices_.indexOf(sWebService) !== -1) {
+            return true;
+        }
+    }
+
+    return bIsPresent;
+};
+
+/**
+ * Get the treeview formed files from the given web service
+ * @param {object} oWebService
+ * @returns {Array}
+ */
+nsVmap.importVexCtrl.prototype.getTreeviewFilesFromWebService_ = function (oWebService) {
+    this.$log_.info("nsVmap.importVexCtrl.getTreeviewFilesFromWebService_");
+
+    var aFiles = [];
+    var oFile;
+    if (goog.isArray(oWebService['files'])) {
+        for (var key in oWebService['files']) {
+            oFile = {
+                'text': key,
+                'selectable': false,
+                'state': {
+                    'checked': true,
+                    'expanded': true
+                },
+                'properties_': {
+                    'type': 'file'
+                }
+            };
+            aFiles.push(oFile);
+        }
+    }
+
+    return aFiles;
+};
+
+/**
+ * Function called when a node state is updated
+ * @param {string} sEvent
+ * @param {object} oNode
+ */
+nsVmap.importVexCtrl.prototype.onWebServicesTreeviewUpdate_ = function (sEvent, oNode) {
+    this.$log_.info("nsVmap.importVexCtrl.onWebServicesTreeviewUpdate_");
+
+    // Empèche le collapse et la sélection
+    if (sEvent === 'nodeCollapsed') {
+        $('#import-vex-web-services-treeview').data('treeview')['expandNode'](oNode['nodeId'], {'silent': true});
+    }
+    if (sEvent === 'nodeUnchecked') {
+        $('#import-vex-web-services-treeview').data('treeview')['checkNode'](oNode['nodeId'], {'silent': true});
+    }
+};
+
+
+// Etape export
+
+/**
+ * Execute the import
+ * @export
+ */
+nsVmap.importVexCtrl.prototype.executeImport = function () {
+    this.$log_.info("nsVmap.importVexCtrl.executeImport");
+
+    var this_ = this;
+
+    this_.$scope_['bImportDone'] = false;
+    this_.$scope_['oImportSteps']['vmap_objects'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_maps'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_services'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_calques'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_calque_themes'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_vm4ms_layers'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_business_objects'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_events'] = null;
+    this_.$scope_['oImportSteps']['vmap_objects_reports'] = null;
+    this_.$scope_['oImportSteps']['web_services'] = null;
+    this_.$scope_['oImportSteps']['sql'] = null;
+    this_.$scope_['oImportSteps']['sql_model'] = null;
+    this_.$scope_['oImportSteps']['sql_data'] = null;
+
+    // Importe les objets vMap
+    this.importVMapObjects_().then(function (oImportedVmapObjects) {
+
+        if (goog.isDefAndNotNull(oImportedVmapObjects)) {
+            this_.oImportedVmapObjects_ = oImportedVmapObjects;
+        }
+
+        this_.$scope_['oImportSteps']['vmap_objects'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_maps'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_services'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_calques'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_calque_themes'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_vm4ms_layers'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_business_objects'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_events'] = true;
+        this_.$scope_['oImportSteps']['vmap_objects_reports'] = true;
+
+        this_.importWebServices_().then(function (oImportedWebServices) {
+
+            if (goog.isDefAndNotNull(oImportedWebServices)) {
+                this_.oImportedWebServices_ = oImportedWebServices;
+            }
+
+            this_.$scope_['oImportSteps']['web_services'] = true;
+
+            this_.importSQL_().then(function (oImportedSql) {
+
+                if (goog.isDefAndNotNull(oImportedSql)) {
+                    this_.oImportedSql_ = oImportedSql;
+                }
+
+                if (oImportedSql === true) {
+                    this_.$scope_['oImportSteps']['sql'] = true;
+                    this_.$scope_['oImportSteps']['sql_model'] = true;
+                    this_.$scope_['oImportSteps']['sql_data'] = true;
+                }
+
+                this_.$scope_['bImportDone'] = true;
+            }, function () {
+                this_.$scope_['oImportSteps']['sql'] = false;
+                this_.$scope_['oImportSteps']['sql_model'] = false;
+                this_.$scope_['oImportSteps']['sql_data'] = false;
+            });
+        }, function () {
+            this_.$scope_['oImportSteps']['web_services'] = false;
+        });
+    }, function () {
+        this_.$scope_['oImportSteps']['vmap_objects'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_maps'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_services'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_calques'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_calque_themes'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_vm4ms_layers'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_business_objects'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_events'] = false;
+        this_.$scope_['oImportSteps']['vmap_objects_reports'] = false;
+    });
+};
+
+/**
+ * Import the vMap objects
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.importVMapObjects_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.importVMapObjects_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // cas où scope.oVMapObjects soit null
+    if (!goog.isDefAndNotNull(this.$scope_['oVMapObjects']) || this_.$scope_['selectedSteps']['vmap_objects'] === false) {
+        setTimeout(function () {
+            deferred.resolve();
+        });
+        return deferred.promise;
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/import/vmap_objects',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'vmap_objects': JSON.stringify(this.$scope_['oVMapObjects']),
+            'database': this.$scope_['usedDatabase'],
+            'schema': this.$scope_['usedSchema'],
+            'srid': this.$scope_['usedSRID']
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['vmap_objects'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS'], "error");
+                deferred.reject();
+                return null;
+            }
+            deferred.resolve(response['data']['vmap_objects']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Import the web services
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.importWebServices_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.importWebServices_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // cas où scope.aWebServices soit null
+    if (!goog.isDefAndNotNull(this.$scope_['aWebServices']) || this_.$scope_['selectedSteps']['web_services'] === false) {
+        setTimeout(function () {
+            deferred.resolve();
+        });
+        return deferred.promise;
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/import/web_services',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'web_services': JSON.stringify(this.$scope_['aWebServices'])
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['web_services'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES'], "error");
+                deferred.reject();
+                return null;
+            }
+            deferred.resolve(response['data']['web_services']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Import the SQL
+ * @returns {defer.promise}
+ */
+nsVmap.importVexCtrl.prototype.importSQL_ = function () {
+    this.$log_.info("nsVmap.importVexCtrl.importSQL_");
+
+    var this_ = this;
+    var deferred = this.$q_.defer();
+
+    // cas où scope.aWebServices soit null
+    if (!goog.isDefAndNotNull(this.$scope_['sSQLModel']) || this_.$scope_['selectedSteps']['import_sql'] === false) {
+        setTimeout(function () {
+            deferred.resolve();
+        });
+        return deferred.promise;
+    }
+
+    ajaxRequest({
+        'method': 'POST',
+        'url': this['oProperties']['web_server_name'] + '/' + this['oProperties']['services_alias'] + '/vmap/vex/import/sql',
+        'headers': {
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'sql_model': this.$scope_['sSQLModel'],
+            'sql_data': this.$scope_['sSQLData'],
+            'database': this.$scope_['usedDatabase'],
+            'schema': this.$scope_['usedSchema'],
+            'srid': this.$scope_['usedSRID']
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+            if (!goog.isDefAndNotNull(response['data'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (goog.isDefAndNotNull(response['data'])) {
+                if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                    angular.element(vitisApp.appMainDrtv).scope()["modalWindow"]("dialog", "Erreur serveur", {
+                        "className": "modal-danger",
+                        "message": response['data']['errorMessage']
+                    });
+                    deferred.reject();
+                    return null;
+                }
+            }
+            if (response['data']['status'] !== 1) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL'], "error");
+                deferred.reject();
+                return null;
+            }
+            if (!goog.isDefAndNotNull(response['data']['sql'])) {
+                $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL'], "error");
+                deferred.reject();
+                return null;
+            }
+            deferred.resolve(response['data']['sql']);
+        },
+        'error': function (response) {
+            $.notify(this_['oTranslations']['CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL'], "error");
+            deferred.reject();
+        }
+    });
+
+    return deferred.promise;
+};
+
+
+// Definition du controlleur angular
+oVmap.module.controller('AppImportVexController', nsVmap.importVexCtrl);
diff --git a/module/javascript/vitis/directives/documentationHelpDrtv.js b/module/javascript/vitis/directives/documentationHelpDrtv.js
new file mode 100755
index 0000000000000000000000000000000000000000..f5f6cefa63d649744484dd0a0bf7b495ddb702df
--- /dev/null
+++ b/module/javascript/vitis/directives/documentationHelpDrtv.js
@@ -0,0 +1,23 @@
+// Google closure
+goog.provide("vitis.directives.documentationHelp");
+goog.require("vitis.modules.main");
+
+/**
+ * appDocumentationHelp directive.
+ * Association du contrôleur à la directive.
+ * @export
+ **/
+vitisApp.appDocumentationHelpDrtv = function() {
+        return {
+                restrict: 'A',
+                controller : 'documentationHelpCtrl',
+                controllerAs : 'ctrl',
+                link: function (scope, element, attrs) {
+//                        // Affiche le loader ajax.
+//                        showAjaxLoader();
+//                        // Cache le loader ajax à la fin du chargement.
+//                        element[0].onload = hideAjaxLoader;
+                }
+        }
+};
+vitisApp.module.directive("appDocumentationHelp", vitisApp.appDocumentationHelpDrtv);
diff --git a/module/javascript/vitis/directives/exportVexDrtv.js b/module/javascript/vitis/directives/exportVexDrtv.js
new file mode 100755
index 0000000000000000000000000000000000000000..3a2daa59c3fae17c7b6ec272d0bbfe564b839b50
--- /dev/null
+++ b/module/javascript/vitis/directives/exportVexDrtv.js
@@ -0,0 +1,25 @@
+/* global goog, nsVmap, oVmap */
+
+
+goog.provide('nsVmap.exportVexDrtv');
+goog.require('oVmap');
+
+/**
+ * Export vex directive
+ * @export
+ * @ngInject
+ */
+nsVmap.exportVexDrtv = function () {
+    return {
+        restrict: 'A',
+        controller: 'AppExportVexController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: window['oClientProperties']['vmap_folder'] + '/' + 'template/vitis/exportVex.html',
+        link: function (scope, element, attrs, controller) {
+
+
+        }
+    };
+};
+oVmap.module.directive('appExportVex', nsVmap.exportVexDrtv);
\ No newline at end of file
diff --git a/module/javascript/vitis/directives/importVexDrtv.js b/module/javascript/vitis/directives/importVexDrtv.js
new file mode 100755
index 0000000000000000000000000000000000000000..7709f2bbec6c64e3fdb05d5ea1fc5e341da688b9
--- /dev/null
+++ b/module/javascript/vitis/directives/importVexDrtv.js
@@ -0,0 +1,35 @@
+/* global goog, nsVmap, oVmap */
+
+
+goog.provide('nsVmap.importVexDrtv');
+goog.require('oVmap');
+
+/**
+ * Import vex directive
+ * @export
+ * @ngInject
+ */
+nsVmap.importVexDrtv = function () {
+    return {
+        restrict: 'A',
+        controller: 'AppImportVexController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: window['oClientProperties']['vmap_folder'] + '/' + 'template/vitis/importVex.html',
+        link: function (scope, element, attrs, controller) {
+
+            // File input
+            $(element).find('.file')['fileinput']({'showUpload': false, 'showPreview': false, 'mainClass': 'input-group-sm'});
+
+            // Codemirror
+            scope['refreshCodeMirror'] = function () {
+                setTimeout(function () {
+                    $(element).find('.CodeMirror').each(function (i, el) {
+                        el['CodeMirror']['refresh']();
+                    });
+                }, 1000);
+            };
+        }
+    };
+};
+oVmap.module.directive('appImportVex', nsVmap.importVexDrtv);
diff --git a/module/javascript/vitis/script_module.js b/module/javascript/vitis/script_module.js
new file mode 100644
index 0000000000000000000000000000000000000000..00d7bea38f0f130a3f1f55460702749cb216fc1f
--- /dev/null
+++ b/module/javascript/vitis/script_module.js
@@ -0,0 +1,3610 @@
+/* global oVFB, vitisApp, goog, ol */
+
+'use strict';
+
+goog.provide('vmap.script_module');
+goog.require('vmap');
+goog.require('ol.proj');
+goog.require('ol.source.WMTS');
+goog.require('ol.format.WMTSCapabilities');
+goog.require('nsVmap.importVexDrtv');
+goog.require('nsVmap.importVexCtrl');
+goog.require('nsVmap.exportVexDrtv');
+goog.require('nsVmap.exportVexCtrl');
+goog.require('vitis.controllers.documentationHelp');
+goog.require('vitis.directives.documentationHelp');
+goog.require('goog.array');
+
+vitisApp.on('appMainDrtvLoaded', function () {
+    var $q = angular.element(vitisApp.appMainDrtv).injector().get(['$q']);
+    var $log = angular.element(vitisApp.appMainDrtv).injector().get(['$log']);
+    var $timeout = angular.element(vitisApp.appMainDrtv).injector().get(['$timeout']);
+    var $translate = angular.element(vitisApp.appMainDrtv).injector().get(['$translate']);
+    var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['envSrvc']);
+    var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['formSrvc']);
+    var modesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['modesSrvc']);
+    var sessionSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['sessionSrvc']);
+    var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['propertiesSrvc']);
+
+    // Rafraichit le flux WMS privé si besoin
+    var oFormData = new FormData();
+    oFormData.append("wmsservice_id", propertiesSrvc['private_wms_service']);
+    oFormData.append("type", "prod");
+    ajaxRequest({
+        "method": "POST",
+        "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vm4ms/WmsServices/MapFile",
+        "data": oFormData
+    });
+
+    angular.element(vitisApp.appHtmlFormDrtv).scope().$on("updateStudio_vmap_business_object_vmap_business_object", function (event, data) {
+        if (data["index"] === 1 && data["oSectionForm"]["template"] === "modules/vmap/template/studio.html") {
+            oVFB["reset"]();
+            oVFB["setId"](envSrvc["sId"]);
+            oVFB["setApplication"]("vmap");
+            oVFB["setToken"](sessionSrvc["token"]);
+            oVFB["setContainer"]("#container_section_" + envSrvc["oSelectedObject"]["name"] + "_studio");
+            oVFB["setAppProperties"](propertiesSrvc);
+        }
+    }, true);
+
+    /**
+     * loadVmap function.
+     * Function éxécutée au chargement de Vmap.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()["loadVmap"] = function () {
+        $log.info("loadVmap");
+
+        // Vmap en mode plein écran.
+        envSrvc["oSelectedMode"]["fullScreen"] = true;
+
+        // Permet de ne pas recharger le mode lors du re-clic
+        modesSrvc["setModeReload"]("vmap", false);
+
+        vitisApp.externFunctionSrvc()["resizeWin"]();
+        angular.element(vitisApp.appMainDrtv).scope()["setFullScreen"]();
+
+        // Aaffichage de l'anim ajax.
+        modesSrvc["getMode"]("vmap")["ajaxLoader"] = true;
+        if (modesSrvc["modes"][0]["mode_id"] === "vmap")
+            sessionStorage["ajaxLoader"] = true;
+
+        oVmap.init();
+    };
+
+    /**
+     * appMapDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Cartes".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appMapDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appMapDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive('appMapDescriptionColumn', vitisApp.appMapDescriptionColumnDrtv);
+
+    /**
+     * appMapThumbnailColumn directive.
+     * Mise en forme de la colonne "vignette" dans la liste de l'onglet "Cartes".
+     * @param {service} propertiesSrvc Paramètres des properties.
+     * @ngInject
+     **/
+    vitisApp.appMapThumbnailColumnDrtv = function (propertiesSrvc) {
+        return {
+            replace: true,
+            template: '<span class="glyphicon glyphicon-picture grid-column-glyph-icon"></span>',
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appMapThumbnailColumn", function (value) {
+                    // Si le champ est vide : supprime le lien.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        element[0].className = "glyphicon glyphicon-picture grid-column-glyph-icon";
+                        element[0].parentNode.style.textAlign = "center";
+                        // Création du "tooltip".
+                        $(element)["popover"]({
+                            //"trigger": "hover",
+                            "trigger": "hover",
+                            "container": "body",
+                            "title": "",
+                            "content": function () {
+                                var oImg = document.createElement("img");
+                                oImg.onerror = function () {
+                                    $(element)["popover"]("destroy");
+                                };
+                                oImg.src = scope["row"]["entity"][scope["col"]["field"]];
+                                oImg.className = "popover-thumbnail-img";
+                                return oImg.outerHTML;
+                            },
+                            "html": true,
+                            // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                            "placement": function (oPopoverNode, oElementNode) {
+                                return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                            },
+                            "template": '<div class="popover popover-thumbnail" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive('appMapThumbnailColumn', vitisApp.appMapThumbnailColumnDrtv);
+
+    /**
+     * appServiceUrlColumn directive.
+     * Mise en forme de la colonne "url" dans la liste de l'onglet "Services".
+     * @ngInject
+     **/
+    vitisApp.appServiceUrlColumnDrtv = function () {
+        return {
+            replace: true,
+            template: '<a href="" target="_blank" class="glyphicon glyphicon-link grid-column-glyph-icon"></a>',
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appServiceUrlColumn", function (value) {
+                    // Si le champ est vide : supprime le lien.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        element[0].className = "glyphicon glyphicon-link grid-column-glyph-icon";
+                        element[0].href = scope["row"]["entity"][scope["col"]["field"]];
+                        element[0].alt = element[0].href;
+                        element[0].title = element[0].href;
+                        element[0].parentNode.style.textAlign = "center";
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive('appServiceUrlColumn', vitisApp.appServiceUrlColumnDrtv);
+
+    /**
+     * appServiceDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Services".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appServiceDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appServiceDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_SERVICE"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_SERVICE"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive('appServiceDescriptionColumn', vitisApp.appServiceDescriptionColumnDrtv);
+
+    /**
+     * appServiceThumbnailColumn directive.
+     * Mise en forme de la colonne "vignette" dans la liste de l'onglet "Services".
+     * @param {service} propertiesSrvc Paramètres des properties.
+     * @ngInject
+     **/
+    vitisApp.appServiceThumbnailColumnDrtv = function (propertiesSrvc) {
+        return {
+            replace: true,
+            template: '<span class="glyphicon glyphicon-picture grid-column-glyph-icon"></span>',
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appServiceThumbnailColumn", function (value) {
+                    // Si le champ est vide : supprime le lien.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        element[0].className = "glyphicon glyphicon-picture grid-column-glyph-icon";
+                        element[0].parentNode.style.textAlign = "center";
+                        // Création du "tooltip".
+                        $(element)["popover"]({
+                            "trigger": "hover",
+                            "container": "body",
+                            "title": "",
+                            "content": function () {
+                                var oImg = document.createElement("img");
+                                oImg.onerror = function () {
+                                    $(element)["popover"]("destroy");
+                                };
+                                oImg.src = scope["row"]["entity"][scope["col"]["field"]];
+                                oImg.className = "popover-thumbnail-img";
+                                return oImg.outerHTML;
+                            },
+                            "html": true,
+                            // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                            "placement": function (oPopoverNode, oElementNode) {
+                                return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                            },
+                            "template": '<div class="popover popover-thumbnail" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appServiceThumbnailColumn", vitisApp.appServiceThumbnailColumnDrtv);
+
+    /**
+     * appLayerDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Calques".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appLayerDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appLayerDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appLayerDescriptionColumn", vitisApp.appLayerDescriptionColumnDrtv);
+
+    /**
+     * loadVmapGroup function.
+     * Chargement de la section "Vmap" dans l'onglet "Groupes" (mode "Utilisateurs").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['loadVmapGroup'] = function () {
+        // Injection des services.
+        var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]);
+        //
+        $log.info("loadVmapGroup");
+        // Surcharge l'url du formulaire des groupes de Vmap.
+        var scope = this;
+        var sTable = envSrvc["oSelectedObject"]["name"];
+        scope["oFormRequestParams"] = {
+            "sUrl": "modules/vmap/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json"
+        };
+    };
+
+    /**
+     * appCrsListDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Services".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appCrsListDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appCrsListDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["COORDINATE_SYSTEM_TOOLTIP_TITLE_VMAP_MAP_LAYER"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["COORDINATE_SYSTEM_TOOLTIP_TITLE_VMAP_MAP_LAYER"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]].replace(/\|/g, "<br>");
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        };
+    };
+    vitisApp["compileProvider"].directive("appCrsListDescriptionColumn", vitisApp.appCrsListDescriptionColumnDrtv);
+
+    /**
+     * appStyleListColumn directive.
+     * Mise en forme du sélecteur de style pour couches WMS
+     * @returns {vitisApp.appStyleListColumnDrtv}
+     * @ngInject
+     */
+    vitisApp.appStyleListColumnDrtv = function () {
+        return {
+            template: ' <select class="form-control minus" ng-model="oLayerStyle" ng-options="oStyle.Title for oStyle in aStyles" ng-disabled="aStyles.length < 1"></select>',
+            link: function (scope, element, attrs) {
+
+                /**
+                 * Fonction d'initialisation de la ligne
+                 * @returns {undefined}
+                 */
+                var init = function () {
+                    // Liste des styles dispo
+                    scope['aStyles'] = angular.copy(scope['row']['entity'][scope['col']['field']]);
+                    scope['aStyles'] = goog.isDefAndNotNull(scope['aStyles']) ? scope['aStyles'] : [{
+                            'Title': '',
+                            'Name': ''
+                        }];
+                    // Un style a déjà été renseigné ?
+                    if (goog.isDefAndNotNull(scope['row']['entity'][scope['col']['field'] + '_selected'])) {
+                        // Calcul de l'index du style précédemment renseigné
+                        var index = 0;
+                        for (var i = 0; i < scope['aStyles'].length; i++) {
+                            if (scope['aStyles'][i]['Name'] === scope['row']['entity'][scope['col']['field'] + '_selected']['Name']) {
+                                index = angular.copy(i);
+                            }
+                        }
+                        // Re-donne l'ancienne valeur
+                        scope['oLayerStyle'] = scope['aStyles'][index];
+                    } else {
+                        // Prend la première valeur
+                        scope['oLayerStyle'] = scope['aStyles'][0];
+                    }
+                    // Met la nouvelle valeur dans "style_selected"
+                    scope.$watch('oLayerStyle', function () {
+                        scope['row']['entity'][scope['col']['field'] + '_selected'] = scope['oLayerStyle'];
+                        scope.$root.$broadcast('layerStyleChanged', scope['row']['entity']);
+                    });
+                };
+                // Rafraichit la grille quand des couches sont ajoutés au calque
+                scope.$root.$on('addLayersToLayer', function () {
+                    scope['row']['grid']['refresh']();
+                    setTimeout(function () {
+                        init();
+                    });
+                });
+                init();
+            }
+        };
+    };
+    vitisApp["compileProvider"].directive("appStyleListColumn", vitisApp.appStyleListColumnDrtv);
+
+    /**
+     * initVmapServiceForm function.
+     * Traitements avant l'affichage du formulaire de service.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['initVmapServiceForm'] = function () {
+        $log.info("initVmapServiceForm");
+
+        var scope = angular.element(vitisApp.appMainDrtv).scope();
+        // Evènement sur la sélection dy type de service uniquement en mode "insert".
+        if (envSrvc["sMode"] == "insert") {
+            var oServiceTypeFormElement = document.querySelector("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] select[name='service_type_id']");
+            oServiceTypeFormElement.addEventListener("change", function () {
+                // Affichage des champs de formulaires suivant le type de service sélectionné.
+                scope.$root["setVmapServiceForm"](this.value);
+                // Lance un cycle $digest pour appliquer les changements de champs de form.
+                angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "']").scope().$apply();
+            });
+        } else {
+            // Affichage des champs de formulaires suivant le type de service sélectionné.
+            scope.$root["setVmapServiceForm"](envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_type_id"]);
+            // Lance un cycle $digest pour appliquer les changements de champs de form.
+            angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "']").scope().$apply();
+        }
+
+        if (goog.isDefAndNotNull(envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_options"])) {
+            var oOptions = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_options"];
+            if (!goog.isDefAndNotNull(oOptions)) {
+                oOptions = {};
+            } else if (goog.isString(oOptions)) {
+                oOptions = JSON.parse(oOptions);
+            } else {
+                oOptions = {};
+            }
+            if (goog.isDefAndNotNull(oOptions['login'])) {
+                if (goog.isDefAndNotNull(oOptions['password'])) {
+                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_login'] = oOptions['login'];
+                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_password'] = oOptions['password'];
+                }
+            }
+        }
+    };
+
+    /**
+     * setVmapServiceForm function.
+     * Affichage des champs de formulaires suivant le type de service sélectionné.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['setVmapServiceForm'] = function (sServiceTypeId) {
+        $log.info('setVmapServiceForm');
+        // Champs de form. à afficher pour chaque type de service.
+        var oServiceFormElements = {
+            'xyz': ['name', 'description', 'url', 'thumbnail', 'form_submit', 'return_list', 'service_login', 'service_password'],
+            'osm': ['name', 'description', 'url', 'thumbnail', 'form_submit', 'return_list'],
+            'bing': ['name', 'description', 'key', 'thumbnail', 'lang', 'imagery', 'form_submit', 'return_list'],
+            'imagewms': ['name', 'wms_service_type', 'description', 'url', 'service_type_version', 'wms_test_button', 'wms_test_submit_button', 'return_list', 'service_login', 'service_password', 'service_options'],
+            'tilewms': ['name', 'wms_service_type', 'description', 'url', 'service_type_version', 'wms_test_button', 'wms_test_submit_button', 'return_list', 'service_login', 'service_password', 'service_options'],
+            'wmts': ['name', 'description', 'url', 'service_type_version', 'service_type_type', 'capabilities_url', 'wmts_test_button', 'wmts_test_submit_button', 'return_list', 'service_login', 'service_password', 'service_options']
+        };
+        // Champs de form. affichés par défaut.
+        Object.keys(oServiceFormElements).forEach(function (sServiceType) {
+            oServiceFormElements[sServiceType].unshift('service_id', 'service_type_id');
+        });
+        // Affiche ou cache les champs de formulaires suivant le type de service.
+        var oAllFormElementDefinition = formSrvc['getAllFormElementDefinition'](envSrvc['sFormDefinitionName']);
+        if (typeof (sServiceTypeId) == 'undefined') {
+            sServiceTypeId = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
+        }
+        if (sServiceTypeId === 'tilewms' || sServiceTypeId === 'imagewms') {
+            envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wms_service_type'] = sServiceTypeId;
+        }
+
+        //if (typeof(oServiceFormElements[sServiceTypeId]) == 'undefined')
+        //sServiceTypeId = Object.keys(oServiceFormElements)[0];
+        oAllFormElementDefinition.forEach(function (oFormElementDefinition) {
+            var bVisible = true;
+
+            // Définit si le champ est visible
+            if (typeof (oServiceFormElements[sServiceTypeId]) != 'undefined') {
+                if (oFormElementDefinition['type'] !== 'button') {
+                    if (oServiceFormElements[sServiceTypeId].indexOf(oFormElementDefinition['name']) == -1)
+                        var bVisible = false;
+                } else {
+                    var aButtons = oFormElementDefinition['buttons'];
+                    if (goog.isDefAndNotNull(aButtons)) {
+                        aButtons.forEach(function (oButton) {
+                            if (oServiceFormElements[sServiceTypeId].indexOf(oButton['name']) === -1)
+                                oButton['visible'] = false;
+                            else
+                                oButton['visible'] = true;
+                        });
+                    }
+                }
+            }
+
+            // Si le champ version est visible : tooltip.
+            if (oFormElementDefinition['name'] == 'service_type_version' && bVisible) {
+                $timeout(function () {
+                    $translate(['FORM_SERVICE_TYPE_VERSION_TOOLTIP_VMAP_MAP_SERVICE']).then(function (translations) {
+                        var oOptions = {
+                            'title': '',
+                            'content': translations['FORM_SERVICE_TYPE_VERSION_TOOLTIP_VMAP_MAP_SERVICE'],
+                            'container': 'body',
+                            'trigger': 'hover'
+                        };
+                        // Création de l'élément qui contient le tooltip.
+                        if (document.getElementById(oFormElementDefinition['id'] + '_tooltip') == null) {
+                            var oTooltipElement = document.createElement('span');
+                            oTooltipElement.className = 'form-field-label-tooltip';
+                            var sTooltipElementId = oFormElementDefinition['id'] + '_tooltip';
+                            oTooltipElement.id = sTooltipElementId;
+                            if (document.getElementById(oFormElementDefinition['id'] + '_label') != null)
+                                document.getElementById(oFormElementDefinition['id'] + '_label').appendChild(oTooltipElement);
+                        }
+                        // Création du tooltip.
+                        angular.element(oTooltipElement)['popover'](oOptions);
+                    });
+                });
+            }
+            //
+            oFormElementDefinition['visible'] = bVisible;
+
+            if (envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_vm4ms']) {
+                if (oFormElementDefinition['name'] === 'name' || oFormElementDefinition['name'] === 'url') {
+                    oFormElementDefinition['type'] = 'label';
+                }
+            }
+        });
+
+        if ((sServiceTypeId === 'tilewms' || sServiceTypeId === 'imagewms') && envSrvc['sMode'] === 'update') {
+            formSrvc['getFormElementDefinition']('service_type_id', envSrvc['sFormDefinitionName'], envSrvc['sFormDefinition'])['visible'] = false;
+        } else {
+            formSrvc['getFormElementDefinition']('service_type_id', envSrvc['sFormDefinitionName'], envSrvc['sFormDefinition'])['visible'] = true;
+        }
+
+        if (sServiceTypeId === 'wmts') {
+            $timeout(function () {
+                // Version du service
+                if (envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_version'] === '' ||
+                        !goog.isDefAndNotNull(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_version'])) {
+                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_version'] = '1.0.0';
+                }
+            });
+        }
+    };
+
+    /**
+     * Function called before sending the vMap service form
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['beforeVmapServiceForm'] = function () {
+        $log.info('beforeVmapServiceForm');
+
+        var sServiceTypeId = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
+
+        if (sServiceTypeId === 'tilewms' || sServiceTypeId === 'imagewms') {
+            // Changement de type (tilewms, imagewms)
+            if (goog.isDefAndNotNull(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wms_service_type'])) {
+                if (goog.isDefAndNotNull(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wms_service_type']['selectedOption'])) {
+                    if (goog.isDefAndNotNull(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wms_service_type']['selectedOption']['value'])) {
+                        envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'] = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wms_service_type']['selectedOption']['value'];
+                        formSrvc['getFormElementDefinition']('service_type_id', envSrvc['sFormDefinitionName'], envSrvc['sFormDefinition'])['type'] = 'text';
+                    }
+                }
+            }
+        }
+    };
+
+    /**
+     * Function called after sending the vMap service form
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['afterVmapServiceForm'] = function () {
+        $log.info('afterVmapServiceForm');
+
+        var sServiceTypeId = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
+
+        if (sServiceTypeId === 'tilewms' || sServiceTypeId === 'imagewms') {
+            formSrvc['getFormElementDefinition']('service_type_id', envSrvc['sFormDefinitionName'], envSrvc['sFormDefinition'])['type'] = 'label';
+        }
+
+        this['editSectionForm']();
+    };
+
+    /**
+     * Test the WMTS service doing a getCapabilities request and show a message
+     * to say if the service is correct or not
+     * @param {boolean} bSendForm true if the form has to bo sended if the test is correct
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['testWMTSCapabilities'] = function (bSendForm) {
+        $log.info('testWMTSCapabilities');
+
+        var this_ = this;
+        var serviceUrl = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['url']);
+        var serviceVersion = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_version']);
+        var WMTSType = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_type']);
+        var serviceName = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['name']);
+        if (goog.isObject(WMTSType)) {
+            if (goog.isDefAndNotNull(WMTSType['selectedOption'])) {
+                if (goog.isDefAndNotNull(WMTSType['selectedOption']['value'])) {
+                    WMTSType = WMTSType['selectedOption']['value'];
+                }
+            }
+        }
+
+        if (!goog.isDefAndNotNull(serviceName) || serviceName === '') {
+            $.notify('Nom non défini', 'error');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(serviceUrl) || serviceUrl === '') {
+            $.notify('Lien non défini', 'error');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(serviceVersion) || serviceVersion === '') {
+            $.notify('Version non définie', 'error');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(WMTSType) || WMTSType === '') {
+            $.notify('Type non défini', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('service=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre SERVICE dans le champ "Lien"', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('request=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre REQUEST dans le champ "Lien"', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('version=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre VERSION dans le champ "Lien"', 'error');
+            return null;
+        }
+
+        this['WMTSCapabilities']({
+            'serviceUrl': serviceUrl,
+            'serviceVersion': serviceVersion,
+            'WMTSType': WMTSType
+        }, function (oCapabilities) {
+            $.notify('Service valide', 'success');
+            $timeout(function () {
+                var sOptions = JSON.stringify(oCapabilities);
+                envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_options'] = sOptions;
+                if (bSendForm) {
+
+                    // Enlève certains attributs au cas où l'utilisateur est ait écrits dans l'url
+                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['url'] = serviceUrl.removeURLParams(['request', 'service', 'version']);
+
+                    var sFormName = envSrvc["oFormDefinition"][envSrvc['sFormDefinitionName']]["name"];
+                    var scope = angular.element("form[name='" + sFormName + "']").scope();
+                    scope[sFormName].$setPristine();
+                    scope['sendForm']();
+                }
+            });
+        });
+    };
+
+    /**
+     * Make a WMTS getCapabilities
+     * @param {object} opt_options
+     * @param {string} opt_options.serviceUrl
+     * @param {string} opt_options.serviceVersion
+     * @param {string} opt_options.WMTSType
+     * @param {function} successCallback
+     * @param {function} errorCallback
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['WMTSCapabilities'] = function (opt_options, successCallback, errorCallback) {
+        var this_ = this;
+
+        $log.info('WMTSCapabilities');
+
+        if (!goog.isDefAndNotNull(opt_options['serviceUrl'])) {
+            console.error('serviceUrl not defined');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(opt_options['serviceVersion'])) {
+            console.error('serviceVersion not defined');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(opt_options['WMTSType'])) {
+            console.error('WMTSType not defined');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(errorCallback)) {
+            errorCallback = function (sError) {
+                this_.$root['modalWindow']('dialog', 'Service non valide', {
+                    'className': 'modal-danger',
+                    'message': sError
+                });
+            };
+        }
+
+        var serviceUrl = opt_options['serviceUrl'];
+        var serviceVersion = opt_options['serviceVersion'];
+        var WMTSType = opt_options['WMTSType'];
+
+        var sCapabilitiesUrl;
+        var bError = true;
+        var sError = '';
+
+        // Enlève certains attributs au cas où l'utilisateur est ait écrits dans l'url
+        serviceUrl = serviceUrl.removeURLParams(['request', 'service', 'version']);
+
+        if (WMTSType === 'KVP') {
+            if (serviceUrl.indexOf('?') === -1)
+                sCapabilitiesUrl = serviceUrl + '?SERVICE=WMTS&VERSION=' + serviceVersion + '&REQUEST=GetCapabilities';
+            else
+                sCapabilitiesUrl = serviceUrl + '&SERVICE=WMTS&VERSION=' + serviceVersion + '&REQUEST=GetCapabilities';
+        } else if (WMTSType === 'REST') {
+            sCapabilitiesUrl = serviceUrl + '/' + serviceVersion + '/WMTSCapabilities.xml';
+        }
+
+        function rhtmlspecialchars(str) {
+            if (typeof (str) == "string") {
+                str = str.replace(/&gt;/ig, ">");
+                str = str.replace(/&lt;/ig, "<");
+                str = str.replace(/&#039;/g, "'");
+                str = str.replace(/&quot;/ig, '"');
+                str = str.replace(/&amp;/ig, '&'); /* must do &amp; last */
+            }
+            return str;
+        }
+
+        if (goog.isDefAndNotNull(sCapabilitiesUrl)) {
+            ajaxRequest({
+                "method": "GET",
+                "url": propertiesSrvc['proxy_url'] + '?url=' + encodeURIComponent(sCapabilitiesUrl),
+                headers: {
+                    'charset': 'charset=utf-8'
+                },
+                "responseType": "text",
+                "scope": this_,
+                "success": function (response) {
+                    var text = response['data'];
+                    if (goog.isString(response['data'])) {
+                        if (response['data'].length > 0) {
+
+                            try {
+                                var result = new ol.format.WMTSCapabilities().read(rhtmlspecialchars(text));
+                            } catch (e) {
+                                var result = {};
+                                sError = text;
+                            }
+
+                            $log.info(result);
+
+                            if (goog.isDefAndNotNull(result['Contents'])) {
+                                if (goog.isArray(result['Contents']['Layer'])) {
+                                    if (goog.isDefAndNotNull(result['Contents']['Layer'][0])) {
+                                        if (goog.isArray(result['Contents']['Layer'][0]['TileMatrixSetLink'])) {
+                                            if (goog.isDefAndNotNull(result['Contents']['Layer'][0]['TileMatrixSetLink'][0])) {
+                                                if (goog.isString(result['Contents']['Layer'][0]['TileMatrixSetLink'][0]['TileMatrixSet'])) {
+                                                    bError = false;
+                                                } else {
+                                                    sError = 'Contents.Layer[0].TileMatrixSetLink[0].TileMatrixSet undefined';
+                                                }
+                                            } else {
+                                                sError = 'Contents.Layer[0].TileMatrixSetLink[0] undefined';
+                                            }
+                                        } else {
+                                            sError = 'Contents.Layer[0].TileMatrixSetLink undefined';
+                                        }
+                                    } else {
+                                        sError = 'Contents.Layer[0] undefined';
+                                    }
+                                } else {
+                                    sError = 'Contents.Layer undefined';
+                                }
+                            } else {
+                                sError = 'Contents undefined';
+                            }
+                        }
+                    }
+
+                    if (bError) {
+                        var message = 'Impossible de récupérer les informations depuis ' + sCapabilitiesUrl.replace(/</g, "&lt;").replace(/>/g, "&gt;");
+                        if (text.length < 500) {
+                            message += '<br><br>' + text;
+                        }
+                        if (goog.isDefAndNotNull(errorCallback)) {
+                            errorCallback.call(this_, message);
+                        }
+                    } else {
+                        successCallback.call(this_, result);
+                    }
+                },
+                "error": function (response) {
+                    if (goog.isDefAndNotNull(errorCallback)) {
+                        errorCallback.call(this_, 'Impossible de récupérer les informations depuis ' + sCapabilitiesUrl.replace(/</g, "&lt;").replace(/>/g, "&gt;"));
+                    }
+                    console.error('error: ', response);
+                }
+            });
+        }
+    };
+
+    /**
+     * Test the WMS service doing a getCapabilities request and show a message
+     * to say if the service is correct or not
+     * @param {boolean} bSendForm true if the form has to bo sended if the test is correct
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['testWMSCapabilities'] = function (bSendForm) {
+        $log.info('testWMSCapabilities');
+
+        var this_ = this;
+        var serviceUrl = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['url']);
+        var serviceName = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['name']);
+        var serviceVersion = angular.copy(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_version']);
+
+        if (!goog.isDefAndNotNull(serviceUrl) || serviceUrl === '') {
+            $.notify('Lien non défini', 'error');
+            return null;
+        }
+        if (!goog.isDefAndNotNull(serviceName) || serviceName === '') {
+            $.notify('Nom non défini', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('service=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre SERVICE dans le champ "Lien"', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('request=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre REQUEST dans le champ "Lien"', 'error');
+            return null;
+        }
+        if (serviceUrl.toLowerCase().indexOf('version=') > 0) {
+            $.notify('Veuillez ne pas utiliser le paramètre VERSION dans le champ "Lien"', 'error');
+            return null;
+        }
+
+        this['getCapabilities'](serviceUrl, {
+            'version': serviceVersion,
+            'service_login': envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['service_login'],
+            'service_password': envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['service_password']
+        }).then(function (oResult) {
+            if (goog.isDefAndNotNull(oResult)) {
+                if (goog.isDefAndNotNull(oResult['json'])) {
+                    $.notify('Service valide', 'success');
+                    $timeout(function () {
+                        if (bSendForm) {
+
+                            // Enlève certains attributs au cas où l'utilisateur est ait écrits dans l'url
+                            envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['url'] = serviceUrl.removeURLParams(['request', 'service', 'version']);
+
+                            var sFormName = envSrvc["oFormDefinition"][envSrvc['sFormDefinitionName']]["name"];
+                            var scope = angular.element("form[name='" + sFormName + "']").scope();
+                            scope[sFormName].$setPristine();
+                            scope['sendForm']();
+                        } else {
+
+                            this_['showLayerModalWindow']({
+                                'capabilities': oResult,
+                                'service_url': serviceUrl,
+                                'service_version': serviceVersion
+                            });
+                        }
+                    });
+                } else {
+                    $.notify('Service non valide', 'error');
+                }
+            } else {
+                $.notify('Service non valide', 'error');
+            }
+        });
+    };
+
+    /**
+     * cloneService function.
+     * Clonage d'un service de vmap.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['cloneService'] = function () {
+        $log.info("cloneService");
+    };
+
+    /**
+     * initVmapLayerForm function.
+     * Traitements avant l'affichage du formulaire des calques.
+     * @param {object} sId Id de l'enregistrement sélectionné dans la liste.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['initVmapLayerForm'] = function (sId) {
+        $log.info("initVmapLayerForm");
+
+        // Affiche ou pas la section "Formulaire de filtre"
+        this['showStudioIfLayerIsFiltered']()
+        //
+        var scope = angular.element(vitisApp.appMainDrtv).scope();
+
+        var oFormScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "']").scope();
+
+        // Requête pour la liste des services.
+        ajaxRequest({
+            "method": "GET",
+            "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/services",
+            "scope": scope,
+            "success": function (response) {
+                if (response["data"]["status"] == 1) {
+                    // Sauve le type de chaque service.
+                    if (response["data"]["list_count"] > 0) {
+                        var oServices = {};
+                        response["data"]["services"].forEach(function (oService) {
+                            oServices[oService["service_id"]] = oService;
+                        });
+                        // Sauve la liste des services.
+                        scope["oServices"] = oServices;
+                        // Affichage du formulaire du calque suivant le service sélectionné.
+                        if (envSrvc["sMode"] == "update") {
+                            scope.$root["setVmapLayerForm"]();
+                        }
+                    }
+                }
+            }
+        });
+
+        // Attend la fin de la compilation du formulaire.
+        var sServiceTypeId = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_type_id"];
+        if (sServiceTypeId == "tilewms" || sServiceTypeId == "imagewms") {
+            // Charge les infos des calques associés au calque.
+            if (envSrvc["sMode"] == "update") {
+                var oGridOptions = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] .ui-grid-form-field-data").scope().$parent["gridOptions"];
+                var sServiceUrl = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_url"];
+
+                var sSelectedLayers = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["layer_list"];
+                var aSelectedLayers = [];
+                var aGridData = [];
+
+                if (sSelectedLayers != null)
+                    aSelectedLayers = sSelectedLayers.split(",");
+
+                aSelectedLayers = scope['cleanLayersArray'](aSelectedLayers);
+
+                for (var i = aSelectedLayers.length - 1; i >= 0; i--) {
+                    aGridData.push({
+                        "name": aSelectedLayers[i]
+                    });
+                }
+                oGridOptions["data"] = aGridData;
+            }
+        }
+
+        // Événement au changement de type de service ou au chargement
+        if (envSrvc["sMode"] == "insert" || envSrvc["sMode"] == "update") {
+            setTimeout(function () {
+                var oServiceFormElement = document.querySelector("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] select[name='service_id']");
+                oServiceFormElement.addEventListener("change", function () {
+                    // Affichage des champs de formulaires suivant le type de service sélectionné.
+                    scope.$root["setVmapLayerForm"](this.value);
+
+                    // Lance un cycle $digest pour appliquer les changements de champs de form.
+                    angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "']").scope().$apply();
+
+                    var sServiceType = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
+                    if (sServiceType === 'tilewms' || sServiceType === 'imagewms') {
+                        if (goog.isString(envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['layer_list'])) {
+                            if (envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['layer_list'].length > 0) {
+                                scope.$root["checkVmapLayerWmsLayers"]();
+                            }
+                        }
+                    }
+                });
+            });
+        } else {
+            scope.$root["setVmapLayerForm"](envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_id"]);
+        }
+    };
+
+    /**
+     * setVmapLayerForm function.
+     * Affichage des champs de formulaires suivant le service sélectionné.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['setVmapLayerForm'] = function (sServiceId) {
+        $log.info('setVmapLayerForm');
+        var scope = angular.element(vitisApp.appMainDrtv).scope();
+        var this_ = this;
+
+        // Champs de form. à afficher pour chaque type de service.
+        var oLayerFormElements = {
+            'xyz': ['layer_id', 'service_id', 'service_name', 'name', 'layertheme_id', 'theme_name', 'bo_id', 'bo_id_list', 'form_submit', 'return_list'],
+            'osm': ['layer_id', 'service_id', 'service_name', 'name', 'layertheme_id', 'theme_name', 'bo_id', 'bo_id_list', 'form_submit', 'return_list'],
+            'bing': ['layer_id', 'service_id', 'service_name', 'name', 'layertheme_id', 'theme_name', 'bo_id', 'bo_id_list', 'form_submit', 'return_list'],
+            'tilewms': ['layer_id', 'service_id', 'service_name', 'name', 'description', 'layertheme_id', 'theme_name', 'layer_list', 'layer_options', 'bo_id', 'bo_id_list', 'is_dynamic', 'is_filtered', 'is_bo_filtered', 'form_submit', 'return_list'],
+            'imagewms': ['layer_id', 'service_id', 'service_name', 'name', 'description', 'layertheme_id', 'theme_name', 'layer_list', 'layer_options', 'bo_id', 'bo_id_list', 'is_dynamic', 'is_filtered', 'is_bo_filtered', 'form_submit', 'return_list'],
+            'wmts': ['layer_id', 'service_id', 'service_name', 'name', 'description', 'layertheme_id', 'theme_name', 'wmts_layer', 'matrix_set', 'layer_style', 'layer_format', 'layer_options', 'bo_id', 'bo_id_list', 'form_submit', 'return_list']
+        };
+
+        if (goog.isDefAndNotNull(propertiesSrvc['selection'])) {
+            if (propertiesSrvc['selection']['enable_getfeatureinfo']) {
+                oLayerFormElements['tilewms'].push('is_queryable_getfeatureinfo');
+                oLayerFormElements['imagewms'].push('is_queryable_getfeatureinfo');
+            }
+        }
+
+        var sServiceType;
+        var sName;
+        var aRows = formSrvc['getAllFormElementDefinition'](envSrvc['sFormDefinitionName']);
+
+        // Identifiant du service
+        if (!goog.isDefAndNotNull(sServiceId)) {
+            sServiceId = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_id'];
+            if (goog.isDefAndNotNull(sServiceId['selectedOption'])) {
+                if (goog.isDefAndNotNull(sServiceId['selectedOption']['value'])) {
+                    sServiceId = sServiceId['selectedOption']['value'];
+                }
+            }
+        }
+
+        // Type de service
+        if (envSrvc['sMode'] === 'insert' || envSrvc['sMode'] === 'update') {
+            if (goog.isDefAndNotNull(scope['oServices'][sServiceId])) {
+                sServiceType = scope['oServices'][sServiceId]['service_type_id'];
+                envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_type_id"] = sServiceType;
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['url'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_url"] = scope['oServices'][sServiceId]['url'];
+                }
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_type_version'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_type_version"] = scope['oServices'][sServiceId]['service_type_version'];
+                }
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_login'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_login"] = scope['oServices'][sServiceId]['service_login'];
+                }
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_password'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_password"] = scope['oServices'][sServiceId]['service_password'];
+                }
+            }
+        } else {
+            sServiceType = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
+        }
+
+        // Cache les éléments à cacher
+        aRows.forEach(function (oElement) {
+            if (goog.isDefAndNotNull(oLayerFormElements[sServiceType])) {
+                // Récupère le nom de l'élément
+                if (oElement['type'] === 'button') {
+                    var aButtons = oElement['buttons'];
+                    if (goog.isDefAndNotNull(aButtons)) {
+                        aButtons.forEach(function (oButton) {
+                            if (oLayerFormElements[sServiceType].indexOf(oButton['name']) === -1)
+                                oButton['visible'] = false;
+                            else
+                                oButton['visible'] = true;
+                        });
+                    }
+                } else {
+                    // si l'élément est présent dans la liste, alors il est visible
+                    if (oLayerFormElements[sServiceType].indexOf(oElement['name']) !== -1) {
+                        oElement['visible'] = true;
+                    } else {
+                        oElement['visible'] = false;
+                    }
+                }
+            }
+        });
+
+        // Charge les infos pour wmts
+        if (sServiceType === 'wmts') {
+
+            var oLayers = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wmts_layer'];
+            var oMatrix = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['matrix_set'];
+            var oStyles = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_style'];
+            var oFormats = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_format'];
+
+            // Valeurs par défaut
+            oLayers = goog.isDefAndNotNull(oLayers) ? oLayers : {
+                'options': [],
+                'selectedOption': {
+                    'value': ''
+                }
+            };
+            oMatrix = goog.isDefAndNotNull(oMatrix) ? oMatrix : {
+                'options': [],
+                'selectedOption': {
+                    'value': ''
+                }
+            };
+            oStyles = goog.isDefAndNotNull(oStyles) ? oStyles : {
+                'options': [],
+                'selectedOption': {
+                    'value': ''
+                }
+            };
+            oFormats = goog.isDefAndNotNull(oFormats) ? oFormats : {
+                'options': [],
+                'selectedOption': {
+                    'value': ''
+                }
+            };
+
+            $timeout(function () {
+                if (envSrvc['sMode'] === 'update') {
+                    // Donne à wmts_layer la valeur sélectionnée dans layer_list
+                    oLayers['selectedOption']['value'] = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_list'];
+                    // Rempli au préalable les options (qui se renpliront plus tard avec le getCapabilities)
+                    if (goog.isArray(oLayers['options'])) {
+                        if (oLayers['options'].length === 0) {
+                            oLayers['options'] = [{
+                                    'label': oLayers['selectedOption']['value'],
+                                    'value': oLayers['selectedOption']['value']
+                                }];
+                        }
+                    }
+                    if (goog.isArray(oMatrix['options'])) {
+                        if (oMatrix['options'].length === 0) {
+                            oMatrix['options'] = [{
+                                    'label': oMatrix['selectedOption']['value'],
+                                    'value': oMatrix['selectedOption']['value']
+                                }];
+                        }
+                    }
+                    if (goog.isArray(oStyles['options'])) {
+                        if (oStyles['options'].length === 0) {
+                            oStyles['options'] = [{
+                                    'label': oStyles['selectedOption']['value'],
+                                    'value': oStyles['selectedOption']['value']
+                                }];
+                        }
+                    }
+                    if (goog.isArray(oFormats['options'])) {
+                        if (oFormats['options'].length === 0) {
+                            oFormats['options'] = [{
+                                    'label': oFormats['selectedOption']['value'],
+                                    'value': oFormats['selectedOption']['value']
+                                }];
+                        }
+                    }
+                } else if (envSrvc['sMode'] === 'display') {
+                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['wmts_layer'] = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_list'];
+                }
+            });
+
+            var getLayersSelectOptions = function (oCapabilities) {
+                var options = [];
+                if (goog.isDefAndNotNull(oCapabilities['Contents'])) {
+                    if (goog.isArray(oCapabilities['Contents']['Layer'])) {
+                        var aLayers = oCapabilities['Contents']['Layer'];
+                        for (var i = 0; i < aLayers.length; i++) {
+                            options.push({
+                                'label': aLayers[i]['Title'],
+                                'value': aLayers[i]['Identifier']
+                            });
+                        }
+
+                    }
+                }
+                return options;
+            };
+
+            var getMatrixSelectOptions = function (oCapabilities, oSelectedLayer) {
+                var options = [];
+                var aTileMatrixSets = [];
+                var aTileMatrixIdentifiers = [];
+
+                if (goog.isDefAndNotNull(oSelectedLayer)) {
+                    if (goog.isDefAndNotNull(oSelectedLayer['value'])) {
+
+                        var sSelectedLayer = oSelectedLayer['value'];
+
+                        if (goog.isDefAndNotNull(oCapabilities['Contents'])) {
+                            if (goog.isDefAndNotNull(oCapabilities['Contents']['Layer'])) {
+
+                                var aLayers = oCapabilities['Contents']['Layer'];
+
+                                // Rempli aTileMatrixIdentifiers
+                                for (var i = 0; i < aLayers.length; i++) {
+                                    if (aLayers[i]['Identifier'] === sSelectedLayer) {
+                                        if (goog.isDefAndNotNull(aLayers[i]['TileMatrixSetLink'])) {
+                                            for (var ii = 0; ii < aLayers[i]['TileMatrixSetLink'].length; ii++) {
+                                                if (goog.isString(aLayers[i]['TileMatrixSetLink'][ii]['TileMatrixSet'])) {
+                                                    aTileMatrixIdentifiers.push(aLayers[i]['TileMatrixSetLink'][ii]['TileMatrixSet']);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+
+                            // Rempli aTileMatrixSets
+                            if (goog.isDefAndNotNull(oCapabilities['Contents']['TileMatrixSet']) && aTileMatrixIdentifiers.length > 0) {
+                                for (var i = 0; i < oCapabilities['Contents']['TileMatrixSet'].length; i++) {
+                                    if (aTileMatrixIdentifiers.indexOf(oCapabilities['Contents']['TileMatrixSet'][i]['Identifier']) !== -1) {
+                                        aTileMatrixSets.push(oCapabilities['Contents']['TileMatrixSet'][i]);
+                                    }
+                                }
+                            }
+
+                            // Rempli options
+                            if (aTileMatrixSets.length > 0) {
+                                for (var i = 0; i < aTileMatrixSets.length; i++) {
+                                    options.push({
+                                        'label': aTileMatrixSets[i]['Identifier'] + ' (' + aTileMatrixSets[i]['SupportedCRS'] + ')',
+                                        'value': aTileMatrixSets[i]['Identifier']
+                                    });
+                                }
+                            }
+                        }
+                    }
+                }
+                return options;
+            };
+
+            var getStylesSelectOptions = function (oCapabilities, oSelectedLayer) {
+                var options = [];
+                var aStyles = [];
+
+                if (goog.isDefAndNotNull(oSelectedLayer)) {
+                    if (goog.isDefAndNotNull(oSelectedLayer['value'])) {
+
+                        var sSelectedLayer = oSelectedLayer['value'];
+
+                        if (goog.isDefAndNotNull(oCapabilities['Contents'])) {
+                            if (goog.isDefAndNotNull(oCapabilities['Contents']['Layer'])) {
+
+                                var aLayers = oCapabilities['Contents']['Layer'];
+
+                                // Rempli aStyles
+                                for (var i = 0; i < aLayers.length; i++) {
+                                    if (aLayers[i]['Identifier'] === sSelectedLayer) {
+                                        if (goog.isDefAndNotNull(aLayers[i]['Style'])) {
+                                            aStyles = aLayers[i]['Style'];
+                                        }
+                                    }
+                                }
+                            }
+
+                            // Rempli options
+                            if (aStyles.length > 0) {
+                                for (var i = 0; i < aStyles.length; i++) {
+                                    options.push({
+                                        'label': aStyles[i]['Identifier'],
+                                        'value': aStyles[i]['Identifier']
+                                    });
+                                }
+                            }
+                        }
+                    }
+                }
+                return options;
+            };
+
+            var getFormatsSelectOptions = function (oCapabilities, oSelectedLayer) {
+                var options = [];
+                var aFormats = [];
+
+                if (goog.isDefAndNotNull(oSelectedLayer)) {
+                    if (goog.isDefAndNotNull(oSelectedLayer['value'])) {
+
+                        var sSelectedLayer = oSelectedLayer['value'];
+
+                        if (goog.isDefAndNotNull(oCapabilities['Contents'])) {
+                            if (goog.isDefAndNotNull(oCapabilities['Contents']['Layer'])) {
+
+                                var aLayers = oCapabilities['Contents']['Layer'];
+
+                                // Rempli aFormats
+                                for (var i = 0; i < aLayers.length; i++) {
+                                    if (aLayers[i]['Identifier'] === sSelectedLayer) {
+                                        if (goog.isDefAndNotNull(aLayers[i]['Format'])) {
+                                            aFormats = aLayers[i]['Format'];
+                                        }
+                                    }
+                                }
+                            }
+
+                            // Rempli options
+                            if (aFormats.length > 0) {
+                                for (var i = 0; i < aFormats.length; i++) {
+                                    options.push({
+                                        'label': aFormats[i],
+                                        'value': aFormats[i]
+                                    });
+                                }
+                            }
+                        }
+                    }
+                }
+                return options;
+            };
+
+            var loadSelectOptions = function (oCapabilities) {
+
+                var aLayers = getLayersSelectOptions(oCapabilities);
+                var aMatrixSets, aStyles, aFormats;
+
+                $timeout(function () {
+                    if (goog.isDefAndNotNull(oLayers)) {
+                        oLayers['options'] = aLayers;
+                    }
+                });
+
+                // Fonction appelée lors des changements de wmts_layer,
+                // ceci défini dans le json du formulaire
+                this_['wmtsLayerSelected'] = function () {
+                    $log.info('wmtsLayerSelected');
+
+                    if (goog.isDefAndNotNull(oLayers)) {
+                        if (goog.isDefAndNotNull(oLayers['selectedOption'])) {
+                            if (goog.isDefAndNotNull(oLayers['selectedOption']['value'])) {
+
+                                aMatrixSets = getMatrixSelectOptions(oCapabilities, oLayers['selectedOption']);
+                                aStyles = getStylesSelectOptions(oCapabilities, oLayers['selectedOption']);
+                                aFormats = getFormatsSelectOptions(oCapabilities, oLayers['selectedOption']);
+
+                                $timeout(function () {
+
+                                    if (goog.isDefAndNotNull(oMatrix)) {
+                                        oMatrix['options'] = aMatrixSets;
+                                        envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['matrix_set'] = oMatrix;
+                                    }
+                                    if (goog.isDefAndNotNull(oStyles)) {
+                                        oStyles['options'] = aStyles;
+                                        envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_style'] = oStyles;
+                                    }
+                                    if (goog.isDefAndNotNull(oFormats)) {
+                                        oFormats['options'] = aFormats;
+                                        envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_format'] = oFormats;
+                                    }
+                                    // Donne à layer_list la valeur sélectionnée dans wmts_layer
+                                    envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['layer_list'] = oLayers['selectedOption']['value'];
+                                });
+                            }
+                        }
+                    }
+                };
+                if (goog.isDefAndNotNull(oLayers)) {
+                    if (goog.isDefAndNotNull(oLayers['selectedOption'])) {
+                        if (goog.isDefAndNotNull(oLayers['selectedOption']['value'])) {
+                            if (oLayers['selectedOption']['value'].length > 0) {
+                                this_['wmtsLayerSelected']();
+                            }
+                        }
+                    }
+                }
+            };
+
+            var oService = scope['oServices'][sServiceId];
+            if (goog.isDefAndNotNull(oService) && envSrvc["sMode"] !== "display") {
+                if (goog.isDefAndNotNull(oService['service_options'])) {
+                    // Charge la liste des calques/matrices/styles en prenant les infos écrites en base dans service.service_options
+                    var oCapabilities = JSON.parse(oService['service_options']);
+                    loadSelectOptions(oCapabilities);
+                } else {
+                    // Charge la liste des calques/matrices/styles en faisant un getCapabilities
+                    this['WMTSCapabilities']({
+                        'serviceUrl': oService['url'],
+                        'serviceVersion': oService['service_type_version'],
+                        'WMTSType': oService['service_type_type']
+                    }, function (oCapabilities) {
+                        loadSelectOptions(oCapabilities);
+                    });
+                }
+            }
+        }
+
+        // Vide la liste ui-grid des calques associés
+        if (sServiceType !== 'imagewms' && sServiceType !== 'tilewms') {
+            if (goog.isDefAndNotNull( envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]['layer_list'])) {
+                delete envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]['layer_list'];
+            }
+            var oGridElement = document.querySelector("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] .ui-grid-form-field-data");
+            if (oGridElement != null)
+                angular.element(oGridElement).scope().$parent['gridOptions']['data'].length = 0;
+        }
+    };
+
+    /**
+     * loadVmapMapLayers function.
+     * Chargement de la section "Calques de la carte" dans l'onglet "Cartes".
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['loadVmapMapLayers'] = function () {
+        var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]);
+        //
+        $log.info("loadVmapMapLayers");
+        var scope = this;
+        // Sauve le tri par défaut de l'onglet "Cartes".
+        var sSortedBy = envSrvc["oSelectedObject"]["sorted_by"];
+        var sSortedDir = envSrvc["oSelectedObject"]["sorted_dir"];
+        // Tri pour la section "Calques de la carte".
+        envSrvc["oSelectedObject"]["sorted_by"] = "layer_index";
+        envSrvc["oSelectedObject"]["sorted_dir"] = "ASC";
+        // Classe spécifique pour séparer la liste ui-grid de la liste des sections.
+        var oSectionContainer = document.getElementById("container_section_" + envSrvc["oSelectedObject"]["name"] + "_layers");
+        oSectionContainer.className = oSectionContainer.className + " section-container-workspace-list";
+
+        // Paramétrage du module ui-grid
+        scope["gridOptions"] = {
+            "enableRowSelection": true,
+            "enableSelectAll": true,
+            "enablePagination": false,
+            "enablePaginationControls": false,
+            "useExternalPagination": true,
+            "paginationPageSize": 999, // Pas de pagination
+            "enableColumnMenus": false,
+            "enableColumnResizing": true,
+            //"enableColumnMoving": true,
+            "paginationPageSizes": [10, 20, 50, 100],
+            "appHeader": true,
+            "appHeaderTitleBar": true,
+            "appHeaderSearchForm": false,
+            "appHeaderOptionBar": false,
+            "appLoadGridData": true,
+            "oFilter": {
+                "relation": "AND",
+                "operators": [{
+                        "column": "map_id",
+                        "compare_operator": "=",
+                        "value": envSrvc["sId"]
+                    }]
+            },
+            "appGridTitle": "TITLE_GRID_MAP_LAYERS_VMAP_MAP_MAP_LAYERS",
+            "appFooter": false,
+            "appShowPagination": false,
+            "appEnableDragAndDrop": true,
+            "appDragAndDropEvent": {
+                "rowFinishDrag": "updateMapLayerSorting"
+            },
+            "appActions": [],
+            "oUrlParams": {
+                "order_by": "layer_index",
+                "sort_order": "DESC"
+            }
+        };
+        //envSrvc["oGridOptionsCopy"][envSrvc["sSelectedGridOptionsName"]]["oUrlParams"] = angular.copy(scope["gridOptions"]["oUrlParams"]);
+
+        // Pas de chargement de données.
+        scope["bLoadFormValues"] = false;
+
+        // Id de traduction des libellés des colonnes de la liste.
+        var aTranslationsId = ["FORM_MAP_ID_VMAP_MAP_MAP",
+            "FORM_NAME_VMAP_MAP_MAP",
+            "FORM_THEME_VMAP_MAP_MAP",
+            "FORM_VISIBLE_VMAP_MAP_MAP_LAYERS",
+            "FORM_OPACITY_VMAP_MAP_MAP_LAYERS"
+        ];
+        // Définition des colonnes de la liste.
+        $translate(aTranslationsId).then(function (aTranslations) {
+            scope["gridOptions"]["columnDefs"] = [
+                {"name": aTranslations["FORM_MAP_ID_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_MAP_ID_VMAP_MAP_MAP"], "field": "layer_id", "width": 50, "enableSorting": false, "type": "number", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_layer_id", "cellClass": "cell-align-right"},
+                {"name": aTranslations["FORM_NAME_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_NAME_VMAP_MAP_MAP"], "field": "name", "width": 250, "enableSorting": false, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_name"},
+                {"name": aTranslations["FORM_THEME_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_THEME_VMAP_MAP_MAP"], "field": "theme_name", "width": 200, "enableSorting": false, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_theme_name"},
+                {"name": aTranslations["FORM_VISIBLE_VMAP_MAP_MAP_LAYERS"], "displayName": aTranslations["FORM_VISIBLE_VMAP_MAP_MAP_LAYERS"], "field": "layer_visible", "width": 60, "enableSorting": false, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "cellTemplate": '<div data-app-set-boolean-icon-column="{{row.entity[col.field]}}"></div>', "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_layer_visible"},
+                {"name": aTranslations["FORM_OPACITY_VMAP_MAP_MAP_LAYERS"], "displayName": aTranslations["FORM_OPACITY_VMAP_MAP_MAP_LAYERS"], "field": "layer_opacity", "width": 65, "enableSorting": false, "type": "number", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_layer_opacity", "cellClass": "cell-align-right", "cellTemplate": '<div data-app-map-layers-opacity-column="{{row.entity.layer_id}}" class="cell-input-type-text"><input type="number" class="form-control" min="0" max="100"></div>'},
+            ];
+        });
+
+        // Boutons de la liste.
+        if (envSrvc["sMode"] == "update") {
+            $translate(["BTN_VISIBLE_VMAP_MAP_MAP_LAYERS", "BTN_INVISIBLE_VMAP_MAP_MAP_LAYERS", "BTN_ADD_LAYERS_VMAP_MAP_MAP_LAYERS", "BTN_DELETE_LAYERS_VMAP_MAP_MAP_LAYERS"]).then(function (oTranslations) {
+                scope["gridOptions"]["appActions"] = [
+                    {
+                        "label": oTranslations["BTN_ADD_LAYERS_VMAP_MAP_MAP_LAYERS"],
+                        "name": scope["sSelectedObjectName"] + "_add_layer_btn",
+                        "event": "showAddLayersToMapModalWindow()"
+                    },
+                    {
+                        "label": oTranslations["BTN_DELETE_LAYERS_VMAP_MAP_MAP_LAYERS"],
+                        "name": scope["sSelectedObjectName"] + "_delete_layer_btn",
+                        "event": "deleteMapLayers()"
+                    },
+                    {
+                        "label": oTranslations["BTN_VISIBLE_VMAP_MAP_MAP_LAYERS"],
+                        "name": scope["sSelectedObjectName"] + "_visible_btn",
+                        "event": "setMapLayerVisibility(true)"
+                    },
+                    {
+                        "label": oTranslations["BTN_INVISIBLE_VMAP_MAP_MAP_LAYERS"],
+                        "name": scope["sSelectedObjectName"] + "_invisible_btn",
+                        "event": "setMapLayerVisibility(false)"
+                    }
+                ];
+            });
+
+            // Attends la compilation du template workspaceList.
+            var clearListener = scope.$root.$on('workspaceListTplCompiled', function (event) {
+                // Supprime le "listener".
+                clearListener();
+                // Insertion des boutons pour changer l'ordre des calques.
+                //var sGridFooterId = envSrvc["oSelectedObject"]["name"] + "_grid_footer";
+                //document.getElementById(sGridFooterId).className += " workspacelist-grid-footer-map";
+                //workspacelist-grid-data
+                var oGridData = document.querySelector("#" + envSrvc["oSelectedObject"]["name"] + "_" + envSrvc["sSelectedSectionName"] + "_grid .workspacelist-grid-data");
+                // arrow-up / chevron-up / triangle-top
+                var sLayerUpId = scope["sSelectedObjectName"] + "_layer_up_btn";
+                var sLayerDownId = scope["sSelectedObjectName"] + "_layer_down_btn";
+                angular.element(oGridData).append('<button type="button" id="' + sLayerUpId + '" class="btn btn-sm btn-primary map-layer-order-up" aria-label="Left Align"><span class="glyphicon glyphicon-chevron-up"></span></button>');
+                angular.element(oGridData).append('<button type="button" id="' + sLayerDownId + '" class="btn btn-sm btn-primary map-layer-order-down" aria-label="Left Align"><span class="glyphicon glyphicon-chevron-down"></span></button>');
+                // Evènements sur les boutons.
+                document.getElementById(sLayerUpId).addEventListener("click", function () {
+                    scope.$root["changeMapLayerSorting"]("up");
+                });
+                document.getElementById(sLayerDownId).addEventListener("click", function () {
+                    scope.$root["changeMapLayerSorting"]("down");
+                });
+                // Restaure le tri par défaut de l'onglet "Cartes".
+                envSrvc["oSelectedObject"]["sorted_by"] = sSortedBy;
+                envSrvc["oSelectedObject"]["sorted_dir"] = sSortedDir;
+            });
+        }
+    };
+
+    /**
+     * showAddLayersToMapModalWindow function.
+     * Affichage de la liste des calques disponibles pour une carte dans une fenêtre modale.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['showAddLayersToMapModalWindow'] = function () {
+        // Injection des services.
+        var $compile = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$compile"]);
+        var $templateRequest = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$templateRequest"]);
+        var $translate = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$translate"]);
+        var uiGridConstants = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["uiGridConstants"]);
+
+        //
+        $log.info("showAddLayersToMapModalWindow");
+        var scope = this.$new();
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
+        modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
+        // Sauve l'ancien onglet
+        //var oSaveSelectedObject = angular.copy(envSrvc["oSelectedObject"]);
+        var oSaveSelectedObject = modesSrvc["getObject"](envSrvc["oSelectedObject"]["name"], modesSrvc["getMode"](envSrvc["oSelectedMode"]["mode_id"]));
+        var sSaveMode = envSrvc["sMode"];
+        var sSaveSelectedGridOptionsName = envSrvc["sSelectedGridOptionsName"];
+        // Paramètres de l'onglet.
+        envSrvc["oSelectedObject"] = {
+            "actions": [],
+            "columns": [],
+            "mode_id": oSaveSelectedObject["mode_id"],
+            "name": oSaveSelectedObject["name"] + "_available_layers",
+            "ressource_id": "vmap/layers",
+            "sections": "",
+            "template_name": "",
+            "order_by": "name",
+            "sort_order": "ASC"
+        };
+        envSrvc["sMode"] = "search";
+        scope['sSelectedObjectName'] = envSrvc["oSelectedObject"]["name"];
+
+        // Paramétrage du module ui-grid
+        scope["gridOptions"] = {
+            "enableRowSelection": true,
+            "enableSelectAll": true,
+            "enablePagination": true,
+            "enablePaginationControls": false,
+            "useExternalPagination": true,
+            "paginationPageSize": 100,
+            "enableColumnMenus": false,
+            "enableColumnResizing": true,
+            //"enableColumnMoving": true,
+            "paginationPageSizes": [10, 20, 50, 100],
+            "appHeader": true,
+            "appHeaderTitleBar": true,
+            "appHeaderSearchForm": true,
+            "appHeaderOptionBar": false,
+            "appLoadGridData": true,
+            "appGridTitle": "TITLE_GRID_AVAILABLE_LAYERS_VMAP_MAP_MAP_LAYERS",
+            "appResizeGrid": true,
+            "appFooter": true,
+            "appShowPagination": true,
+            "appActions": [],
+            "oUrlParams": {
+                "order_by": "name",
+                "sort_order": "ASC"
+            }
+        };
+        // Id de traduction des libellés des colonnes de la liste.
+        var aTranslationsId = ["FORM_MAP_ID_VMAP_MAP_MAP",
+            "FORM_NAME_VMAP_MAP_MAP",
+            "FORM_THEME_VMAP_MAP_MAP",
+            "FORM_COORDINATE_SYSTEM_VMAP_MAP_LAYER",
+            "FORM_DESCRIPTION_VMAP_MAP_LAYER"
+        ];
+
+        // Définition des colonnes de la liste.
+        $translate(aTranslationsId).then(function (aTranslations) {
+            scope["gridOptions"]["columnDefs"] = [
+                {"name": aTranslations["FORM_MAP_ID_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_MAP_ID_VMAP_MAP_MAP"], "field": "layer_id", "width": 50, "enableSorting": true, "type": "number", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_layer_id"},
+                {"name": aTranslations["FORM_NAME_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_NAME_VMAP_MAP_MAP"], "field": "name", "width": 380, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_name", "sort": {"direction": uiGridConstants["ASC"], "ignoreSort": true, "priority": 0}},
+                {"name": aTranslations["FORM_THEME_VMAP_MAP_MAP"], "displayName": aTranslations["FORM_THEME_VMAP_MAP_MAP"], "field": "theme_name", "width": 200, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_theme_name"},
+                {"name": aTranslations["FORM_DESCRIPTION_VMAP_MAP_LAYER"], "displayName": aTranslations["FORM_DESCRIPTION_VMAP_MAP_LAYER"], "field": "description", "width": 150, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_crs_list", "cellTemplate": '<div data-app-layer-description-column="{{row.entity[col.field]}}"></div>'}
+            ];
+        });
+
+        // Boutons de la liste.
+        if (envSrvc["sMode"] != "display") {
+            $translate(["BTN_ADD_VMAP_MAP_MAP_LAYERS"]).then(function (oTranslations) {
+                scope["gridOptions"]["appActions"] = [
+                    {
+                        "label": oTranslations["BTN_ADD_VMAP_MAP_MAP_LAYERS"],
+                        "name": scope["sSelectedObjectName"] + "_add_layer_btn",
+                        "event": "addLayersToMap()"
+                    }
+                ];
+            });
+        }
+
+        // Calques à exclure (ceux associées à la carte).
+        var aRows = envSrvc["oGridOptions"][oSaveSelectedObject["name"] + '_layers']["data"];
+        if (aRows.length > 0) {
+            var aLayersId = [];
+            for (var i = 0; i < aRows.length; i++) {
+                if (goog.isDefAndNotNull(aRows[i]["layer_id"])) {
+                    aLayersId.push(aRows[i]["layer_id"]);
+                }
+            }
+            if (aLayersId.length > 0) {
+                envSrvc["oSelectedObject"]["filter"] = {
+                    "relation": "AND",
+                    "operators": [{
+                            "column": "layer_id",
+                            "compare_operator": "NOT IN",
+                            "value": aLayersId
+                        }]
+                };
+            }
+        }
+
+        // Affichage de la fenêtre modale.
+        var sContainerId = "container_" + envSrvc["oSelectedObject"]["name"] + "_available_layers";
+        var oOptions = {
+            "className": "dialog-modal-window dialog-modal-window-workspace-list dialog-modal-window-available-layers",
+            "message": '<div id="' + sContainerId + '" class="col-xs-12"></div>'
+        };
+
+        scope["modalWindow"]("dialog", null, oOptions).then(function (oDialog) {
+            // Attends la fin de l'affichage de la fenêtre modale.
+            $(oDialog).on('shown.bs.modal', function (e) {
+                //
+                var oModalContainer = document.querySelector(".dialog-modal-window-available-layers > .modal-dialog");
+                oModalContainer.className = oModalContainer.className + " modal-lg";
+                // Compile le template de la liste.
+                var sTemplateUrl = 'templates/workspaceListTpl.html';
+                $templateRequest(sTemplateUrl).then(function (sTemplate) {
+                    $compile($("#" + sContainerId).html(sTemplate).contents())(scope);
+                });
+            });
+            // Attends la fermeture de la fenêtre modale.
+            $(oDialog).on('hide.bs.modal', function (e) {
+                // Restaure l'ancien onglet sauvé.
+                envSrvc["oSelectedObject"] = oSaveSelectedObject;
+                envSrvc["sMode"] = sSaveMode;
+                envSrvc["sSelectedGridOptionsName"] = sSaveSelectedGridOptionsName;
+                // Recharge la liste des calques associés à la carte.
+                scope.$root["refreshGrid"](scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["grid"]["appScope"], envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]]);
+            });
+        });
+    };
+
+    /**
+     * setMapLayerVisibility function.
+     * Définition de la visibilité d'un calque associé à une carte.
+     * @param {boolean} bVisibility Visibilité du calque (T/F).
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['setMapLayerVisibility'] = function (bVisibility) {
+        $log.info("setMapLayerVisibility");
+        var scope = this;
+        var oParams = {
+            "visibility": "" + bVisibility,
+            "map_id": envSrvc["sId"]
+        };
+        // Liste des calques sélectionnés.
+        var aSelectedRows = scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var i = 0, aLayersId = [];
+            while (i < aSelectedRows.length) {
+                aLayersId.push(aSelectedRows[i]["layer_id"]);
+                i++;
+            }
+            oParams["map_layers"] = aLayersId.join("|");
+            //
+            ajaxRequest({
+                "method": "PUT",
+                "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/maplayers/" + envSrvc["sId"] + "/visibility",
+                "data": oParams,
+                "scope": scope,
+                "success": function (response) {
+                    if (response["data"]["status"] == 0) {
+                        var oOptions = {
+                            "className": "modal-danger",
+                            "message": response["data"]["errorMessage"]
+                        };
+                        scope["modalWindow"]("dialog", "ERROR_MAP_LAYER_VISIBILITY_VMAP_MAP_MAP_LAYERS", oOptions);
+                    } else {
+                        // Efface la sélection.
+                        scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["clearSelectedRows"]();
+                        // Recharge la liste.
+                        scope["refreshGrid"](scope, scope["gridOptions"]);
+                        // Affichage du message de succés.
+                        $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
+                            $.notify(sTranslation, "success");
+                        });
+                    }
+                }
+            });
+        }
+    };
+
+    /**
+     * addLayersToMap function.
+     * Association d'une liste de calques à une carte.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['addLayersToMap'] = function () {
+        $log.info("addLayersToMap");
+        var scope = this;
+        var oParams = {
+            "map_id": envSrvc["sId"]
+        };
+        // Liste des calques sélectionnés.
+        var aSelectedRows = scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var i = 0, aLayersId = [];
+            while (i < aSelectedRows.length) {
+                aLayersId.push(aSelectedRows[i]["layer_id"]);
+                i++;
+            }
+            oParams["map_layers"] = aLayersId.join("|");
+            //
+            ajaxRequest({
+                "method": "PUT",
+                "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/maplayers/" + envSrvc["sId"],
+                "data": oParams,
+                "scope": scope,
+                "success": function (response) {
+                    if (response["data"]["status"] == 0) {
+                        var oOptions = {
+                            "className": "modal-danger",
+                            "message": response["data"]["errorMessage"]
+                        };
+                        scope["modalWindow"]("dialog", "ERROR_ADD_MAP_LAYERS_VMAP_MAP_MAP_LAYERS", oOptions);
+                    } else {
+                        // Efface la sélection.
+                        //scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["clearSelectedRows"]();
+                        // Recharge la liste.
+                        //scope["refreshGrid"](scope, scope["gridOptions"]);
+                        //
+                        bootbox["hideAll"]();
+                        // Affichage du message de succés.
+                        $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
+                            $.notify(sTranslation, "success");
+                        });
+                    }
+                }
+            });
+        }
+    };
+
+    /**
+     * deleteMapLayers function.
+     * Suppression des calques associés à la carte.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['deleteMapLayers'] = function () {
+        $log.info("deleteMapLayers");
+        var scope = this;
+        var oParams = {
+            "map_id": envSrvc["sId"]
+        };
+        // Liste des calques sélectionnés.
+        var aSelectedRows = scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var i = 0, aLayersId = [];
+            while (i < aSelectedRows.length) {
+                aLayersId.push(aSelectedRows[i]["layer_id"]);
+                i++;
+            }
+            oParams["idList"] = aLayersId.join("|");
+            // Suppression.
+            ajaxRequest({
+                "method": "DELETE",
+                "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/maplayers/" + envSrvc["sId"],
+                "params": oParams,
+                "scope": scope,
+                "success": function (response) {
+                    if (response["data"]["status"] == 0) {
+                        var oOptions = {
+                            "className": "modal-danger",
+                            "message": response["data"]["errorMessage"]
+                        };
+                        scope["modalWindow"]("dialog", "ERROR_DELETE_MAP_LAYER_VMAP_MAP_MAP_LAYERS", oOptions);
+                    } else {
+                        // Efface la sélection.
+                        scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["clearSelectedRows"]();
+                        // Recharge la liste.
+                        scope["refreshGrid"](scope, scope["gridOptions"]);
+                        // Affichage du message de succés.
+                        $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
+                            $.notify(sTranslation, "success");
+                        });
+                    }
+                }
+            });
+        }
+    };
+
+    /**
+     * changeMapLayerSorting function.
+     * Change l'ordre des calques sélectionnés d'une carte.
+     * @param {string} sDirection Sens de déplacement des calques sélectionnés ("up"/"down").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['changeMapLayerSorting'] = function (sDirection) {
+        $log.info("changeMapLayerSorting");
+        var scope = this;
+        // Liste des calques sélectionnés.
+        var oGridApi = scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]];
+        var oGridOptions = envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]];
+        var aSelectedRows = oGridApi["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var bUpdateMapLayersIndex = false;
+            // Index des calques dont l'ordre change.
+            var i = 0, aLayersIndex = [];
+            while (i < aSelectedRows.length) {
+                oGridOptions["data"].forEach(function (oRow, iIndex) {
+                    if (oRow["$$hashKey"] == aSelectedRows[i]["$$hashKey"])
+                        aLayersIndex.push(iIndex);
+                });
+                i++;
+            }
+            // Change l'ordre des calques sélectionnés vers le haut.
+            if (sDirection == "up") {
+                aLayersIndex.forEach(function (iLayerIndex, iIndex) {
+                    var oRow;
+                    if (iLayerIndex > 0 && iLayerIndex > iIndex) {
+                        oRow = oGridOptions["data"].splice(iLayerIndex, 1);
+                        oGridOptions["data"].splice(iLayerIndex - 1, 0, oRow[0]);
+                        bUpdateMapLayersIndex = true;
+                    }
+                });
+            }
+            // Change l'ordre des calques sélectionnés vers le bas.
+            aLayersIndex.reverse();
+            if (sDirection == "down") {
+                aLayersIndex.forEach(function (iLayerIndex, iIndex) {
+                    var oRow;
+                    if (iLayerIndex < oGridOptions["data"].length - 1 && iLayerIndex < oGridOptions["data"].length - 1 - iIndex) {
+                        oRow = oGridOptions["data"].splice(iLayerIndex, 1);
+                        oGridOptions["data"].splice(iLayerIndex + 1, 0, oRow[0]);
+                        bUpdateMapLayersIndex = true;
+                    }
+                });
+            }
+            // Sauve la liste des id des calques.
+            var i = 0, aLayersId = [];
+            while (i < oGridOptions["data"].length) {
+                aLayersId.push(oGridOptions["data"][i]["layer_id"]);
+                i++;
+            }
+            // Mise à jour de l'index des calques de la carte dans la base.
+            if (bUpdateMapLayersIndex)
+                scope.$root["updateMapLayerSorting"]();
+        }
+    };
+
+    /**
+     * updateMapLayerSorting function.
+     * Change l'ordre des calques sélectionnés d'une carte.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['updateMapLayerSorting'] = function () {
+        $log.info("updateMapLayerSorting");
+        var scope = this;
+        var oParams = {
+            "map_id": envSrvc["sId"]
+        };
+        // Sauve la liste des id des calques.
+        var oGridOptions = envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]];
+        var i = 0, aLayersId = [];
+        for (var i = oGridOptions["data"].length - 1; i >= 0; i--) {
+            aLayersId.push(oGridOptions["data"][i]["layer_id"]);
+        }
+
+        oParams["map_layers"] = aLayersId.join("|");
+
+        // Mise à jour de l'index des calques de la carte dans la base.
+        ajaxRequest({
+            "method": "PUT",
+            "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/maplayers/" + envSrvc["sId"] + "/sorting",
+            "data": oParams,
+            "scope": scope,
+            "success": function (response) {
+                if (response["data"]["status"] == 0) {
+                    var oOptions = {
+                        "className": "modal-danger",
+                        "message": response["data"]["errorMessage"]
+                    };
+                    scope["modalWindow"]("dialog", "ERROR_ADD_MAP_LAYERS_VMAP_MAP_MAP_LAYERS", oOptions);
+                }
+            }
+        });
+    };
+
+    /**
+     * appLayerThemeDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Thèmes des calques".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appLayerThemeDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appLayerThemeDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER_THEME"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER_THEME"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appLayerThemeDescriptionColumn", vitisApp.appLayerThemeDescriptionColumnDrtv);
+
+    /**
+     * appMapThemeDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Thèmes des calques".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appMapThemeDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appMapThemeDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP_THEME"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP_THEME"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appMapThemeDescriptionColumn", vitisApp.appMapThemeDescriptionColumnDrtv);
+
+    /**
+     * appModuleDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Modules".
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appModuleDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appModuleDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appModuleDescriptionColumn", vitisApp.appModuleDescriptionColumnDrtv);
+
+    /**
+     * loadVmapUser function.
+     * Chargement de la section "Vmap" dans l'onglet "Utilisateurs" (mode "Utilisateurs").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['loadVmapUser'] = function () {
+        $log.info("loadVmapUser");
+        // Surcharge l'url du formulaire des utilisateurs de Vmap.
+        var scope = this;
+        var sTable = envSrvc["oSelectedObject"]["name"];
+        scope["oFormRequestParams"] = {
+            "sUrl": "modules/vmap/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json"
+        };
+    };
+
+    /**
+     * beforeVmapAdminPrintVmapAdminTemplateEdition function.
+     * Chargement de l'onglet "Modèles" (mode "Impressions").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['beforeVmapAdminPrintVmapAdminTemplateEdition'] = function () {
+        $log.info("beforeVmapAdminPrintVmapAdminTemplateEdition");
+        /*
+         if (envSrvc["sMode"] != "display") {
+         var scope = this;
+         // Attends la fin du chargement de la définition du formulaire.
+         var clearListener = scope.$root.$on('endFormNgRepeat', function (event, sFormDefinitionName) {
+         var oWebServiceFormElement = document.querySelector("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] select[name='web_service_id']");
+         var oWebService = formSrvc["getFormElementDefinition"]("web_service_id", envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]);
+         var oRessource = formSrvc["getFormElementDefinition"]("ressource", envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]);
+         var oWebServiceParams = {
+         "ressource_id": "vitis/webservices",
+         "id_key": "name",
+         "label_key": "name",
+         "parameters": {
+         "attributs": "name"
+         }
+         };
+
+         // Web service et ressource sélectionnés.
+         if (envSrvc["sMode"] == "update") {
+         var sRessourceId = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["ressource_id"];
+         if (goog.isDefAndNotNull(sRessourceId)) {
+         if (sRessourceId != "") {
+         var aRessourceId = sRessourceId.split("/");
+         oWebService["default_value"] = aRessourceId[0];
+         oRessource["default_value"] = aRessourceId[1];
+         oRessource["web_service"] = angular.copy(oWebServiceParams);
+         oRessource["web_service"]["ressource_id"] += "/" + aRessourceId[0] + "/ressources";
+         }
+         }
+         }
+
+         // Charge les ressources du service sélectionné.
+         oWebServiceFormElement.addEventListener("change", function () {
+         oRessource["web_service"] = angular.copy(oWebServiceParams);
+         oRessource["web_service"]["ressource_id"] += "/" + envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["web_service_id"]["selectedOption"]["value"] + "/ressources";
+         oWebService["child_select"] = "ressource";
+         formSrvc["reloadSelectField"](oWebService, envSrvc["sFormDefinitionName"], envSrvc["oFormValues"], envSrvc["oFormDefinition"]);
+         });
+         // Supprime le "listener".
+         clearListener();
+         });
+         }
+         */
+    };
+
+    /**
+     * beforeVmapAdminTemplateSubmit function.
+     * Traitements avant l'envoi d'un form. de l'onglet "Modèles" (mode "Impressions").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['beforeVmapAdminTemplateSubmit'] = function () {
+        $log.info("beforeVmapAdminTemplateSubmit");
+        /*
+         var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "']").scope();
+         var oEditor = formScope["oCodeMirrorEditor"]["definition"];
+         var deferred = $q.defer();
+         var promise = deferred.promise;
+         if (oEditor["getDoc"]()["getValue"]() != "")
+         deferred.resolve();
+         return promise;
+         */
+        /*
+         var scope = this;
+         var sRessourceId = "";
+         var oWebServiceId = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["web_service_id"];
+         var oRessource = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["ressource"];
+         // Sauve la ressource dans le champ caché.
+         if (oWebServiceId["selectedOption"]["value"] != "" && oRessource["selectedOption"]["value"] != "")
+         sRessourceId = oWebServiceId["selectedOption"]["value"] + "/" + oRessource["selectedOption"]["value"];
+         envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["ressource_id"] = sRessourceId;
+         */
+    };
+
+    /**
+     * appPrintParameterPlaceholderColumn directive.
+     * Mise en forme de la colonne "placeholder" dans la liste de l'onglet "Paramètres" (impression).
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appPrintParameterPlaceholderColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appPrintParameterPlaceholderColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appPrintParameterPlaceholderColumn", vitisApp.appPrintParameterPlaceholderColumnDrtv);
+
+    /**
+     * appPrintParameterDefaultValueColumn directive.
+     * Mise en forme de la colonne "defaultvalue" dans la liste de l'onglet "Paramètres" (impression).
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appPrintParameterDefaultValueColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appPrintParameterDefaultValueColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appPrintParameterDefaultValueColumn", vitisApp.appPrintParameterDefaultValueColumnDrtv);
+
+    /**
+     * appMapLayersOpacityColumn directive.
+     * Mise en forme de la colonne "layer_opacity" dans la liste de la section "Calques de la carte" (Cartes).
+     * @ngInject
+     **/
+    vitisApp.appMapLayersOpacityColumnDrtv = function () {
+        return {
+            link: function (scope, element, attrs) {
+                // Mise à jour des données si l'ordre change.
+                var clearObserver = attrs.$observe("appMapLayersOpacityColumn", function (value) {
+                    // Opacité et id du calque dans le champ de form. de type "number".
+                    var oOpacityElement = element[0].querySelector("input[type='number']");
+                    oOpacityElement.value = scope["row"]["entity"][scope["col"]["field"]];
+                    oOpacityElement.setAttribute("data-layer-id", scope["row"]["entity"]["layer_id"]);
+                });
+                // Mise à jour de l'opacité du calque dans la base.
+                element[0].querySelector("input[type='number']").addEventListener("change", scope.$root["setMapLayerOpacity"]);
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime l'observateur.
+                    clearObserver();
+                    //
+                    element[0].querySelector("input[type='number']").removeEventListener("change", scope.$root["setMapLayerOpacity"]);
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive("appMapLayersOpacityColumn", vitisApp.appMapLayersOpacityColumnDrtv);
+
+    /**
+     * setMapLayerOpacity function.
+     * Mise à jour de l'opacité du calque d'une carte dans la base.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['setMapLayerOpacity'] = function (oEvent) {
+        $log.info("setMapLayerOpacity");
+        var scope = angular.element(vitisApp.appMainDrtv).scope();
+        // 0 >= Opacité >= 100
+        var iOpacity = parseInt(oEvent["target"].value);
+        if (iOpacity < 0)
+            iOpacity = 0;
+        else if (iOpacity > 100)
+            iOpacity = 100;
+        oEvent["target"].value = iOpacity;
+        //
+        var oParams = {
+            "map_id": envSrvc["sId"],
+            "layer_id": oEvent["target"].getAttribute("data-layer-id"),
+            "layer_opacity": iOpacity
+        };
+        // Mise à jour de l'opacité du calque de la carte dans la base.
+        ajaxRequest({
+            "method": "PUT",
+            "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vmap/maplayers/" + envSrvc["sId"] + "/opacity",
+            "data": oParams,
+            "scope": scope,
+            "success": function (response) {
+                // Erreur ?
+                if (response["data"]["status"] == 0) {
+                    var oOptions = {
+                        "className": "modal-danger",
+                        "message": response["data"]["errorMessage"]
+                    };
+                    scope["modalWindow"]("dialog", "ERROR_ADD_MAP_LAYERS_VMAP_MAP_MAP_LAYERS", oOptions);
+                } else {
+                    // Recharge la liste des calques associés à la carte.
+                    scope.$root["refreshGrid"](scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["grid"]["appScope"], envSrvc["oGridOptions"][envSrvc["sSelectedGridOptionsName"]]);
+                }
+            }
+        });
+    };
+
+    /**
+     * Init the openlayers field to bind the extent
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['initOLMapExtent'] = function () {
+        $log.info('initOLMapExtent');
+
+        setTimeout(function () {
+
+            var oMap = angular.element($('#vmap_map_map_extent')).scope()['oMap'].MapObject;
+
+            // Centre la composant ol sur la projection à utiliser
+            angular.element(vitisApp.appMainDrtv).scope()['updateOLMapExtent']();
+
+            // Re-calcule l'étendue lors de chaque mouvement de la carte
+            oMap.on('moveend', function () {
+                // Mise à jour uniquement si la dernière mise à jour manuelle c'est fait il y a plus de 200 ms
+                if (!goog.isDefAndNotNull(oMap.get('lastManualUpdate')) || Date.now() > oMap.get('lastManualUpdate') + 200) {
+                    angular.element(vitisApp.appMainDrtv).scope()['updateExtent']();
+                }
+            });
+
+            var oCrsSelecteorFormElement = document.querySelector("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] select[name='crs_id']");
+            oCrsSelecteorFormElement.addEventListener("change", function () {
+                angular.element(vitisApp.appMainDrtv).scope()['updateExtent']();
+            });
+
+        }, 1000);
+    };
+
+    /**
+     * updateExtent function.
+     * Mise à jour de l'étendue avec les données du champ openlayers.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['updateExtent'] = function () {
+        $log.info('updateExtent');
+
+        var aExtent = [];
+        var oMap = angular.element($('#vmap_map_map_extent')).scope()['oMap'].MapObject;
+        var aMapExtent = oMap.getView().calculateExtent(oMap.getSize());
+
+        // Reprojection de l'étendue
+        var mapProj = oMap.getView().getProjection().getCode();
+        var destinationProj = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['crs_id']['selectedOption']['value'];
+        var projectedExtent = ol.proj.transformExtent(aMapExtent, mapProj, destinationProj);
+        projectedExtent.forEach(function (coord) {
+            aExtent.push(coord.toPrecision(10));
+        });
+
+        // Met à jour l'étendue dans le champ 'Etendue'.
+        envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['extent'] = aExtent.join('|');
+
+        var updateFormScope = angular.element($('[name=vmap_map_update_form]')).scope();
+        var insertFormScope = angular.element($('[name=vmap_map_insert_form]')).scope();
+
+        if (goog.isDefAndNotNull(updateFormScope)) {
+            updateFormScope.$apply();
+        }
+        if (goog.isDefAndNotNull(insertFormScope)) {
+            insertFormScope.$apply();
+        }
+    };
+
+    /**
+     * updateOLMapExtent function.
+     * Mise à jour de l'étendue du champ openLayers à partir des données du formulaire
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['updateOLMapExtent'] = function () {
+        $log.info('updateOLMapExtent');
+
+        if (!goog.isDefAndNotNull(envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['extent'])) {
+            angular.element(vitisApp.appMainDrtv).scope()["updateExtent"]();
+            return 0;
+        }
+
+        // Définition de l'élément de la carte openlayers
+        var oMapExtentDefinition = formSrvc['getFormElementDefinition']('map_extent', envSrvc['sFormDefinitionName'], envSrvc['oFormDefinition']);
+
+        // Etendue à utiliser par l'objet openLayers
+        var aMapExtent = oMapExtentDefinition['map_options']['center']['extent'];
+
+        // objet openLayers
+        var oMap = angular.element($('#vmap_map_map_extent')).scope()['oMap'].MapObject;
+
+        // Étendue du formulaire
+        var aFormExtent = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['extent'].split('|');
+
+        for (var i = 0; i < aFormExtent.length; i++) {
+            aFormExtent[i] = parseFloat(aFormExtent[i]);
+        }
+
+        // Projection du champ ol
+        var sMapProj = oMap.getView().getProjection().getCode();
+
+        // Projection utilisée dans le formulaire
+        var sFormProj = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['crs_id']['selectedOption']['value'];
+
+        // Étendue reprojetée
+        var projectedExtent = ol.proj.transformExtent(aFormExtent, sFormProj, sMapProj);
+
+        // Fixe l'étendue de la carte
+        oMap.getView().fit(projectedExtent, {
+            constrainResolution: false,
+            nearest: true
+        });
+
+        // Sauvegarde l'heure à laquelle c'est fait la dernière mise à jour manuelle
+        oMap.set('lastManualUpdate', Date.now());
+    };
+
+    /**
+     * showAddLayersToLayerModalWindow function.
+     * Affichage de la liste des calques depuis un getCapabilities() dans une fenêtre modale (onglet "calques").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['showAddLayersToLayerModalWindow'] = function () {
+        // Injection des services.
+        var $translate = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$translate"]);
+
+        $log.info("showAddLayersToLayerModalWindow");
+
+        var this_ = this;
+        var sParentFormDefinitionName = envSrvc["sFormDefinitionName"];
+        var scope = this.$new();
+
+        $translate(["BTN_ADD_LAYERS_VMAP_MAP_LAYER"]).then(function (oTranslations) {
+            var sServiceUrl = envSrvc["oFormValues"][sParentFormDefinitionName]["service_url"];
+            var sServiceLogin = envSrvc["oFormValues"][sParentFormDefinitionName]["service_login"];
+            var sServicePassword = envSrvc["oFormValues"][sParentFormDefinitionName]["service_password"];
+            var sVersion = envSrvc["oFormValues"][sParentFormDefinitionName]["service_type_version"];
+            sServiceUrl = sServiceUrl.replace("[token]", sha256(sessionSrvc["token"]));
+            sServiceUrl = sServiceUrl.replace("[ms_cgi_url]", propertiesSrvc["ms_cgi_url"]);
+            this_['showLayerModalWindow']({
+                'service_url': sServiceUrl,
+                'service_login': sServiceLogin,
+                'service_password': sServicePassword,
+                'service_version': sVersion,
+                'buttons': [{
+                        "label": oTranslations["BTN_ADD_LAYERS_VMAP_MAP_LAYER"],
+                        "name": scope["sSelectedObjectName"] + "_add_layer_btn",
+                        "event": "addLayersToLayer('" + sParentFormDefinitionName + "')"
+                    }]
+            });
+        });
+    };
+
+    /**
+     * showLayerModalWindow function.
+     * Affichage de la liste des calques depuis un getCapabilities() dans une fenêtre modale (onglet "calques").
+     * @param {object} opt_options
+     * @param {object} opt_options.service_url
+     * @param {object} opt_options.capabilities
+     * @param {object} opt_options.buttons
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['showLayerModalWindow'] = function (opt_options) {
+        // Injection des services.
+        var $compile = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$compile"]);
+        var $templateRequest = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$templateRequest"]);
+        var $translate = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$translate"]);
+        var uiGridConstants = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["uiGridConstants"]);
+
+        var sParentFormDefinitionName = envSrvc["sFormDefinitionName"];
+
+        // Set les options du service (login, password etc...)
+
+        opt_options = goog.isDefAndNotNull(opt_options) ? opt_options : {};
+        var sServiceUrl = goog.isDefAndNotNull(opt_options['service_url']) ? opt_options['service_url'] : envSrvc["oFormValues"][sParentFormDefinitionName]["service_url"];
+        var oCapabilities = goog.isDefAndNotNull(opt_options['capabilities']) ? opt_options['capabilities'] : null;
+        var appActions = goog.isDefAndNotNull(opt_options['buttons']) ? opt_options['buttons'] : [];
+
+        //
+        $log.info("showLayerModalWindow");
+        var scope = this.$new();
+        // Sauve l'ancien onglet
+        var oSaveSelectedObject = modesSrvc["getObject"](envSrvc["oSelectedObject"]["name"], modesSrvc["getMode"](envSrvc["oSelectedMode"]["mode_id"]));
+        var sSaveMode = envSrvc["sMode"];
+        // Paramètres de l'onglet.
+        envSrvc["oSelectedObject"] = {
+            "actions": [],
+            "columns": [],
+            "mode_id": oSaveSelectedObject["mode_id"],
+            "name": oSaveSelectedObject["name"] + "_wms_layers",
+            "sections": "",
+            "template_name": ""
+        };
+        envSrvc["sMode"] = "search";
+        scope['sSelectedObjectName'] = envSrvc["oSelectedObject"]["name"];
+        scope["sFormDefinitionName"] = envSrvc["oSelectedObject"]["name"];
+        envSrvc["sFormDefinitionName"] = scope["sFormDefinitionName"];
+
+        // Paramétrage du module ui-grid
+        if (envSrvc["oSelectedObject"]["name"] === "vmap_admin_map_vmap_services_wms_layers") {
+            scope["gridOptions"] = {
+                "enableRowSelection": false,
+                "enableSelectAll": false,
+                "enableRowHeaderSelection": false,
+                "enableFullRowSelection": false,
+                "enablePagination": true,
+                "enablePaginationControls": false,
+                "useExternalPagination": true,
+                "paginationPageSize": propertiesSrvc["rows_per_page"],
+                "enableColumnMenus": false,
+                "enableColumnResizing": true,
+                //"enableColumnMoving": true,
+                "paginationPageSizes": [10, 20, 50, 100],
+                "appHeader": true,
+                "appHeaderTitleBar": true,
+                "appHeaderSearchForm": false,
+                "appHeaderOptionBar": false,
+                "appLoadGridData": false,
+                "appGridTitle": "TITLE_GRID_VMAP_MAP_LAYER_WMS_LAYERS",
+                "appResizeGrid": true,
+                "appFooter": false,
+                "appShowPagination": false,
+                "appActions": []
+            };
+        } else {
+            scope["gridOptions"] = {
+                "enableRowSelection": true,
+                "enableSelectAll": true,
+                //"enableRowHeaderSelection": true,
+                //"enableFullRowSelection": true,
+                "enablePagination": true,
+                "enablePaginationControls": false,
+                "useExternalPagination": false,
+                "paginationPageSize": propertiesSrvc["rows_per_page"],
+                "enableColumnMenus": false,
+                "enableColumnResizing": true,
+                //"enableColumnMoving": true,
+                "paginationPageSizes": [10, 20, 50, 100],
+                "appHeader": true,
+                "appHeaderTitleBar": true,
+                "appHeaderSearchForm": false,
+                "appHeaderOptionBar": false,
+                "appLoadGridData": false,
+                "appGridTitle": "TITLE_GRID_VMAP_MAP_LAYER_WMS_LAYERS",
+                "appResizeGrid": true,
+                "appFooter": true,
+                "appShowPagination": true,
+                "appActions": [],
+                "appEnableCsvExport": false
+            };
+        }
+
+        // Id de traduction des libellés des colonnes de la liste.
+        var aTranslationsId = [
+            "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS",
+            "FORM_CRS_VMAP_MAP_LAYER_WMS_LAYERS",
+            "FORM_DESCRIPTION_VMAP_MAP_LAYER_WMS_LAYERS"
+        ];
+
+        // Définition des colonnes de la liste.
+        $translate(aTranslationsId).then(function (aTranslations) {
+            scope["gridOptions"]["columnDefs"] = [
+                {"name": aTranslations["FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS"], "displayName": aTranslations["FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS"], "field": "name", "width": 250, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_name", "sort": {"direction": uiGridConstants["ASC"], "ignoreSort": true, "priority": 0}},
+                {"name": aTranslations["FORM_DESCRIPTION_VMAP_MAP_LAYER_WMS_LAYERS"], "displayName": aTranslations["FORM_DESCRIPTION_VMAP_MAP_LAYER_WMS_LAYERS"], "field": "description", "width": 350, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_crs_list"},
+                {"name": 'Style', "displayName": 'Style', "field": "style", "width": 180, "enableSorting": false, "type": "object", "enableColumnMoving": false, "enableColumnResizing": false, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_style", "cellTemplate": '<div data-app-style-list-column></div>'},
+                {"name": aTranslations["FORM_CRS_VMAP_MAP_LAYER_WMS_LAYERS"], "displayName": aTranslations["FORM_CRS_VMAP_MAP_LAYER_WMS_LAYERS"], "field": "crs_list", "width": 180, "enableSorting": true, "type": "string", "enableColumnMoving": true, "enableColumnResizing": true, "headerCellClass": "vmap_map_layers_" + envSrvc["oSelectedObject"]["name"] + "_crs_list", "cellTemplate": '<div data-app-crs-list-description-column="{{row.entity[col.field]}}"></div>'},
+                {"name": 'oLayer', "visible": false}
+            ];
+        });
+
+        // Boutons de la liste.
+        $translate(["BTN_ADD_VMAP_MAP_MAP_LAYERS"]).then(function (oTranslations) {
+            scope["gridOptions"]["appActions"] = appActions;
+        });
+
+        var fillModal = function (oCapabilities) {
+
+            if (!goog.isDefAndNotNull(oCapabilities)) {
+                return null;
+            }
+            if (!goog.isDefAndNotNull(oCapabilities['json'])) {
+                return null;
+            }
+            if (!goog.isDefAndNotNull(oCapabilities['xml'])) {
+                return null;
+            }
+
+            var aGridData = [];
+            var aLayers = [];
+            /**
+             * Browse all the <layer> tags to fill aLayers
+             * @param {object} layer node
+             */
+            var searchLayers = function (layer) {
+                if (layer['Layer'] === undefined)
+                    aLayers.push(layer);
+                else
+                    for (var i = 0; i < layer['Layer'].length; i++) {
+                        searchLayers(layer['Layer'][i]);
+                    }
+            };
+
+            if (typeof (oCapabilities) != "undefined") {
+                // Liste des calques.
+                var aSelectedLayers = [];
+                var sSelectedLayers = envSrvc["oFormValues"][sParentFormDefinitionName]["layer_list"];
+                if (sSelectedLayers != null)
+                    aSelectedLayers = sSelectedLayers.split(",");
+
+                searchLayers(oCapabilities["json"]['Capability']['Layer']);
+                for (var i = 0; i < aLayers.length; i++) {
+                    // Exclusion des calques déja associés à la carte.
+                    if (aSelectedLayers.indexOf(aLayers[i]["Name"]) == -1) {
+                        aGridData.push({
+                            "name": aLayers[i]["Name"],
+                            "description": aLayers[i]["Title"],
+                            "style": aLayers[i]["Style"],
+                            "crs_list": goog.isDefAndNotNull(aLayers[i]["CRS"]) ? aLayers[i]["CRS"].join(",") : [],
+                            "oLayer": aLayers[i]
+                        });
+                    }
+                }
+            }
+
+            // Réordonne les couches à afficher par nom
+            aGridData.sort(function (a, b) {
+                return a["name"].localeCompare(b["name"]);
+            });
+            // Mise à jour de la liste ui-grid.
+            scope["gridOptions"]["data"] = aGridData;
+            scope["gridOptions"]["totalItems"] = aGridData.length;
+
+            // Affichage de la fenêtre modale.
+            var sContainerId = "container_" + envSrvc["oSelectedObject"]["name"] + "_wms_layers";
+            var oOptions = {
+                "className": "dialog-modal-window dialog-modal-window-workspace-list dialog-modal-window-wms_layers",
+                "message": '<div id="' + sContainerId + '" class="col-xs-12"></div>'
+            };
+            scope["modalWindow"]("dialog", null, oOptions).then(function (oDialog) {
+                // Attend la fin de l'affichage de la fenêtre modale.
+                $(oDialog).on('shown.bs.modal', function (e) {
+                    //
+                    var oModalContainer = document.querySelector(".dialog-modal-window-wms_layers > .modal-dialog");
+                    oModalContainer.className = oModalContainer.className + " modal-l";
+
+                    // Compile le template
+                    var sTemplateUrl = 'modules/vmap/template/vitis/serviceLayers.html';
+                    $templateRequest(sTemplateUrl).then(function (sTemplate) {
+                        $compile($("#" + sContainerId).html(sTemplate).contents())(scope);
+                        var oServiceLayersScope = angular.element($("#" + sContainerId)).scope();
+
+                        // Liste
+                        var sTemplateUrl = 'templates/workspaceListTpl.html';
+                        $templateRequest(sTemplateUrl).then(function (sTemplate) {
+                            $compile($("#" + sContainerId).find("#service_layers_layers_list").html(sTemplate).contents())(scope);
+                        });
+
+                        // XML
+                        if (goog.isDefAndNotNull(oServiceLayersScope)) {
+                            oServiceLayersScope.$applyAsync(function () {
+                                oServiceLayersScope['xml'] = oCapabilities['xml'];
+                                oServiceLayersScope['codemirror_options'] = {
+                                    'lineWrapping': true,
+                                    'lineNumbers': true,
+                                    'readOnly': 'nocursor',
+                                    'mode': 'xml'
+                                };
+                            });
+                            $("#" + sContainerId).find("#service_layers_capabilities_codemirror").find('.CodeMirror').css('height', '100%');
+                        }
+
+                        // OpenLayers
+                        var bMapLoaded = false;
+                        oServiceLayersScope['showOlMap'] = function () {
+                            if (!bMapLoaded) {
+                                ajaxRequest({
+                                    "method": "GET",
+                                    "url": "modules/vmap/forms/vmap_admin_map/vmap_admin_map_vmap_layers_openlayers_test.json",
+                                    "scope": scope,
+                                    "success": function (response) {
+                                        bMapLoaded = true;
+
+                                        var oFormDefinition = response["data"];
+                                        var sFormDefinitionName = 'update';
+                                        var oFormScope = angular.element($("#" + sContainerId).find('#service_layers_layers_ol_formreader').children()).scope();
+                                        var oMap = oFormDefinition['update']['rows'][0]['fields'][0];
+
+                                        var aProjections = [{
+                                                'extent': [-1901744.2199433097, 4779520.942381757, 2501744.2199433097, 7220479.057618243],
+                                                'projection': 'EPSG:3857'
+                                            }, {
+                                                'extent': [-2648.2345550218597, 6231825.554877603, 7024177.333740164, 7024177.333740164],
+                                                'projection': 'EPSG:2154'
+                                            }, {
+                                                'extent': [-4.6307373046875, 42.802734375, 51.0205078125, 51.0205078125],
+                                                'projection': 'EPSG:4326'
+                                            }];
+                                        var sUsedProjectionIndex = 0;
+
+                                        for (var i = 0; i < aProjections.length; i++) {
+                                            var bIsAllowedProj = true;
+                                            for (var ii = 0; ii < aLayers.length; ii++) {
+                                                var aCrs = goog.isArray(aLayers[ii]['CRS']) ? aLayers[ii]['CRS'] : goog.isArray(aLayers[ii]['SRS']) ? aLayers[ii]['CRS'] : [];
+                                                if (aCrs.indexOf(aProjections[i]['projection']) === -1) {
+                                                    bIsAllowedProj = false;
+                                                }
+                                            }
+                                            if (bIsAllowedProj) {
+                                                sUsedProjectionIndex = angular.copy(i);
+                                                break;
+                                            }
+                                        }
+
+                                        oMap['map_options']['proj'] = aProjections[sUsedProjectionIndex]['projection'];
+                                        oMap['map_options']['center'] = {'extent': aProjections[sUsedProjectionIndex]['extent']};
+                                        oMap['map_options']['tree']['children'][0]['view'] = aProjections[sUsedProjectionIndex];
+
+                                        var oChildrenService = {
+                                            'name': 'Service WMS',
+                                            'children': []
+                                        };
+                                        for (var i = 0; i < aLayers.length; i++) {
+                                            var sStyle = '';
+                                            for (var ii = 0; ii < aGridData.length; ii++) {
+                                                if (aGridData[ii]['name'] === aLayers[i]['Name']) {
+                                                    if (goog.isDefAndNotNull(aGridData[ii]['style_selected'])) {
+                                                        if (goog.isDefAndNotNull(aGridData[ii]['style_selected']['Name'])) {
+                                                            sStyle = aGridData[ii]['style_selected']['Name'];
+                                                        }
+                                                    }
+                                                }
+                                            }
+
+                                            // Définition de la couche.
+                                            var oChildrenLayer = {
+                                                'name': aLayers[i]['Name'],
+                                                'layerType': 'imagewms',
+                                                'visible': false,
+                                                //'legend': 'true',
+                                                'select': true,
+                                                'url': sServiceUrl,
+                                                'params': {
+                                                    'LAYERS': aLayers[i]['Name'],
+                                                    'VERSION': '1.3.0',
+                                                    'STYLES': sStyle,
+                                                    'TIMESTAMP': new Date().getTime()
+                                                },
+                                                'service_options': envSrvc["oFormValues"][sParentFormDefinitionName]['service_options'],
+                                                'service_login': envSrvc["oFormValues"][sParentFormDefinitionName]['service_login'],
+                                                'service_password': envSrvc["oFormValues"][sParentFormDefinitionName]['service_password'],
+                                                'index': i + 1
+                                            };
+                                            oChildrenService['children'].push(oChildrenLayer);
+                                        }
+                                        // Ajout du service
+                                        oMap['map_options']['tree']['children'].push(oChildrenService);
+
+                                        oMap['style']['height'] = $('#' + sContainerId).find('#service_layers_layers_ol').height() + 'px';
+
+                                        oFormScope['initOL3TestService'] = function () {
+                                            setTimeout(function () {
+                                                var oMapScope = angular.element($("#" + sContainerId).find('#service_layers_layers_ol_formreader').find('#layer_test_map')).scope();
+
+                                                // Affiche le layertree par défaut
+                                                oMapScope.$applyAsync(function () {
+                                                    oMapScope['oMap']['bLayersTreeOpen'] = true;
+                                                });
+
+                                                // Change le style de la couche sur OL3 quand on change de style dans la liste
+                                                scope.$root.$on('layerStyleChanged', function (event, row) {
+                                                    var aLayers = oMapScope['oMap']['aTree'][1]['layers'];
+                                                    for (var i = 0; i < aLayers.length; i++) {
+                                                        if (aLayers[i]['name'] === row['name']) {
+                                                            aLayers[i]['params']['STYLES'] = row['style_selected']['Name'];
+                                                            var oParams = aLayers[i]['olLayer'].getSource().getParams();
+                                                            oParams['STYLES'] = row['style_selected']['Name'];
+                                                            aLayers[i]['olLayer'].getSource().updateParams(oParams);
+                                                        }
+                                                    }
+                                                });
+                                            });
+                                        };
+                                        oFormDefinition['update']['initEvent'] = 'initOL3TestService()';
+
+                                        oFormScope['ctrl']['setDefinitionName'](sFormDefinitionName);
+                                        oFormScope['ctrl']['setFormValues']({
+                                            'display': {},
+                                            'insert': {},
+                                            'update': {}
+                                        });
+
+                                        oFormScope['ctrl']['setFormDefinition'](oFormDefinition);
+                                        oFormScope['ctrl']['loadForm']();
+                                    }
+                                });
+                            }
+                        };
+                    });
+                });
+                // Attends la fermeture de la fenêtre modale.
+                $(oDialog).on('hide.bs.modal', function (e) {
+                    // Restaure l'ancien onglet sauvé.
+                    envSrvc["oSelectedObject"] = oSaveSelectedObject;
+                    envSrvc["sMode"] = sSaveMode;
+                    envSrvc["sFormDefinitionName"] = sParentFormDefinitionName;
+                    // Supprime le scope crée.
+                    scope.$destroy();
+                });
+            });
+        };
+
+        if (goog.isDefAndNotNull(oCapabilities)) {
+            fillModal(oCapabilities);
+        } else if (goog.isDefAndNotNull(sServiceUrl)) {
+            // Calques du service wms.
+            scope.$root['getCapabilities'](sServiceUrl, {
+                'version': opt_options['service_version'],
+                'service_login': opt_options['service_login'],
+                'service_password': opt_options['service_password']
+            }).then(function (oGetCapabilities) {
+                oCapabilities = oGetCapabilities;
+                if (goog.isDefAndNotNull(oCapabilities)) {
+                    if (goog.isDefAndNotNull(oCapabilities['xml']) && goog.isDefAndNotNull(oCapabilities['json'])) {
+                        fillModal(oGetCapabilities);
+                    }
+                } else {
+                    envSrvc["sFormDefinitionName"] = sParentFormDefinitionName;
+                }
+            });
+        }
+    };
+
+    /**
+     * getCapabilities function.
+     * .
+     * @param {string} sServiceUrl Url du service.
+     * @param {object} oOptions Paramètres optionnels.
+     * @return {object}
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['getCapabilities'] = function (sServiceUrl, oOptions) {
+        $log.info("getCapabilities");
+        var scope = this;
+        // Promise pour retourner les données du getCapabilities.
+        var deferred = $q.defer();
+        var promise = deferred.promise;
+        // Paramètres par défaut.
+        var oDefaultOptions = {
+            "showErrorMessage": true,
+            "version": "1.3.0"
+        };
+        var oHeaders = {
+            "charset": "charset=utf-8"
+        };
+        if (typeof (oOptions) == "undefined")
+            oOptions = oDefaultOptions;
+        else {
+            goog.object.extend(oDefaultOptions, oOptions);
+            oOptions = oDefaultOptions;
+        }
+        if (!goog.isDefAndNotNull(oOptions['version'])) {
+            oOptions['version'] = '1.3.0';
+        }
+        if (!goog.isDefAndNotNull(oOptions['showErrorMessage'])) {
+            oOptions['showErrorMessage'] = true;
+        }
+        if (goog.isDefAndNotNull(oOptions['service_login']) && goog.isDefAndNotNull(oOptions['service_password'])) {
+            if (oOptions['service_login'].length > 0 && oOptions['service_password'].length > 0) {
+                oHeaders['Authorization'] = "Basic " + btoa(oOptions['service_login'] + ":" + oOptions['service_password']);
+            }
+        }
+        // Création de l'url vers le service.
+        if (sServiceUrl.indexOf("?") === -1)
+            sServiceUrl += "?";
+        else
+            sServiceUrl += "&";
+        sServiceUrl += "service=WMS&version=" + oOptions['version'] + "&request=GetCapabilities&no_cache=" + new Date().getTime();
+
+        function rhtmlspecialchars(str) {
+            if (typeof (str) == "string") {
+                str = str.replace(/&gt;/ig, ">");
+                str = str.replace(/&lt;/ig, "<");
+                str = str.replace(/&#039;/g, "'");
+                str = str.replace(/&quot;/ig, '"');
+                str = str.replace(/&amp;/ig, '&'); /* must do &amp; last */
+            }
+            return str;
+        }
+
+        var runRequest = function (sServiceUrl) {
+            ajaxRequest({
+                "method": "GET",
+                "url": propertiesSrvc['proxy_url'],
+                "params": {"url": sServiceUrl},
+                'headers': oHeaders,
+                "scope": scope,
+                "responseType": "text",
+                "success": function (response) {
+                    var oGetCapabilities;
+                    // Si aucun résultat renvoyé : erreur.
+                    if (response["data"] == "") {
+                        if (oOptions["showErrorMessage"]) {
+                            var oWindowOptions = {
+                                "className": "modal-danger",
+                                "message": "ERROR_CONTENT_NO_DATA_VMAP_MAP_LAYER_WMS_LAYERS"
+                            };
+                            scope["modalWindow"]("dialog", "ERROR_TITLE_GET_CAPABILITIES_VMAP_MAP_LAYER_WMS_LAYERS", oWindowOptions);
+                        }
+                    } else {
+                        // Sauve le résultat du GetCapabilities
+                        oGetCapabilities = {
+                            "xml": rhtmlspecialchars(response["data"])
+                        };
+
+                        // Vérification du résultat.
+                        var parser = new DOMParser();
+                        var xmlDoc = parser.parseFromString(rhtmlspecialchars(response["data"]), "text/xml");
+                        if (xmlDoc.querySelector("Service") === null) {
+                            oGetCapabilities = null;
+                            if (response["data"]['status'] == 0) {
+                                if (goog.isDefAndNotNull(response["data"]['sMessage'])) {
+                                    var sErrorMessage = '<a href="' + sServiceUrl + '" target="_blank">' + sServiceUrl + '</a><br><br>';
+                                    sErrorMessage += response["data"]['sMessage'];
+                                }
+                            }
+                            if (!goog.isDefAndNotNull(sErrorMessage)) {
+                                if (goog.isDefAndNotNull(xmlDoc.querySelector("BODY"))) {
+                                    if (goog.isDefAndNotNull(xmlDoc.querySelector("BODY").textContent)) {
+                                        var sErrorMessage = xmlDoc.querySelector("BODY").textContent;
+                                    } else {
+                                        var sErrorMessage = $(xmlDoc).find('body').html();
+                                    }
+                                } else {
+                                    var sErrorMessage = $(xmlDoc).find('body').html();
+                                }
+                            }
+
+                            // Affiche l'erreur.
+                            if (oOptions["showErrorMessage"]) {
+                                var oWindowOptions = {
+                                    "className": "modal-danger",
+                                    "message": sErrorMessage
+                                };
+                                scope["modalWindow"]("dialog", "ERROR_TITLE_GET_CAPABILITIES_VMAP_MAP_LAYER_WMS_LAYERS", oWindowOptions);
+                            }
+                        } else {
+                            // Parse le xml retourné par le getCapabilities du service.
+                            var oParser = new ol.format.WMSCapabilities();
+                            oGetCapabilities["json"] = oParser.read(rhtmlspecialchars(response["data"]));
+                        }
+                    }
+                    // Retourne les données du getCapabilities.
+                    deferred.resolve(oGetCapabilities);
+                },
+                "error": function (response) {
+                    // Certificat ssl invalide.
+                    if (propertiesSrvc['proxy_check_ssl'] === true) {
+                        if (oOptions["showErrorMessage"]) {
+                            var oWindowOptions = {
+                                "className": "modal-danger",
+                                "message": "ERROR_CONTENT_SSL_CERTIFICATE_VMAP_MAP_LAYER_WMS_LAYERS"
+                            };
+                            scope["modalWindow"]("dialog", "ERROR_TITLE_GET_CAPABILITIES_VMAP_MAP_LAYER_WMS_LAYERS", oWindowOptions);
+                        }
+                    }
+                }
+            });
+        };
+
+        // Couche privée
+        if (new RegExp(/\[token\]/).test(sServiceUrl)) {
+
+            // remplace la token au cas où c'est un flux privé
+            sServiceUrl = sServiceUrl.replace(/\[token\]/, sha256(sessionSrvc["token"]));
+            ajaxRequest({
+                "method": "GET",
+                "url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/vm4ms/wmsservices/private/MapFile",
+                "params": {
+                    'creation': true,
+                    'type': 'prod'
+                },
+                "scope": scope,
+                "success": function (response) {
+                    runRequest(sServiceUrl);
+                }
+            });
+
+        } else {
+            runRequest(sServiceUrl);
+        }
+
+
+        //
+        return promise;
+    };
+
+    /**
+     * addLayersToLayer function.
+     * Association de calques sélectionnés à une calque dans une liste ui-grid (onglet "calques").
+     * @param {string} sParentFormDefinitionName Nom du formulaire contenant la liste ui-grid à mettre à jour.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['addLayersToLayer'] = function (sParentFormDefinitionName) {
+        $log.info("addLayersToLayer");
+        var scope = this;
+        var oParentGridOptions = angular.element("form[name='" + envSrvc["oFormDefinition"][sParentFormDefinitionName]["name"] + "'] .ui-grid-form-field-data").scope().$parent["gridOptions"];
+        // Liste des calques sélectionnés.
+        var aSelectedRows = scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var i = 0;
+            // Calques déja associés.
+            var aLayersName = envSrvc["oFormValues"][sParentFormDefinitionName]["layer_list"];
+            if (typeof (aLayersName) == "string")
+                aLayersName = aLayersName.split(",");
+            else
+                aLayersName = [];
+
+            // Options des couches
+            var oLayersOptions = envSrvc["oFormValues"][sParentFormDefinitionName]["layer_options"];
+            if (typeof (oLayersOptions) === "string") {
+                oLayersOptions = JSON.parse(oLayersOptions);
+            } else if (typeof (oLayersOptions) !== "object") {
+                oLayersOptions = {};
+            } else if (!goog.isDefAndNotNull(oLayersOptions)) {
+                oLayersOptions = {};
+            }
+            var oLayersStyles = {};
+            if (goog.isDefAndNotNull(oLayersOptions)) {
+                if (goog.isDefAndNotNull(oLayersOptions['layer_style'])) {
+                    oLayersStyles = oLayersOptions['layer_style'];
+                }
+            }
+
+            // Calques sélectionnée à concaténer.
+            for (var i = aSelectedRows.length - 1; i >= 0; i--) {
+                delete aSelectedRows[i]["$$hashKey"];
+                if (aLayersName.indexOf(aSelectedRows[i]["name"]) === -1) {
+
+                    // Ajoute la couche
+                    if (goog.isDefAndNotNull(aSelectedRows[i]["name"])) {
+                        aLayersName.unshift(aSelectedRows[i]["name"]);
+                    }
+
+                    // Ajoute son style
+                    oLayersStyles[aSelectedRows[i]["name"]] = aSelectedRows[i]["style_selected"];
+
+                } else {
+                    $.notify('Calque déjà présent: ' + aSelectedRows[i]["name"], 'warning');
+                    aSelectedRows.splice(i, 1);
+                }
+            }
+
+            aLayersName = scope['cleanLayersArray'](aLayersName);
+
+            oLayersOptions['layer_style'] = oLayersStyles;
+            // Mise à jour de la liste ui-grid (formulaire parent).
+            oParentGridOptions["data"] = oParentGridOptions["data"].concat(aSelectedRows);
+            oParentGridOptions["totalItems"] = oParentGridOptions["data"].length;
+            // Sauve le champ "layer_list" (liste des calques sélectionnés)
+            envSrvc["oFormValues"][sParentFormDefinitionName]["layer_list"] = aLayersName.join(",");
+            envSrvc["oFormValues"][sParentFormDefinitionName]["layer_options"] = JSON.stringify(oLayersOptions);
+            // Supprime les lignes sélectionnées.
+            var aData = [];
+            scope["gridOptions"]["data"].forEach(function (oRowData) {
+                if (aSelectedRows.indexOf(oRowData) == -1)
+                    aData.push(oRowData);
+            });
+            scope.$root["gridApi"][envSrvc["sSelectedGridOptionsName"]]["selection"]["clearSelectedRows"]();
+            scope["gridOptions"]["data"] = aData;
+        }
+        scope.$root.$broadcast('addLayersToLayer');
+    };
+
+    /**
+     * Clean the layers array
+     * @param {array} aLayers
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['cleanLayersArray'] = function (aLayers) {
+        // Supprime les layers vides
+        for (var i = aLayers.length - 1; i >= 0; i--) {
+            if (!goog.isString(aLayers[i])) {
+                aLayers.splice(i, 1);
+                continue;
+            }
+            if (aLayers[i].trim().length === 0) {
+                aLayers.splice(i, 1);
+                continue;
+            }
+        }
+
+        return aLayers;
+    };
+
+    /**
+     * updateLayerLayersSorting function.
+     * Change l'ordre des calques d'un calque.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['updateLayerLayersSorting'] = function () {
+        $log.info("updateLayerLayersSorting");
+
+        var sParentFormDefinitionName = envSrvc["sFormDefinitionName"];
+
+        if (!goog.isDefAndNotNull(envSrvc["oFormValues"][sParentFormDefinitionName])) {
+            return 0;
+        }
+
+        var oGridOptions = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] .ui-grid-form-field-data").scope().$parent["gridOptions"];
+        var aGridData = oGridOptions["data"];
+        if (aGridData.length > 0) {
+            var aLayersName = [];
+            for (var i = aGridData.length - 1; i >= 0; i--) {
+                if (goog.isDefAndNotNull(aGridData[i]['name'])) {
+                    aLayersName.push(aGridData[i]['name']);
+                }
+            }
+
+            aLayersName = this['cleanLayersArray'](aLayersName);
+
+            // Sauve le champ "layer_list" (liste des calques sélectionnés)
+            envSrvc["oFormValues"][sParentFormDefinitionName]["layer_list"] = aLayersName.join(",");
+        }
+    };
+
+    /**
+     * removeLayersOfLayer function.
+     * Supprime les calques sélectionnés (celles associées à la calque) dans la liste ui-grid (onglet "calques").
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['removeLayersOfLayer'] = function () {
+        $log.info("removeLayersOfLayer");
+        var oGridOptions = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"] + "'] .ui-grid-form-field-data").scope().$parent["gridOptions"];
+
+        // Options des couches
+        var oLayersOptions = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["layer_options"];
+        if (typeof (oLayersOptions) === "string") {
+            oLayersOptions = JSON.parse(oLayersOptions);
+        } else if (typeof (oLayersOptions) !== "object") {
+            oLayersOptions = {};
+        } else {
+            oLayersOptions = {};
+        }
+        var oLayersStyles = {};
+        if (goog.isDefAndNotNull(oLayersOptions)) {
+            if (goog.isDefAndNotNull(oLayersOptions['layer_style'])) {
+                oLayersStyles = oLayersOptions['layer_style'];
+            }
+        }
+
+        // Liste des calques sélectionnés.
+        var aSelectedRows = oGridOptions["gridApi"]["selection"]["getSelectedRows"]();
+        if (aSelectedRows.length > 0) {
+            var aData = [];
+            var aLayersName = [];
+            oGridOptions["data"].forEach(function (oRowData) {
+                if (aSelectedRows.indexOf(oRowData) === -1) {
+                    aData.push(oRowData);
+                    aLayersName.unshift(oRowData["name"]);
+                } else {
+                    if (goog.isDefAndNotNull(oLayersStyles[oRowData["name"]])) {
+                        delete oLayersStyles[oRowData["name"]];
+                    }
+                }
+            });
+            oLayersOptions['layer_style'] = oLayersStyles;
+
+            aLayersName = this['cleanLayersArray'](aLayersName);
+
+            // Sauve le champ "layer_list" (liste des calques sélectionnés)
+            envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["layer_list"] = aLayersName.join(",");
+            envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["layer_options"] = JSON.stringify(oLayersOptions);
+            // Mise à jour de la liste ui-grid.
+            oGridOptions["gridApi"]["selection"]["clearSelectedRows"]();
+            oGridOptions["data"] = aData;
+        }
+    };
+
+    /**
+     * loadVmapConfig function.
+     * Chargement de la section "Configuration vMap" dans l'onglet "Configuration".
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['loadVmapConfig'] = function () {
+        // Injection des services.
+        var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]);
+        var propertiesSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["propertiesSrvc"]);
+        //
+        $log.info("loadVmapConfig");
+        // Paramètres des properties dans les valeurs du formulaire de config de vMap.
+        angular.element(vitisApp.appMainDrtv).scope()["setPropertiesFormValues"](["vmap", "popup", "print", "selection", "controls", "snapping"]);
+        // Surcharge l'url du formulaire des properties de vMap.
+        var scope = this;
+        var sTable = envSrvc["oSelectedObject"]["name"];
+        scope["oFormRequestParams"] = {
+            "sUrl": "modules/vmap/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json"
+        };
+        //
+        //envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["vmap"] = propertiesSrvc["vmap"];
+    };
+
+    /**
+     * Load the studio with the apropriate params
+     * @param {string} type business_object/layer_filter
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['loadStudioVmap'] = function (type) {
+        // Injection des services.
+        var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]);
+        var propertiesSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["propertiesSrvc"]);
+
+        //
+        $log.info("loadStudioVmap");
+
+        var aAvaliableItems = ["title", "subtitle", "label", "checkbox", "radio", "textarea", "select", "list", "double_select", "date", "datetime", "tinymce", "codemirror", "hidden", "text", "password", "email", "url", "integer", "float", "button", "color_picker", "slider", "hr", "map_osm", "map_bing", "map_vmap", "imageurl", "image_wsdata", "linkurl", "file_wsdata", "bo_grid", "section_grid"];
+
+        if (type === 'business_object') {
+
+            /**
+             * config.avaliable_elems {array} Type d'éléments disponibles
+             * config.avaliable_form_types {array|undefined} Types de formulaire (update, insert etcc..) dispo. Si avaliable_form_types est null, alors l'application utilisera tous les types disponibles du formulaire
+             * config.default_form_type {string} Type de formulaire selectionné par défaut
+             * config.get.api API à utiliser pour le GET/POST des formulaires
+             * config.get.ressource Ressource à utiliser pour le GET/PUT des formulaires sous la forme suivante: /[ressource]/{object_id}/form/{form}
+             * config.get.no_result_function fonction à lancer quand aucun formulaire n'est retourné
+             * @type object
+             */
+            var config = {
+                'avaliable_elems': aAvaliableItems,
+                'avaliable_form_types': ['display', 'search', 'update', 'insert'],
+                'default_form_type': 'update',
+                'get': {
+                    'api': 'vmap',
+                    'ressource': 'businessobjects',
+                    'no_result_function': 'suggestGenerateForm'
+                },
+                'reset_default_function': 'suggestColumnsToGenerateForm'
+            };
+        }
+        if (type === 'layer_filter') {
+            var config = {
+                'avaliable_elems': aAvaliableItems,
+                'avaliable_form_types': ['search'],
+                'default_form_type': 'search',
+                'get': {
+                    'api': 'vmap',
+                    'ressource': 'layers',
+                    'no_result_function': 'useEmptyForm'
+                }
+            };
+        }
+
+        oVFB["reset"]();
+        oVFB["setId"](envSrvc["sId"]);
+        oVFB["setApplication"]("vmap");
+        oVFB["setToken"](sessionSrvc["token"]);
+        oVFB["setContainer"]("#container_section_" + envSrvc["oSelectedObject"]["name"] + "_studio");
+        oVFB["setAppProperties"](propertiesSrvc);
+
+        if (goog.isDefAndNotNull(config)) {
+            oVFB.init(config);
+        }
+    };
+
+    /**
+     * Hide the section "Layer form" if the value is_filtered is not true
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['showStudioIfLayerIsFiltered'] = function () {
+        // Injection des services.
+        var envSrvc = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["envSrvc"]);
+        var sFormName = 'vmap_admin_map_vmap_layers_general_update_form';
+
+        $log.info("showStudioIfLayerIsFiltered");
+
+        setTimeout(function () {
+            if (goog.isDefAndNotNull(envSrvc['oFormValues'][sFormName])) {
+                var isFiltered = envSrvc['oFormValues'][sFormName]['is_filtered'];
+                if (!isFiltered) {
+                    $('#container_mode_vmap_admin_map').find('.section-form-edit-first').find('.section-form-section').hide();
+                } else {
+                    $('#container_mode_vmap_admin_map').find('.section-form-edit-first').find('.section-form-section').show();
+                }
+            }
+            if (envSrvc["sMode"] === "insert") {
+                $('#container_mode_vmap_admin_map').find('.section-form-edit-first').find('.section-form-section-insert').hide();
+            }
+        }, 500);
+    };
+
+    /**
+     * Show the import vex modal
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['importVex'] = function () {
+        var $compile = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$compile"]);
+        var $scope = this;
+        var bHavePrivileges = false;
+
+        var aUserPrivileges = sessionStorage['privileges'].split(',');
+
+        if (goog.isArray(aUserPrivileges)) {
+            if (aUserPrivileges.indexOf('vitis_admin') !== -1 &&
+                    aUserPrivileges.indexOf('vmap_admin') !== -1 &&
+                    aUserPrivileges.indexOf('vm4ms_admin') !== -1) {
+                bHavePrivileges = true;
+            }
+        }
+
+        $translate(['CTRL_IMPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES', 'CTRL_IMPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION', 'CTRL_IMPORT_VEX_IMPORT_TITLE', 'CTRL_IMPORT_VEX_LOADING']).then(function (aTranslations) {
+            if (!bHavePrivileges) {
+                $scope["modalWindow"]("dialog", aTranslations['CTRL_IMPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES'], {
+                    "className": "modal-danger",
+                    "message": aTranslations['CTRL_IMPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION']
+                });
+                return 0;
+            }
+            var dialog = bootbox['dialog']({
+                size: 'large',
+                title: aTranslations['CTRL_IMPORT_VEX_IMPORT_TITLE'],
+                message: '<div app-import-vex id="import-vex">' + aTranslations['CTRL_IMPORT_VEX_LOADING'] + '</div>'
+            });
+            dialog['init'](function () {
+                setTimeout(function () {
+                    var template = dialog['find']('.bootbox-body');
+                    var content = $compile(template)($scope);
+                }, 1000);
+            });
+        });
+    };
+
+    /**
+     * Show the export vex modal
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['exportVex'] = function () {
+        var $compile = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$compile"]);
+        var $scope = this;
+        var bHavePrivileges = false;
+
+        var aUserPrivileges = sessionStorage['privileges'].split(',');
+
+        if (goog.isArray(aUserPrivileges)) {
+            if (aUserPrivileges.indexOf('vitis_admin') !== -1 &&
+                    aUserPrivileges.indexOf('vmap_admin') !== -1 &&
+                    aUserPrivileges.indexOf('vm4ms_admin') !== -1) {
+                bHavePrivileges = true;
+            }
+        }
+
+        $translate(['CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES', 'CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION', 'CTRL_EXPORT_VEX_EXPORT_TITLE', 'CTRL_EXPORT_VEX_LOADING']).then(function (aTranslations) {
+            if (!bHavePrivileges) {
+                $scope["modalWindow"]("dialog", aTranslations['CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES'], {
+                    "className": "modal-danger",
+                    "message": aTranslations['CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION']
+                });
+                return 0;
+            }
+            var dialog = bootbox['dialog']({
+                size: 'large',
+                title: aTranslations['CTRL_EXPORT_VEX_EXPORT_TITLE'],
+                message: '<div app-export-vex id="export-vex">' + aTranslations['CTRL_EXPORT_VEX_LOADING'] + '</div>'
+            });
+            dialog['init'](function () {
+                setTimeout(function () {
+                    var template = dialog['find']('.bootbox-body');
+                    var content = $compile(template)($scope);
+                }, 1000);
+            });
+        });
+    };
+
+    /**
+     * Check if the used schema is one of the unrecommended
+     */
+    angular.element(vitisApp.appMainDrtv).scope()['checkBoSchema'] = function () {
+        var $q = angular.element(vitisApp.appHtmlFormDrtv).injector().get(["$q"]);
+
+        $log.info("checkBoSchema");
+
+        var scope = this;
+        var deferred = $q.defer();
+        var sSchema = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['schema'];
+        var aUnrecommendedSchemas = ['s_vmap', 's_vitis', 's_vm4ms', 's_majic', 's_cadastre'];
+        var bIsUnrecommended = false;
+
+        for (var i = 0; i < aUnrecommendedSchemas.length; i++) {
+            if (sSchema === aUnrecommendedSchemas[i]) {
+                bIsUnrecommended = true;
+                $translate(['CREATE_BO_ON_UNRECOMMENDED_SCHEMA1', 'CREATE_BO_ON_UNRECOMMENDED_SCHEMA2', 'CREATE_BO_ON_UNRECOMMENDED_SCHEMA3']).then(function (aTranslations) {
+                    var oOptions = {
+                        "className": "modal-warning",
+                        "message": '<b>' + aTranslations['CREATE_BO_ON_UNRECOMMENDED_SCHEMA1'] + sSchema + aTranslations['CREATE_BO_ON_UNRECOMMENDED_SCHEMA2'] + '<br>' + aTranslations['CREATE_BO_ON_UNRECOMMENDED_SCHEMA3'] + '</b>',
+                        "callback": function (bResponse) {
+                            if (bResponse)
+                                deferred.resolve();
+                            else
+                                deferred.reject();
+                        }
+                    };
+                    scope['modalWindow']('confirm', '', oOptions);
+                });
+            }
+        }
+
+        if (!bIsUnrecommended) {
+            setTimeout(function () {
+                deferred.resolve();
+            });
+        }
+
+        return deferred.promise;
+    };
+
+    /**
+     * appBusinessObjectEventDescriptionColumn directive.
+     * Mise en forme de la colonne "description" dans la liste de l'onglet "Evènements" (objet métier).
+     * @param {service} $translate Translate service.
+     * @ngInject
+     **/
+    vitisApp.appBusinessObjectEventDescriptionColumnDrtv = function ($translate) {
+        return {
+            link: function (scope, element, attrs) {
+                // 1er affichage ou tri de la liste : maj de la mise en forme.
+                var clearObserver = attrs.$observe("appBusinessObjectEventDescriptionColumn", function (value) {
+                    // Si le champ est vide : supprime l'icône.
+                    if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
+                        element[0].className = "";
+                    else {
+                        // Classes css (ui-grid + spécifiques).
+                        element[0].className = "ui-grid-cell-contents info-icon";
+                        // Traduction du titre et du contenu.
+                        $translate(["FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT"]).then(function (translations) {
+                            // Création du "tooltip".
+                            $(element)["popover"]({
+                                "trigger": "hover",
+                                "container": "body",
+                                "title": function () {
+                                    return translations["FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT"];
+                                },
+                                "content": function () {
+                                    return scope["row"]["entity"][scope["col"]["field"]];
+                                },
+                                // Placement du tooltip à gauche ou à droite suivant la position horizontale de l'élément.
+                                "placement": function (oPopoverNode, oElementNode) {
+                                    return scope.$root["workspaceTooltipPlacement"](oElementNode);
+                                },
+                                "html": true
+                            });
+                        });
+                    }
+                });
+                // Attends la suppression du scope.
+                scope.$on("$destroy", function () {
+                    // Supprime le tooltip.
+                    $(element)["popover"]("destroy");
+                    // Supprime l'observateur.
+                    clearObserver();
+                });
+            }
+        }
+    };
+    vitisApp["compileProvider"].directive('appBusinessObjectEventDescriptionColumn', vitisApp.appBusinessObjectEventDescriptionColumnDrtv);
+
+    /**
+     * checkVmapLayerWmsLayers function.
+     * Vérification des couches WMS associées à un calque vMap.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()['checkVmapLayerWmsLayers'] = function () {
+        // Injection des services.
+        var $translate = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$translate"]);
+        //
+        $log.info("checkVmapLayerWmsLayers");
+        var scope = this;
+        var sServiceUrl = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_url"];
+        var sVersion = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["service_type_version"];
+        sServiceUrl = sServiceUrl.replace("[token]", sha256(sessionSrvc["token"]));
+        sServiceUrl = sServiceUrl.replace("[ms_cgi_url]", propertiesSrvc["ms_cgi_url"]);
+        // Calques du service wms.
+        scope.$root['getCapabilities'](sServiceUrl, {
+            'version': sVersion
+        }).then(function (oGetCapabilities) {
+            if (goog.isDefAndNotNull(oGetCapabilities)) {
+                if (goog.isDefAndNotNull(oGetCapabilities['xml']) && goog.isDefAndNotNull(oGetCapabilities['json'])) {
+                    var aLayers = [];
+                    /**
+                     * Browse all the <layer> tags to fill aLayers
+                     * @param {object} layer node
+                     */
+                    var searchLayers = function (layer) {
+                        if (layer['Layer'] === undefined)
+                            aLayers.push(layer["Name"]);
+                        else
+                            for (var i = 0; i < layer['Layer'].length; i++) {
+                                searchLayers(layer['Layer'][i]);
+                            }
+                    };
+
+                    if (typeof (oGetCapabilities) != "undefined") {
+                        // Liste des calques.
+                        var aSelectedLayers = [];
+                        var sSelectedLayers = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["layer_list"];
+                        if (sSelectedLayers != null)
+                            aSelectedLayers = sSelectedLayers.split(",");
+                        var aLayersNotFound = [];
+                        searchLayers(oGetCapabilities["json"]['Capability']['Layer']);
+                        for (var i = 0; i < aSelectedLayers.length; i++) {
+                            // Exclusion des calques déja associés à la carte.
+                            if (aLayers.indexOf(aSelectedLayers[i]) == -1) {
+                                aLayersNotFound.push(aSelectedLayers[i]);
+                            }
+                        }
+
+                        // Affichage du message de succés ou d'erreur.
+                        if (aLayersNotFound.length == 0) {
+                            $translate("FORM_BTN_CHECK_LAYERS_SUCCESSFUL_VMAP_MAP_LAYER").then(function (sTranslation) {
+                                $.notify(sTranslation, "success");
+                            });
+                        } else {
+                            $translate("FORM_BTN_CHECK_LAYERS_ERROR_MESSAGE_VMAP_MAP_LAYER").then(function (sTranslation) {
+                                var oOptions = {
+                                    "className": "modal-danger",
+                                    "message": sTranslation + "<br>- " + aLayersNotFound.join("<br>- "),
+                                    "html": true
+                                };
+                                scope.$root["modalWindow"]("dialog", "FORM_BTN_CHECK_LAYERS_ERROR_TITLE_VMAP_MAP_LAYER", oOptions);
+                            });
+                        }
+                    }
+                }
+            }
+        });
+    };
+
+    /**
+     * deleteVmapBusinessObject function.
+     * Suppression des objets métiers selectionnés.
+     **/
+    angular.element(vitisApp.appMainDrtv).scope()["deleteVmapBusinessObject"] = function () {
+        // Injection des services.
+        var $rootScope = angular.element(vitisApp.appWorkspaceListDrtv).injector().get(["$rootScope"]);
+        //
+        $log.info("deleteVmapBusinessObject");
+        $rootScope['DeleteSelection']({
+            "sMessage": "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT"
+        });
+    };
+});
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
new file mode 100644
index 0000000000000000000000000000000000000000..fc1484e29b1d7924daf36b156634486aca812d54
--- /dev/null
+++ b/module/lang/lang-en.json
@@ -0,0 +1,442 @@
+{
+    "TITLE_MODE_VMAP": "vMap",
+    "TEXT_MODE_VMAP": "Cartographic application",
+    "TITLE_MODE_VMAP_ADMIN_MAP": "Calques et Cartes",
+    "TEXT_MODE_VMAP_ADMIN_MAP": "Administration des cartes",
+    "TITLE_MODE_VMAP_ADMIN_MODULE": "Modules",
+    "TEXT_MODE_VMAP_ADMIN_MODULE": "Administration des modules",
+    "TITLE_MODE_VMAP_ADMIN_PRINT": "Print",
+    "TEXT_MODE_VMAP_ADMIN_PRINT": "Administration des impressions",
+    "": "",
+    "SECTION_UPDATE_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Map n°{{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Map",
+    "SECTION_DISPLAY_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Map n°{{sId}}",
+    "": "",
+    "SECTION_UPDATE_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Layer n°{{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Layer",
+    "SECTION_DISPLAY_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Layer n°{{sId}}",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP": "Description",
+    "FORM_TITLE_VMAP_MAP_MAP": "Map {{::name}}",
+    "FORM_MAP_ID_VMAP_MAP_MAP": "ID",
+    "FORM_NAME_VMAP_MAP_MAP": "Name",
+    "FORM_THEME_VMAP_MAP_MAP": "Theme",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP": "Coordinate system",
+    "FORM_DESCRIPTION_VMAP_MAP_MAP": "Description",
+    "FORM_EXTENT_VMAP_MAP_MAP": "Extent",
+    "FORM_CATALOG_INDEX_VMAP_MAP_MAP": "Order",
+    "FORM_THUMBNAIL_VMAP_MAP_MAP": "Thumbnail",
+    "FORM_THUMBNAIL_VMAP_MAP_MAP_TOOLTIP": "Recommended: 150px/90px jpg",
+    "FORM_GROUPS_VMAP_MAP_MAP": "Groups",
+    "FORM_AVAILABLE_GROUPS_VMAP_MAP_MAP": "Available groups",
+    "FORM_MAP_GROUPS_VMAP_MAP_MAP": "Groups linked to map",
+    "FORM_VISIBLE_VMAP_MAP_MAP_LAYERS": "Visible",
+    "TITLE_GRID_MAP_LAYERS_VMAP_MAP_MAP_LAYERS": "Layers linked to map",
+    "TITLE_GRID_AVAILABLE_LAYERS_VMAP_MAP_MAP_LAYERS": "Available layers",
+    "BTN_VISIBLE_VMAP_MAP_MAP_LAYERS": "Visible",
+    "BTN_INVISIBLE_VMAP_MAP_MAP_LAYERS": "Invisible",
+    "ERROR_MAP_LAYER_VISIBILITY_VMAP_MAP_MAP_LAYERS": "Error while setting the visibility of layers",
+    "BTN_ADD_LAYERS_VMAP_MAP_MAP_LAYERS": "Add layers",
+    "BTN_DELETE_LAYERS_VMAP_MAP_MAP_LAYERS": "Delete layers",
+    "BTN_ADD_VMAP_MAP_MAP_LAYERS": "Add layers",
+    "ERROR_ADD_MAP_LAYERS_VMAP_MAP_MAP_LAYERS": "Error while linking layers to map",
+    "ERROR_DELETE_MAP_LAYER_VMAP_MAP_MAP_LAYERS": "Error while deleting map layers",
+    "FORM_OPACITY_VMAP_MAP_MAP_LAYERS": "Opacity",
+    "ERROR_MAP_LAYER_OPACITY_VMAP_MAP_MAP_LAYERS": "Error while updating the opacity of the layer",
+    "FORM_UPDATE_EXTENT_VMAP_MAP_MAP": "Update",
+    "FORM_NAME_VMAP_MAP_MAP_LAYERS": "Name",
+    "FORM_SERVICE_VMAP_MAP_MAP_LAYERS": "Service",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP_LAYERS": "Coordinate system",
+    "FORM_THEME_VMAP_MAP_MAP_LAYERS": "Theme",
+    "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Calque sans caches",
+    "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Conseillé pour les données potentiellement modifiables",
+    "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Ajoute un formulaire de filtre au calque",
+    "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Une fois le formulaire validé intègre le résultat à la requête GetMap, une configuration supplémentaire est nécessaire au niveau de la couche Mapserver (voir documentation)",
+    "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Filtre également l'objet métier quand on exerce un filtre sur le calque",
+    "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Fonctionne uniquement pour des égalités et si tous les champs du formulaire correspondent à des colonnes de la table",
+    "": "",
+    "TITLE_GRID_THEMES_VMAP_MAP_MAP_THEMES": "Themes",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_SERVICE": "Description",
+    "FORM_TITLE_VMAP_MAP_SERVICE": "Service {{::name}}",
+    "FORM_SERVICE_ID_VMAP_MAP_SERVICE": "ID",
+    "FORM_NAME_VMAP_MAP_SERVICE": "Name",
+    "FORM_TYPE_VMAP_MAP_SERVICE": "Type",
+    "FORM_TYPE_VMAP_MAP_SERVICE_DESCRIPTION": "<b>tilewms</b>: Tiled WMS service <br><b>imagewms</b>: Signe image WMS service <br><b>bing</b>: Bing service <br><b>osm</b>: OpenStreetMap service",
+    "FORM_DESCRIPTION_VMAP_MAP_SERVICE": "Description",
+    "FORM_THUMBNAIL_VMAP_MAP_SERVICE": "Thumbnail",
+    "FORM_THUMBNAIL_VMAP_MAP_SERVICE_TOOLTIP": "Recommandé: 150px/90px jpg",
+    "FORM_URL_VMAP_MAP_SERVICE": "Link",
+    "FORM_KEY_VMAP_MAP_SERVICE": "Key",
+    "FORM_SERVICE_TYPE_VERSION_VMAP_MAP_SERVICE": "Protocol version",
+    "FORM_LANG_VMAP_MAP_SERVICE": "Language",
+    "FORM_IMAGERY_VMAP_MAP_SERVICE": "Imagery",
+    "FORM_SERVICE_TYPE_VERSION_TOOLTIP_VMAP_MAP_SERVICE": "x.x.x",
+    "FORM_BTN_CLONE_SERVICE_VMAP_MAP_SERVICE": "Clone",
+    "ERROR_SERVICE_DELETE_VMAP_MAP_SERVICE": "A service is linked to one or more layers",
+    "FORM_TYPE_VMAP_MAP_SERVICE": "Type",
+    "FORM_TEST_VMAP_MAP_SERVICE": "Test",
+    "FORM_LOGIN_VMAP_MAP_SERVICE": "Login (optional, visible)",
+    "FORM_PASSWORD_VMAP_MAP_SERVICE": "Password (optional, visible)",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER": "Description",
+    "FORM_TITLE_VMAP_MAP_LAYER": "Layer {{::name}}",
+    "COORDINATE_SYSTEM_TOOLTIP_TITLE_VMAP_MAP_LAYER": "Coordinate system",
+    "FORM_LAYER_ID_VMAP_MAP_LAYER": "ID",
+    "FORM_NAME_VMAP_MAP_LAYER": "Name",
+    "FORM_THEME_VMAP_MAP_LAYER": "Theme",
+    "FORM_DYNAMIC_VMAP_MAP_LAYER": "Dynamic layer (without caches)",
+    "FORM_FILTERED_VMAP_MAP_LAYER": "Calque filtrable (Mapserver)",
+    "FORM_BOFILTERED_VMAP_MAP_LAYER": "Filtre associé aux objets métiers",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_LAYER": "Coordinate system",
+    "FORM_SERVICE_VMAP_MAP_LAYER": "Service",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER": "Description",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER": "Business object",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_TO": "Layer business objects",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_FROM": "Avaliable business objects",
+    "FORM_LAYER_LIST_VMAP_MAP_LAYER": "Layers",
+    "FORM_CRS_LIST_VMAP_MAP_LAYER": "Coordinate systems",
+    "FORM_CRS_LIST_VMAP_MAP_LAYER_TOOLTIP": "Coordinate systems",
+    "FORM_AVAILABLE_CRS_LIST_VMAP_MAP_LAYER": "Available coordinate systems",
+    "FORM_LAYER_CRS_LIST_VMAP_MAP_LAYER": "Coordinate systems linked to the layer",
+    "FORM_BTN_ADD_CRS_LIST_VMAP_MAP_LAYER": "Add",
+    "FORM_BTN_ADD_LAYER_LIST_VMAP_MAP_LAYER": "Add layers",
+    "TITLE_GRID_LAYER_LAYERS_VMAP_MAP_LAYER": "Couches WMS associées au calque vMap",
+    "FORM_BTN_REMOVE_LAYER_LIST_VMAP_MAP_LAYER": "Delete layers",
+    "FORM_LAYER_VMAP_MAP_LAYER": "Layer",
+    "FORM_WMTS_LAYER_VMAP_MAP_LAYER": "Couche WMTS associée au calque vMap",
+    "FORM_MATRIX_VMAP_MAP_LAYER": "Matrix",
+    "FORM_STYLE_VMAP_MAP_LAYER": "Style",
+    "FORM_FORMAT_VMAP_MAP_LAYER": "Format",
+    "BTN_ADD_LAYERS_VMAP_MAP_LAYER": "Add layers",
+    "FORM_BTN_CHECK_LAYERS_VMAP_MAP_LAYER": "Check",
+    "FORM_BTN_CHECK_LAYERS_SUCCESSFUL_VMAP_MAP_LAYER": "Successful operation",
+    "FORM_BTN_CHECK_LAYERS_ERROR_TITLE_VMAP_MAP_LAYER": "Missing layers",
+    "FORM_BTN_CHECK_LAYERS_ERROR_MESSAGE_VMAP_MAP_LAYER": "The following layers are not present in the WMS service :",
+    "FORM_IS_QUERYABLE_GETFEATUREINFO_VMAP_MAP_LAYER": "Couche interrogeable par requête WMS GetFeatureInfo",
+    "": "",
+    "FORM_ID_USERS_GROUP_VMAP_GROUP": "ID",
+    "FORM_MAPS_USERS_GROUP_VMAP_GROUP": "Maps",
+    "FORM_MAPS_AVAILABLE_USERS_GROUP_VMAP_GROUP": "Available maps",
+    "FORM_GROUP_MAPS_USERS_GROUP_VMAP_GROUP": "Maps linked to group",
+    "FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP": "Print templates",
+    "FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_GROUP": "Available print templates",
+    "FORM_GROUP_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP": "Print templates linked to group",
+    "": "",
+    "FORM_TITLE_VMAP_MAP_LAYER_THEME": "Theme {{::name}}",
+    "FORM_MAPTHEME_ID_VMAP_MAP_LAYER_THEME": "ID",
+    "FORM_NAME_VMAP_MAP_LAYER_THEME": "Name",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER_THEME": "Description",
+    "BTN_ADD_LAYERS_VMAP_MAP_LAYER_THEME": "Add theme",
+    "BTN_DELETE_LAYERS_VMAP_MAP_LAYER_THEME": "Delete themes",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER_THEME": "Description",
+    "": "",
+    "FORM_TITLE_VMAP_MAP_MAP_THEME": "Theme {{::name}}",
+    "FORM_MAPTHEME_ID_VMAP_MAP_MAP_THEME": "ID",
+    "FORM_NAME_VMAP_MAP_MAP_THEME": "Name",
+    "FORM_DESCRIPTION_VMAP_MAP_MAP_THEME": "Description",
+    "BTN_ADD_LAYERS_VMAP_MAP_MAP_THEME": "Add theme",
+    "BTN_DELETE_LAYERS_VMAP_MAP_MAP_THEME": "Delete themes",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP_THEME": "Description",
+    "": "",
+    "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0": "Objet métier",
+    "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0_TOOLTIP": "Sans accents ni majuscules",
+    "FORM_TITLE_DEVELOPMENT_0": "Titre",
+    "FORM_FORMTITLE_DEVELOPMENT_0": "Titre des formulaires",
+    "FORM_SUMMARYTITLE_DEVELOPMENT_0": "Titre des infobulles",
+    "FORM_ID_FIELD_DEVELOPMENT_0": "Champ identifiant",
+    "FORM_ID_FIELD_DEVELOPMENT_0_TOOLTIP": "Champ identifiant de la table qui sera utilisée",
+    "FORM_DATABASE_DEVELOPMENT_0": "Base de données",
+    "FORM_SCHEMA_DEVELOPMENT_0": "Schema",
+    "FORM_TABLE_DEVELOPMENT_0": "Table",
+    "FORM_SQL_SUMMARY_DEVELOPMENT_0": "SQL Summary",
+    "FORM_SQL_SUMMARY_DEVELOPMENT_0_TOOLTIP": "Résultat à afficher dans les info-bulles et dans l'outil de localisation",
+    "FORM_SQL_LIST_DEVELOPMENT_0": "SQL List",
+    "FORM_SQL_LIST_DEVELOPMENT_0_TOOLTIP": "Résultat à afficher dans la liste des enregistrements",
+    "FORM_SQL_FORM_DEVELOPMENT_0": "SQL Form",
+    "FORM_SORTED_BY_DEVELOPMENT_0": "Sorted by",
+    "FORM_GEOM_COLUMN_DEVELOPMENT_0": "Colonne géométrie",
+    "FORM_LAST_UPDATE_TIME_DEVELOPMENT_0": "Dernière mise à jour",
+    "FORM_LAST_UPDATE_AUTHOR_DEVELOPMENT_0": "Auteur de la mise à jour",
+    "FORM_SEARCH_FIELD_0": "Search field",
+    "FORM_SEARCH_FIELD_0_TOOLTIP": "Colonne de la table sur laquelle doit être faite la recherche",
+    "FORM_RESULT_FIELD_0": "Search result field",
+    "FORM_RESULT_FIELD_0_TOOLTIP": "Champ résultant de SQL Summary à afficher dans la liste",
+    "FORM_SEARCH_USE_STRICT_0": "Strict search",
+    "FORM_SEARCH_USE_STRICT_1": "Left and right",
+    "FORM_SEARCH_USE_STRICT_2": "Only left",
+    "FORM_SEARCH_USE_STRICT_3": "Only right",
+    "FORM_SEARCH_USE_STRICT_4": "Neither left nor right",
+    "EDIT_FORM_SIZE": "Edit form size",
+    "DISPLAY_FORM_SIZE": "Display form size",
+    "ADD_FORM_SIZE": "Add form size",
+    "FORM_SIZE_1": "Standard",
+    "FORM_SIZE_2": "Large",
+    "FORM_SIZE_3": "Extra large",
+    "TITLE_MODE_VMAP_BUSINESS_OBJECT": "Développement",
+    "TEXT_MODE_VMAP_BUSINESS_OBJECT": "Développement de formulaires personnalisés",
+    "SECTION_UPDATE_TITLE_DEVELOPMENT_0": "{{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_BUSINESS_OBJECT_VMAP_BUSINESS_OBJECT": "Business Object",
+    "SECTION_DISPLAY_TITLE_VMAP_BUSINESS_OBJECT_VMAP_BUSINESS_OBJECT": "Business Object {{sId}}",
+    "FORM_EVENT_VMAP_BUSINESS_OBJECT": "Event",
+    "FORM_INDEX_VMAP_BUSINESS_OBJECT": "Order",
+    "FORM_BUFFER_VMAP_BUSINESS_OBJECT": "Buffer de sélection (en mm sur l'écran)",
+    "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Maximum edition scale",
+    "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Maximum edition scale",
+    "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Minimum edition scale",
+    "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Minimum edition scale",
+    "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT": "Delete the selected items and associations with layers?",
+    "": "",
+    "FORM_TITLE_VMAP_MODULE_MODULE": "Module {{::label}}",
+    "FORM_LABEL_VMAP_MODULE_MODULE": "Label",
+    "FORM_MODULE_ID_VMAP_MODULE_MODULE": "ID",
+    "FORM_DESCRIPTION_VMAP_MODULE_MODULE": "Description",
+    "FORM_ROLNAME_VMAP_MODULE_MODULE": "Privilege",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_TEMPLATE": "Template {{::name}}",
+    "FORM_PRINTTEMPLATE_ID_VMAP_PRINT_TEMPLATE": "ID",
+    "FORM_NAME_VMAP_PRINT_TEMPLATE": "Nom",
+    "FORM_FORMAT_VMAP_PRINT_TEMPLATE": "Print format",
+    "FORM_ORIENTATION_VMAP_PRINT_TEMPLATE": "Orientation",
+    "FORM_OUTPUT_FORMATS_VMAP_PRINT_TEMPLATE": "Output format",
+    "FORM_RESSOURCE_VMAP_PRINT_TEMPLATE": "Resource",
+    "FORM_BUSINESS_OBJECT_VMAP_PRINT_TEMPLATE": "Business object",
+    "FORM_DEFINITION_VMAP_PRINT_TEMPLATE": "Definition",
+    "FORM_SQL_VMAP_PRINT_TEMPLATE": "Sql",
+    "FORM_WEB_SERVICE_VMAP_PRINT_TEMPLATE": "Service web",
+    "FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Groups",
+    "FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Available groups",
+    "FORM_PRINT_TEMPLATES_LINKED_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Groups linked to template",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_STYLE": "Template {{::name}}",
+    "FORM_PRINTSTYLE_ID_VMAP_PRINT_STYLE": "ID",
+    "FORM_NAME_VMAP_PRINT_STYLE": "Nom",
+    "FORM_DEFINITION_VMAP_PRINT_STYLE": "Definition",
+    "FORM_USERS_VMAP_PRINT_STYLE": "Users",
+    "FORM_AVAILABLE_USERS_VMAP_PRINT_STYLE": "Available users",
+    "FORM_MAP_USERS_VMAP_PRINT_STYLE": "Users linked to style",
+    "": "",
+    "FORM_ID_USERS_USER_VMAP_USER": "ID",
+    "FORM_PRINT_STYLES_USERS_USER_VMAP_USER": "Print styles",
+    "FORM_PRINT_STYLES_AVAILABLE_USERS_USER_VMAP_USER": "Available print styles",
+    "FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER": "Print styles linked to user",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_PARAMETER": "Parameter {{::name}}",
+    "FORM_PRINTPARAMETER_ID_VMAP_PRINT_PARAMETER": "ID",
+    "FORM_NAME_VMAP_PRINT_PARAMETER": "Name",
+    "FORM_EDITABLE_VMAP_PRINT_PARAMETER": "Editable",
+    "FORM_EDITABLE_YES_VMAP_PRINT_PARAMETER": "Yes",
+    "FORM_EDITABLE_NO_VMAP_PRINT_PARAMETER": "No",
+    "FORM_EDITABLE_DEFAULT_VMAP_PRINT_PARAMETER": "Doesn't matter",
+    "FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER": "Template",
+    "FORM_LABEL_VMAP_PRINT_PARAMETER": "Label",
+    "FORM_PLACEHOLDER_VMAP_PRINT_PARAMETER": "Placeholder",
+    "FORM_DEFAULTVALUE_VMAP_PRINT_PARAMETER": "Default value",
+    "PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER": "Description",
+    "DEFAULTVALUE_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER": "Description",
+    "": "",
+    "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS": "Name",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER_WMS_LAYERS": "Description",
+    "FORM_CRS_VMAP_MAP_LAYER_WMS_LAYERS": "Coordinate Systems",
+    "TITLE_GRID_VMAP_MAP_LAYER_WMS_LAYERS": "Calques du service wms",
+    "ERROR_TITLE_GET_CAPABILITIES_VMAP_MAP_LAYER_WMS_LAYERS": "GetCapabilities query error",
+    "ERROR_CONTENT_NO_DATA_VMAP_MAP_LAYER_WMS_LAYERS": "The GetCapabilities request returned no result, please check the service URL.",
+    "FORM_WMS_SERVICE_NAME_VMAP_MAP_LAYER_WMS_LAYERS": "Service",
+    "FORM_WMS_SERVICE_URL_VMAP_MAP_LAYER_WMS_LAYERS": "Service url",
+    "ERROR_CONTENT_SSL_CERTIFICATE_VMAP_MAP_LAYER_WMS_LAYERS": "Please check your SSL certificate or disable the Check SSL certificate validity setting in Configuration mode.",
+    "": "",
+    "TITLE_PROPERTIES_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "General",
+    "FORM_FOP_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "FOP directory",
+    "FORM_PHANTOM_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "PhantomJS path (executable)",
+    "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Printserver alias",
+    "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Veremap API",
+    "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable tools",
+    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Active tools",
+    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attribution",
+    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mouse position",
+    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Current projection",
+    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Map Name",
+    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Numeric scale",
+    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Overview map",
+    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotate",
+    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Scale line",
+    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom slider",
+    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Refresh auto",
+    "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Display",
+    "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Tools",
+    "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Keep tiles loaded when autorefreshing",
+    "FORM_LAYERS_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Layers collapsed by default",
+    "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Yes",
+    "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "No",
+    "FORM_LAYERSTREE_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Layers tree window collapsed by default",
+    "FORM_LAYERSORDER_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Layers order window collapsed by default",
+    "FORM_LEGEND_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Legend window collapsed by default",
+    "FORM_TILES_WIDTH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "WMS tiles width (in px)",
+    "FORM_TILES_HEIGHT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "WMS tiles height (in px)",
+    "FORM_POPUP_STYLE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "CSS style of the popups",
+    "TITLE_PRINTING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Printing",
+    "FORM_PRINT_EQUALITY_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Timeout durant lequel l'égalitée entre les tuiles à charger et celles chargées doit être écoutée",
+    "FORM_PRINT_LOAD_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Délai d'attente si aucun calque n'est chargé",
+    "FORM_PRINT_PRINT_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Timeout before printing",
+    "FORM_PRINT_PRINT_TIMEOUT_FEATURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Délai d'attente avant le début de l'impression lorsqu'il y a zoom sur feature",
+    "TITLE_SELECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Selection",
+    "FORM_SELECTION_LIMIT_POPUP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Maximum number of windows",
+    "FORM_SELECTION_LIMIT_LIST_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Maximum number of selections in the list",
+    "FORM_ENABLE_GETFEATUREINFO_CONFIGURATION_VMAP_CONFIG": "Enable GetFeatureInfo selection",
+    "FORM_SELECTION_BUFFER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Buffer (en mm sur l'écran)",
+    "FORM_SELECTION_MAX_SCALE_BUFFER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Buffer maximum (en mètres sur le terrain)",
+    "TITLE_SNAPPING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Default snapping options",
+    "FORM_SNAPPING_DEFAUT_LIMIT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Manimum limit of points per object",
+    "FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Snapping tolerance (in pixels)",
+    "FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Default snapping type",
+    "FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Selected objects visibility",
+    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End point, vertex and segmtents",
+    "FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End pointet and vertex",
+    "FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End point",
+    "": "",
+    "FORM_TITLE_VMAP_BUSINESS_OBJECT_EVENT": "Event {{::event_id}}",
+    "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT": "ID",
+    "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT_TOOLTIP": "Événement généré lors de la mise à jour de l'objet métier Les calques associés à l'objet métier se rafraichissent lorsqu'ils le reçoivent Il est recommandé de gérer les évènements lorsque plusieurs personnes travaillent sur une même zone.",
+    "FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT": "Description",
+    "BTN_ADD_EVENT_VMAP_BUSINESS_OBJECT_EVENT": "Add event",
+    "BTN_DELETE_EVENT_VMAP_BUSINESS_OBJECT_EVENT": "Delete events",
+    "": "",
+    "FORM_TITLE_VMAP_PRINTREPORT": "Repport {{::name}}",
+    "FORM_PRINTTEMPLATE_ID_VMAP_PRINTREPORT": "ID",
+    "FORM_NAME_VMAP_PRINTREPORT": "Name",
+    "FORM_FORMAT_VMAP_PRINTREPORT": "Print format",
+    "FORM_ORIENTATION_VMAP_PRINTREPORT": "Orientation",
+    "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT": "Output format",
+    "FORM_RESSOURCE_VMAP_PRINTREPORT": "Ressource",
+    "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT": "Business object",
+    "FORM_MULTIOBJECT_VMAP_PRINTREPORT": "Multiple object report",
+    "FORM_HTML_DEFINITION_VMAP_PRINTREPORT": "HTML definition",
+    "FORM_JSON_DEFINITION_VMAP_PRINTREPORT": "JSON objetcts",
+    "": "",
+    "FORM_LOGIN_USER_USER": "User",
+    "FORM_NAME_USER_USER": "Name",
+    "FORM_EMAIL_USER_USER": "Email",
+    "FORM_AGENCY_USER_USER": "Company",
+    "FORM_DEPARTMENT_USER_USER": "Department",
+    "FORM_USER_PASSWORD_USER_USER": "Password",
+    "FORM_USER_CONFIRM_PASSWORD_USER_USER": "Password confirmation",
+    "FORM_INFORMATIONS_USER_USER": "Informations",
+    "FORM_NEW_PASSWORD_USER_USER": "New password",
+    "": "",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA1": "Attention, il est fortement déconseillé d'avoir un objet métier dans le schéma ",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA2": ", en effet lors des mises à jour les tables crées dans ce schéma risquent d'être effacées.",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA3": "Voulez vous vraiment continuer ?",
+    "": "",
+    "ERROR_BO_DELETE_EVENT": "Un événement est lié à l'objet métier",
+    "ERROR_BO_DELETE_REPPORT": "Un rapport est lié à l'objet métier",
+    "ERROR_BO_DELETE_LAYER": "Une ou plusieurs couches sont liées à l'objet métier",
+    "": "",
+    "CTRL_IMPORT_VEX_IMPORT_TITLE": "Importer un fichier VEX",
+    "CTRL_IMPORT_VEX_STEP_import_vex_file": "Import fichier",
+    "CTRL_IMPORT_VEX_STEP_config": "Configuration",
+    "CTRL_IMPORT_VEX_STEP_vmap_objects": "Objets vMap",
+    "CTRL_IMPORT_VEX_STEP_import_sql": "SQL",
+    "CTRL_IMPORT_VEX_STEP_web_services": "Services WEB",
+    "CTRL_IMPORT_VEX_STEP_execute_import": "Execution",
+    "CTRL_IMPORT_VEX_STEP_finalize": "Fin",
+    "": "",
+    "CTRL_IMPORT_VEX_LOADING": "Chargement...",
+    "CTRL_IMPORT_VEX_OR": "ou",
+    "CTRL_IMPORT_VEX_AND": "et",
+    "CTRL_IMPORT_VEX_IMPORT_VEX_FILE": "Import du fichier VEX",
+    "CTRL_IMPORT_VEX_SELECT_FILE": "Sélectionner un fichier",
+    "CTRL_IMPORT_VEX_CONFIGURATION": "Configuration",
+    "CTRL_IMPORT_VEX_SELECT_DB": "Base de données",
+    "CTRL_IMPORT_VEX_SELECT_SCHEMA": "Schéma",
+    "CTRL_IMPORT_VEX_SELECT_EXISTING_SCHEMA": "Parmi un schéma existant",
+    "CTRL_IMPORT_VEX_SELECT_SCHEMA_OR": "ou",
+    "CTRL_IMPORT_VEX_CREATE_SCHEMA": "Création d'un nouveau schéma",
+    "CTRL_IMPORT_VEX_SELECT_COORDSYS": "Système de coordonnées",
+    "CTRL_IMPORT_VEX_SELECT_ELEMENTS": "Éléments à importer",
+    "CTRL_IMPORT_VEX_SELECT_ROLE": "Rôles PostgreSQL",
+    "CTRL_IMPORT_VEX_SELECT_USER_ROLE": "Lecture seule",
+    "CTRL_IMPORT_VEX_SELECT_ADMIN_ROLE": "Lecture et écriture",
+    "CTRL_IMPORT_VEX_SELECT_VMAP_OBJETS": "Objets vMap à importer",
+    "CTRL_IMPORT_VEX_SELECT_SQL_MODEL": "Modèle de données",
+    "CTRL_IMPORT_VEX_SELECT_SQL_DATA": "Données",
+    "CTRL_IMPORT_VEX_WEB_SERVICES": "Services WEB",
+    "CTRL_IMPORT_VEX_IMPORT_EXECUTION": "Execution de l'import",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS": "Objets vMap",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_MAPS": "Cartes",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_SERVICES": "Services",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUES": "Calques",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUE_THEMES": "Thèmes des calques",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_VM4MS_LAYERS": "Couches Mapserver",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_BUSINESS_OBJECTS": "Objets métier",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_EVENTS": "Evènements",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_REPORTS": "Rapports",
+    "CTRL_IMPORT_VEX_IMPORT_WEB_SERVICES": "Services WEB",
+    "CTRL_IMPORT_VEX_IMPORT_SQL": "SQL",
+    "CTRL_IMPORT_VEX_IMPORT_SQL_MODEL": "Modèle de données",
+    "CTRL_IMPORT_VEX_IMPORT_SQL_DATA": "Données",
+    "CTRL_IMPORT_VEX_TO_DO": "Ce qu'il vous reste à faire:",
+    "CTRL_IMPORT_VEX_TO_DO_MAP": "Affecter des groupes à la carte importée",
+    "CTRL_IMPORT_VEX_TO_DO_PGADMIN": "Affiner les droits sur Pg-admin",
+    "": "",
+    "CTRL_IMPORT_VEX_ERROR_SELECT_VEX_FILE": "Veuillez sélectionner un fichier VEX",
+    "CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL": "Erreur lors de l'import du fichier VEX",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS": "Erreur lors de la récupération des objets vMap",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES": "Erreur lors de la récupération des services WEB",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_DATABASES": "Erreur lors de la récupération des bases de données",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_SCHEMAS": "Erreur lors de la récupération des schémas",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_ROLEGROUPS": "Erreur lors de la récupération des rôles de connexion",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_COORDSYS": "Erreur lors de la récupération des systèmes de coordonnées",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION": "Erreur lors de la récupération de la connexion privée",
+    "CTRL_IMPORT_VEX_ERROR_PRIVATE_CONNECTION_DATABASE_DIFFERENT": "Attention: <br><br>La base de données utilisée par la connexion privée du module Mapserver est différente de celle sélectionnée. <br><br>Il faudra reconfigurer les couches mapserver pour qu'elles puissent fonctionner correctement",
+    "CTRL_IMPORT_VEX_ERROR_DATABASE_REQUIRED": "Base de données requis",
+    "CTRL_IMPORT_VEX_ERROR_SCHEMA_REQUIRED": "Schéma requis",
+    "CTRL_IMPORT_VEX_ERROR_COORDSYS_REQUIRED": "Système de coordonnées requis",
+    "CTRL_IMPORT_VEX_ERROR_USER_ROLE_REQUIRED": "Rôle utilisateur requis",
+    "CTRL_IMPORT_VEX_ERROR_ADMIN_ROLE_REQUIRED": "Rôle administrateur requis",
+    "CTRL_IMPORT_VEX_ERROR_EDIT_NAME_NOT_VALID": "Nouveau nom non valide",
+    "CTRL_IMPORT_VEX_ERROR_EXISTING_VMAP_OBJETS": "Attention <br><br>[number] objet(s) déjà présent(s) sur l'application et mis à jour lors de l'import, cette opération est irréversible.<br><br>Il est possible de renommer les objets à importer en cliquant dessus. <br><br>Voulez-vous continuer ?",
+    "CTRL_IMPORT_VEX_WARNING_SQL": "Attention<br><br>En validant cette partie vous assumez la responsabilité du code SQL qui sera exectué sur le serveur.<br><br>Voulez-vous continuer ?",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS": "Erreur lors de l'import des objets vMap",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES": "Erreur lors de l'import des services web",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL": "Erreur lors de l'import du SQL",
+    "": "",
+    "CTRL_IMPORT_VEX_NEXT": "Suivant",
+    "CTRL_IMPORT_VEX_PREVIOUS": "Précédent",
+    "CTRL_IMPORT_VEX_EXECUTE": "Executer",
+    "CTRL_IMPORT_VEX_TEST": "Tester",
+    "CTRL_IMPORT_VEX_FINISH": "Terminer",
+    "": "",
+    "CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES": "Privilèges insuffisants",
+    "CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION": "Pour utiliser les fonctions d'import, vous devez être administrateur Vitis, vMap et vMap4MapServer",
+    "CTRL_EXPORT_VEX_EXPORT_TITLE": "Exporter un fichier VEX",
+    "CTRL_EXPORT_VEX_LOADING": "Chargement...",
+    "CTRL_EXPORT_VEX_STEP_select_vmap_objects": "Objets vMap",
+    "CTRL_EXPORT_VEX_STEP_select_web_services": "Services WEB",
+    "CTRL_EXPORT_VEX_STEP_select_sql_objects": "SQL",
+    "CTRL_EXPORT_VEX_STEP_execute_export": "Execution",
+    "": "",
+    "CTRL_EXPORT_VEX_SELECT_VMAP_OBJETS": "Objets vMap à exporter",
+    "CTRL_EXPORT_VEX_SELECT_WEB_SERVICES": "Services WEB à exporter",
+    "CTRL_EXPORT_VEX_SELECT_SQL": "SQL à exporter",
+    "CTRL_EXPORT_VEX_EXPORT_EXECUTION": "Execution de l'export",
+    "CTRL_EXPORT_VEX_SELECT_DB": "Choix de la base de données",
+    "CTRL_EXPORT_VEX_GENERATE_VEX": "Générer un fichier VEX",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS": "Erreur lors de la récupération des objets vMap",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES": "Erreur lors de la récupération des services web",
+    "CTRL_EXPORT_VEX_NO_RESULT_REQUEST_GET_WEB_SERVICES": "Aucun service web associé",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES": "Erreur lors de la récupération des bases de données",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS": "Erreur lors de la récupération des objets SQL",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX": "Erreur lors de l'export VEX",
+    "": "",
+    "CTRL_EXPORT_VEX_NEXT": "Suivant",
+    "CTRL_EXPORT_VEX_PREVIOUS": "Précédent",
+    "CTRL_EXPORT_VEX_EXECUTE": "Executer",
+    "CTRL_EXPORT_VEX_TEST": "Tester",
+    "CTRL_EXPORT_VEX_FINISH": "Terminer",
+    "": "",
+    "ERROR_SERVICE_ASSOCIATED": "Un service vMap est associé",
+    "ERROR_WMSSERVICE_ASSOCIATED": "Un service WMS est associé",
+    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées."
+}
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..970eebf515a273666fd84369acf99d6700229a7a
--- /dev/null
+++ b/module/lang/lang-fr.json
@@ -0,0 +1,443 @@
+{
+    "TITLE_MODE_VMAP": "vMap",
+    "TEXT_MODE_VMAP": "Visualisation cartographique",
+    "TITLE_MODE_VMAP_ADMIN_MAP": "Calques et Cartes",
+    "TEXT_MODE_VMAP_ADMIN_MAP": "Gestion des calques et des cartes de vMap",
+    "TITLE_MODE_VMAP_ADMIN_MODULE": "Modules",
+    "TEXT_MODE_VMAP_ADMIN_MODULE": "Administration des modules",
+    "TITLE_MODE_VMAP_ADMIN_PRINT": "Impressions",
+    "TEXT_MODE_VMAP_ADMIN_PRINT": "Administration des impressions",
+    "": "",
+    "SECTION_UPDATE_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Carte n°{{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Carte",
+    "SECTION_DISPLAY_TITLE_VMAP_ADMIN_MAP_VMAP_ADMIN_MAP": "Carte n°{{sId}}",
+    "": "",
+    "SECTION_UPDATE_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Calque n°{{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Calque",
+    "SECTION_DISPLAY_TITLE_VMAP_ADMIN_MAP_VMAP_LAYERS": "Calque n°{{sId}}",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP": "Description",
+    "FORM_TITLE_VMAP_MAP_MAP": "Carte {{::name}}",
+    "FORM_MAP_ID_VMAP_MAP_MAP": "ID",
+    "FORM_NAME_VMAP_MAP_MAP": "Nom",
+    "FORM_THEME_VMAP_MAP_MAP": "Thème",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP": "Système de coordonnées",
+    "FORM_DESCRIPTION_VMAP_MAP_MAP": "Description",
+    "FORM_EXTENT_VMAP_MAP_MAP": "Etendue",
+    "FORM_CATALOG_INDEX_VMAP_MAP_MAP": "Ordre",
+    "FORM_THUMBNAIL_VMAP_MAP_MAP": "Vignette",
+    "FORM_THUMBNAIL_VMAP_MAP_MAP_TOOLTIP": "Recommandé: 150px/90px jpg",
+    "FORM_GROUPS_VMAP_MAP_MAP": "Groupes",
+    "FORM_AVAILABLE_GROUPS_VMAP_MAP_MAP": "Groupes disponibles",
+    "FORM_MAP_GROUPS_VMAP_MAP_MAP": "Groupes liés à la carte",
+    "FORM_VISIBLE_VMAP_MAP_MAP_LAYERS": "Visible",
+    "TITLE_GRID_MAP_LAYERS_VMAP_MAP_MAP_LAYERS": "Calques associés à la carte",
+    "TITLE_GRID_AVAILABLE_LAYERS_VMAP_MAP_MAP_LAYERS": "Calques disponibles",
+    "BTN_VISIBLE_VMAP_MAP_MAP_LAYERS": "Visible",
+    "BTN_INVISIBLE_VMAP_MAP_MAP_LAYERS": "Invisible",
+    "ERROR_MAP_LAYER_VISIBILITY_VMAP_MAP_MAP_LAYERS": "Erreur pendant la définition de la visibilité des calques",
+    "BTN_ADD_LAYERS_VMAP_MAP_MAP_LAYERS": "Ajouter des calques",
+    "BTN_DELETE_LAYERS_VMAP_MAP_MAP_LAYERS": "Supprimer les calques",
+    "BTN_ADD_VMAP_MAP_MAP_LAYERS": "Ajouter les calques",
+    "ERROR_ADD_MAP_LAYERS_VMAP_MAP_MAP_LAYERS": "Erreur pendant l'association des calques à la carte",
+    "ERROR_DELETE_MAP_LAYER_VMAP_MAP_MAP_LAYERS": "Erreur pendant la suppression des calques associées à la carte",
+    "FORM_OPACITY_VMAP_MAP_MAP_LAYERS": "Opacité",
+    "ERROR_MAP_LAYER_OPACITY_VMAP_MAP_MAP_LAYERS": "Erreur pendant la mise à jour de l'opacité du calque",
+    "FORM_UPDATE_EXTENT_VMAP_MAP_MAP": "Mise à jour",
+    "FORM_NAME_VMAP_MAP_MAP_LAYERS": "Nom",
+    "FORM_SERVICE_VMAP_MAP_MAP_LAYERS": "Service",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_MAP_LAYERS": "Système de coordonnées",
+    "FORM_THEME_VMAP_MAP_MAP_LAYERS": "Thème",
+    "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Calque sans caches",
+    "FORM_ISDYNAMIC_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Conseillé pour les données potentiellement modifiables",
+    "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Ajoute un formulaire de filtre au calque",
+    "FORM_ISFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Une fois le formulaire validé intègre le résultat à la requête GetMap, une configuration supplémentaire est nécessaire au niveau de la couche Mapserver (voir documentation)",
+    "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP_TITLE": "Filtre également l'objet métier quand on exerce un filtre sur le calque",
+    "FORM_ISBOFILTERED_VMAP_MAP_MAP_LAYERS_TOOLTIP": "Fonctionne uniquement pour des égalités et si tous les champs du formulaire correspondent à des colonnes de la table",
+    "": "",
+    "TITLE_GRID_THEMES_VMAP_MAP_MAP_THEMES": "Thèmes",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_SERVICE": "Description",
+    "FORM_TITLE_VMAP_MAP_SERVICE": "Service {{::name}}",
+    "FORM_SERVICE_ID_VMAP_MAP_SERVICE": "ID",
+    "FORM_NAME_VMAP_MAP_SERVICE": "Nom",
+    "FORM_TYPE_VMAP_MAP_SERVICE": "Type",
+    "FORM_TYPE_VMAP_MAP_SERVICE_DESCRIPTION": "<b>tilewms</b>: Service WMS tuilé <br><b>imagewms</b>: Service WMS non-tuilé <br><b>bing</b>: Service Bing <br><b>osm</b>: Service OpenStreetMap",
+    "FORM_DESCRIPTION_VMAP_MAP_SERVICE": "Description",
+    "FORM_THUMBNAIL_VMAP_MAP_SERVICE": "Vignette",
+    "FORM_THUMBNAIL_VMAP_MAP_SERVICE_TOOLTIP": "Recommandé: 150px/90px jpg",
+    "FORM_URL_VMAP_MAP_SERVICE": "Lien",
+    "FORM_KEY_VMAP_MAP_SERVICE": "Clé",
+    "FORM_SERVICE_TYPE_VERSION_VMAP_MAP_SERVICE": "Version du protocole",
+    "FORM_LANG_VMAP_MAP_SERVICE": "Langue",
+    "FORM_IMAGERY_VMAP_MAP_SERVICE": "Imagery",
+    "FORM_SERVICE_TYPE_VERSION_TOOLTIP_VMAP_MAP_SERVICE": "x.x.x (choix les plus fréquents : 1.3.0, 1.1.0)",
+    "FORM_BTN_CLONE_SERVICE_VMAP_MAP_SERVICE": "Cloner",
+    "ERROR_SERVICE_DELETE_VMAP_MAP_SERVICE": "Un service est lié à un ou plusieurs calques.",
+    "FORM_TYPE_VMAP_MAP_SERVICE": "Type",
+    "FORM_TEST_VMAP_MAP_SERVICE": "Tester",
+    "FORM_LOGIN_VMAP_MAP_SERVICE": "Identifiant (optionnel, visible)",
+    "FORM_PASSWORD_VMAP_MAP_SERVICE": "Mot de passe (optionnel, visible)",
+    "": "",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER": "Description",
+    "FORM_TITLE_VMAP_MAP_LAYER": "Calque {{::name}}",
+    "COORDINATE_SYSTEM_TOOLTIP_TITLE_VMAP_MAP_LAYER": "Système de coordonnées",
+    "FORM_LAYER_ID_VMAP_MAP_LAYER": "ID",
+    "FORM_NAME_VMAP_MAP_LAYER": "Nom",
+    "FORM_THEME_VMAP_MAP_LAYER": "Thème",
+    "FORM_DYNAMIC_VMAP_MAP_LAYER": "Calque dynamique (sans cache)",
+    "FORM_FILTERED_VMAP_MAP_LAYER": "Calque filtrable (Mapserver)",
+    "FORM_BOFILTERED_VMAP_MAP_LAYER": "Filtre associé aux objets métiers",
+    "FORM_COORDINATE_SYSTEM_VMAP_MAP_LAYER": "Système de coordonnées",
+    "FORM_SERVICE_VMAP_MAP_LAYER": "Service",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER": "Description",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER": "Objet métiers",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_TO": "Objet métiers liés au calque",
+    "FORM_BUSINESS_OBJECT_VMAP_MAP_LAYER_FROM": "Objet métiers disponibles",
+    "FORM_LAYER_LIST_VMAP_MAP_LAYER": "Calques",
+    "FORM_CRS_LIST_VMAP_MAP_LAYER": "Systèmes de coordonnées",
+    "FORM_CRS_LIST_VMAP_MAP_LAYER_TOOLTIP": "Il est possible de définir de manière facultative la liste des systèmes de coordonnées disponibles pour le calque vMap.<br>Cette information est utilisée comme aide à l'administrateur lors de la création des cartes.<br>Cette liste doit normalement être un sous-ensemble des systèmes de coordonnées proposés par le service WMS.",
+    "FORM_AVAILABLE_CRS_LIST_VMAP_MAP_LAYER": "Systèmes de coordonnées disponibles",
+    "FORM_LAYER_CRS_LIST_VMAP_MAP_LAYER": "Systèmes de coordonnées liés au calque",
+    "FORM_BTN_ADD_CRS_LIST_VMAP_MAP_LAYER": "Ajouter",
+    "FORM_BTN_ADD_LAYER_LIST_VMAP_MAP_LAYER": "Ajouter des Couches",
+    "TITLE_GRID_LAYER_LAYERS_VMAP_MAP_LAYER": "Couches WMS associées au calque vMap",
+    "FORM_BTN_REMOVE_LAYER_LIST_VMAP_MAP_LAYER": "Supprimer les couches",
+    "FORM_LAYER_VMAP_MAP_LAYER": "Calque",
+    "FORM_WMTS_LAYER_VMAP_MAP_LAYER": "Couche WMTS associée au calque vMap",
+    "FORM_MATRIX_VMAP_MAP_LAYER": "Matrice",
+    "FORM_STYLE_VMAP_MAP_LAYER": "Style",
+    "FORM_FORMAT_VMAP_MAP_LAYER": "Format",
+    "BTN_ADD_LAYERS_VMAP_MAP_LAYER": "Ajouter les couches",
+    "FORM_BTN_CHECK_LAYERS_VMAP_MAP_LAYER": "Vérifier",
+    "FORM_BTN_CHECK_LAYERS_SUCCESSFUL_VMAP_MAP_LAYER": "Couches bien présentes dans le flux",
+    "FORM_BTN_CHECK_LAYERS_ERROR_TITLE_VMAP_MAP_LAYER": "Couches manquantes",
+    "FORM_BTN_CHECK_LAYERS_ERROR_MESSAGE_VMAP_MAP_LAYER": "Les couches suivantes ne sont pas présentes dans le flux WMS :",
+    "FORM_IS_QUERYABLE_GETFEATUREINFO_VMAP_MAP_LAYER": "Couche interrogeable par requête WMS GetFeatureInfo",
+    "": "",
+    "FORM_ID_USERS_GROUP_VMAP_GROUP": "ID",
+    "FORM_MAPS_USERS_GROUP_VMAP_GROUP": "Cartes",
+    "FORM_MAPS_AVAILABLE_USERS_GROUP_VMAP_GROUP": "Cartes disponibles",
+    "FORM_GROUP_MAPS_USERS_GROUP_VMAP_GROUP": "Cartes liées au groupe",
+    "FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP": "Modéles d'impression",
+    "FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_GROUP": "Modéles d'impression disponibles",
+    "FORM_GROUP_PRINT_TEMPLATES_USERS_GROUP_VMAP_GROUP": "Modéles d'impression liés au groupe",
+    "": "",
+    "FORM_TITLE_VMAP_MAP_LAYER_THEME": "Thème {{::name}}",
+    "FORM_MAPTHEME_ID_VMAP_MAP_LAYER_THEME": "ID",
+    "FORM_NAME_VMAP_MAP_LAYER_THEME": "Nom",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER_THEME": "Description",
+    "BTN_ADD_LAYERS_VMAP_MAP_LAYER_THEME": "Ajouter un thème",
+    "BTN_DELETE_LAYERS_VMAP_MAP_LAYER_THEME": "Supprimer les thèmes",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_LAYER_THEME": "Description",
+    "": "",
+    "FORM_TITLE_VMAP_MAP_MAP_THEME": "Thème {{::name}}",
+    "FORM_MAPTHEME_ID_VMAP_MAP_MAP_THEME": "ID",
+    "FORM_NAME_VMAP_MAP_MAP_THEME": "Nom",
+    "FORM_DESCRIPTION_VMAP_MAP_MAP_THEME": "Description",
+    "BTN_ADD_LAYERS_VMAP_MAP_MAP_THEME": "Ajouter un thème",
+    "BTN_DELETE_LAYERS_VMAP_MAP_MAP_THEME": "Supprimer les thèmes",
+    "DESCRIPTION_TOOLTIP_TITLE_VMAP_MAP_MAP_THEME": "Description",
+    "": "",
+    "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0": "Objet métier",
+    "FORM_BUSINESS_OBJET_ID_DEVELOPMENT_0_TOOLTIP": "Sans accents ni majuscules",
+    "FORM_TITLE_DEVELOPMENT_0": "Titre",
+    "FORM_FORMTITLE_DEVELOPMENT_0": "Titre des formulaires",
+    "FORM_SUMMARYTITLE_DEVELOPMENT_0": "Titre des infobulles",
+    "FORM_ID_FIELD_DEVELOPMENT_0": "Champ identifiant",
+    "FORM_ID_FIELD_DEVELOPMENT_0_TOOLTIP": "Champ identifiant de la table qui sera utilisée",
+    "FORM_DATABASE_DEVELOPMENT_0": "Base de données",
+    "FORM_SCHEMA_DEVELOPMENT_0": "Schema",
+    "FORM_TABLE_DEVELOPMENT_0": "Table",
+    "FORM_SQL_SUMMARY_DEVELOPMENT_0": "SQL Summary",
+    "FORM_SQL_SUMMARY_DEVELOPMENT_0_TOOLTIP": "Résultat à afficher dans les info-bulles et dans l'outil de localisation",
+    "FORM_SQL_LIST_DEVELOPMENT_0": "SQL List",
+    "FORM_SQL_LIST_DEVELOPMENT_0_TOOLTIP": "Résultat à afficher dans la liste des enregistrements",
+    "FORM_SQL_FORM_DEVELOPMENT_0": "SQL Form",
+    "FORM_SORTED_BY_DEVELOPMENT_0": "Sorted by",
+    "FORM_GEOM_COLUMN_DEVELOPMENT_0": "Colonne géométrie",
+    "FORM_LAST_UPDATE_TIME_DEVELOPMENT_0": "Dernière mise à jour",
+    "FORM_LAST_UPDATE_AUTHOR_DEVELOPMENT_0": "Auteur de la mise à jour",
+    "FORM_SEARCH_FIELD_0": "Colonne de recherche pour la localisation",
+    "FORM_SEARCH_FIELD_0_TOOLTIP": "Colonne de la table sur laquelle doit être faite la recherche",
+    "FORM_RESULT_FIELD_0": "Champ à afficher pour la localisation",
+    "FORM_RESULT_FIELD_0_TOOLTIP": "Champ résultant de SQL Summary à afficher dans la liste",
+    "FORM_SEARCH_USE_STRICT_0": "Mode de recherche",
+    "FORM_SEARCH_USE_STRICT_1": "Stricte",
+    "FORM_SEARCH_USE_STRICT_2": "Début de chaine",
+    "FORM_SEARCH_USE_STRICT_3": "Fin de chaine",
+    "FORM_SEARCH_USE_STRICT_4": "Milieu de chaine",
+    "EDIT_FORM_SIZE": "Taille du formulaire en édition",
+    "DISPLAY_FORM_SIZE": "Taille du formulaire en visualisation",
+    "ADD_FORM_SIZE": "Taille du formulaire d'ajout",
+    "FORM_SIZE_1": "Standard",
+    "FORM_SIZE_2": "Large",
+    "FORM_SIZE_3": "Extra large",
+    "TITLE_MODE_VMAP_BUSINESS_OBJECT": "Développement",
+    "TEXT_MODE_VMAP_BUSINESS_OBJECT": "Gestion des objets métiers",
+    "SECTION_UPDATE_TITLE_VMAP_BUSINESS_OBJECT_VMAP_BUSINESS_OBJECT": "Objet Métier {{sId}}",
+    "SECTION_INSERT_TITLE_VMAP_BUSINESS_OBJECT_VMAP_BUSINESS_OBJECT": "Objet Métier",
+    "SECTION_DISPLAY_TITLE_VMAP_BUSINESS_OBJECT_VMAP_BUSINESS_OBJECT": "Objet Métier {{sId}}",
+    "FORM_EVENT_VMAP_BUSINESS_OBJECT": "Evènement",
+    "FORM_INDEX_VMAP_BUSINESS_OBJECT": "Ordre",
+    "FORM_BUFFER_VMAP_BUSINESS_OBJECT": "Buffer de sélection (en mm sur l'écran)",
+    "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Échelle maximale de saisie",
+    "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Échelle à partir de laquelle la saisie ne sera plus possible : il faudra zoomer pour reprendre la saisie",
+    "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Échelle minimale de saisie",
+    "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Échelle à partir de laquelle la saisie sera possible : il faudra dézoomer pour reprendre la saisie",
+    "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT": "Supprimer les objets métiers sélectionnés et les associations avec les calques ?",
+    "": "",
+    "FORM_TITLE_VMAP_MODULE_MODULE": "Module {{::label}}",
+    "FORM_LABEL_VMAP_MODULE_MODULE": "Libellé",
+    "FORM_MODULE_ID_VMAP_MODULE_MODULE": "ID",
+    "FORM_DESCRIPTION_VMAP_MODULE_MODULE": "Description",
+    "FORM_ROLNAME_VMAP_MODULE_MODULE": "Privilège",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_TEMPLATE": "Modèle {{::name}}",
+    "FORM_PRINTTEMPLATE_ID_VMAP_PRINT_TEMPLATE": "ID",
+    "FORM_NAME_VMAP_PRINT_TEMPLATE": "Nom",
+    "FORM_FORMAT_VMAP_PRINT_TEMPLATE": "Format d'impression",
+    "FORM_ORIENTATION_VMAP_PRINT_TEMPLATE": "Orientation",
+    "FORM_OUTPUT_FORMATS_VMAP_PRINT_TEMPLATE": "Format de sortie",
+    "FORM_RESSOURCE_VMAP_PRINT_TEMPLATE": "Ressource",
+    "FORM_BUSINESS_OBJECT_VMAP_PRINT_TEMPLATE": "Objet métier",
+    "FORM_DEFINITION_VMAP_PRINT_TEMPLATE": "Définition",
+    "FORM_SQL_VMAP_PRINT_TEMPLATE": "Sql",
+    "FORM_WEB_SERVICE_VMAP_PRINT_TEMPLATE": "Web service",
+    "FORM_PRINT_TEMPLATES_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Groupes",
+    "FORM_PRINT_TEMPLATES_AVAILABLE_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Groupes disponibles",
+    "FORM_PRINT_TEMPLATES_LINKED_USERS_GROUP_VMAP_PRINT_TEMPLATE": "Groupes liés au modèle",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_STYLE": "Style {{::name}}",
+    "FORM_PRINTSTYLE_ID_VMAP_PRINT_STYLE": "ID",
+    "FORM_NAME_VMAP_PRINT_STYLE": "Nom",
+    "FORM_DEFINITION_VMAP_PRINT_STYLE": "Définition",
+    "FORM_USERS_VMAP_PRINT_STYLE": "Utilisateurs",
+    "FORM_AVAILABLE_USERS_VMAP_PRINT_STYLE": "Utilisateurs disponibles",
+    "FORM_MAP_USERS_VMAP_PRINT_STYLE": "Utilisateurs liés au style",
+    "": "",
+    "FORM_ID_USERS_USER_VMAP_USER": "ID",
+    "FORM_PRINT_STYLES_USERS_USER_VMAP_USER": "Styles d'impression",
+    "FORM_PRINT_STYLES_AVAILABLE_USERS_USER_VMAP_USER": "Styles d'impression disponibles",
+    "FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER": "Styles d'impression liés à l'utilisateur",
+    "": "",
+    "FORM_TITLE_VMAP_PRINT_PARAMETER": "Paramètre {{::name}}",
+    "FORM_PRINTPARAMETER_ID_VMAP_PRINT_PARAMETER": "ID",
+    "FORM_NAME_VMAP_PRINT_PARAMETER": "Nom",
+    "FORM_EDITABLE_VMAP_PRINT_PARAMETER": "Modifiable",
+    "FORM_EDITABLE_YES_VMAP_PRINT_PARAMETER": "Oui",
+    "FORM_EDITABLE_NO_VMAP_PRINT_PARAMETER": "Non",
+    "FORM_EDITABLE_DEFAULT_VMAP_PRINT_PARAMETER": "Peu importe",
+    "FORM_PRINT_TEMPLATE_VMAP_PRINT_PARAMETER": "Modèle",
+    "FORM_LABEL_VMAP_PRINT_PARAMETER": "Libellé",
+    "FORM_PLACEHOLDER_VMAP_PRINT_PARAMETER": "Placeholder",
+    "FORM_DEFAULTVALUE_VMAP_PRINT_PARAMETER": "Valeur par defaut",
+    "PLACEHOLDER_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER": "Description",
+    "DEFAULTVALUE_TOOLTIP_TITLE_VMAP_PRINT_PARAMETER": "Description",
+    "": "",
+    "FORM_NAME_VMAP_MAP_LAYER_WMS_LAYERS": "Nom",
+    "FORM_DESCRIPTION_VMAP_MAP_LAYER_WMS_LAYERS": "Description",
+    "FORM_CRS_VMAP_MAP_LAYER_WMS_LAYERS": "Systèmes de coordonnées",
+    "TITLE_GRID_VMAP_MAP_LAYER_WMS_LAYERS": "Couches du service wms",
+    "ERROR_TITLE_GET_CAPABILITIES_VMAP_MAP_LAYER_WMS_LAYERS": "Erreur requête getCapabilities",
+    "ERROR_CONTENT_NO_DATA_VMAP_MAP_LAYER_WMS_LAYERS": "La requête GetCapabilities ne retourne pas de résultat, veuillez vérifier l'URL du service.",
+    "FORM_WMS_SERVICE_NAME_VMAP_MAP_LAYER_WMS_LAYERS": "Service",
+    "FORM_WMS_SERVICE_URL_VMAP_MAP_LAYER_WMS_LAYERS": "Lien du service",
+    "ERROR_CONTENT_SSL_CERTIFICATE_VMAP_MAP_LAYER_WMS_LAYERS": "Veuillez vérifier votre certificat SSL ou désactiver le paramètre \"Vérifier la validité du certificat SSL\" dans le mode \"Configuration\".",
+    "": "",
+    "TITLE_PROPERTIES_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Général",
+    "FORM_FOP_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Répertoire FOP",
+    "FORM_PHANTOM_DIRECTORY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Chemin vers PhantomJS (executable)",
+    "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Alias pintserver",
+    "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "API Veremap",
+    "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils disponibles",
+    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs par défaut",
+    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attributions",
+    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position de la souris",
+    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Projection en cours",
+    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nom de la carte",
+    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle numérique",
+    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle graphique",
+    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Carte de supervision",
+    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotation",
+    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Slider de zoom",
+    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement auto",
+    "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Affichage",
+    "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils",
+    "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Garder les tuiles lors d'un rafraichissement automatique",
+    "FORM_LAYERS_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Groupes de calques repliées par défaut dans \"Jeux de données\"",
+    "FORM_RADIO_TRUE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Oui",
+    "FORM_RADIO_FALSE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Non",
+    "FORM_LAYERSTREE_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Fenêtre \"Jeux de données\" repliée par défaut",
+    "FORM_LAYERSORDER_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Fenêtre \"Table des matières\" repliée par défaut",
+    "FORM_LEGEND_COLLAPSED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Fenêtre \"Légende\" repliée par défaut",
+    "FORM_TILES_WIDTH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Largeur des tuiles WMS (en px)",
+    "FORM_TILES_HEIGHT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Hauteur des tuiles WMS (en px)",
+    "FORM_POPUP_STYLE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Style CSS des popup",
+    "TITLE_PRINTING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Impression",
+    "FORM_PRINT_EQUALITY_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Timeout durant lequel l'égalitée entre les tuiles à charger et celles chargées doit être écoutée",
+    "FORM_PRINT_LOAD_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Délai d'attente si aucun calque n'est chargé",
+    "FORM_PRINT_PRINT_TIMEOUT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Délai d'attente avant le début de l'impression",
+    "FORM_PRINT_PRINT_TIMEOUT_FEATURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Délai d'attente avant le début de l'impression lorsqu'il y a zoom sur feature",
+    "TITLE_SELECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Sélection",
+    "FORM_SELECTION_LIMIT_POPUP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nombre maximal de popups",
+    "FORM_SELECTION_LIMIT_LIST_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nombre maximal de sélections dans la liste",
+    "FORM_ENABLE_GETFEATUREINFO_CONFIGURATION_VMAP_CONFIG": "Interrogation par GetFeatureInfo",
+    "FORM_SELECTION_BUFFER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Buffer de sélection (en mm sur l'écran)",
+    "FORM_SELECTION_MAX_SCALE_BUFFER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Buffer maximum (en mètres sur le terrain)",
+    "TITLE_SNAPPING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Options d'accrochage par défaut",
+    "FORM_SNAPPING_DEFAUT_LIMIT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Limite de points accrochables",
+    "FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Tolérance d'accrochage (pixels)",
+    "FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Type d'accrochage",
+    "FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Visibilité des zones d'accrochage",
+    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités, vertex et segmtents",
+    "FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités et vertex",
+    "FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités",
+    "": "",
+    "FORM_TITLE_VMAP_BUSINESS_OBJECT_EVENT": "Evènement {{::event_id}}",
+    "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT": "ID",
+    "FORM_EVENT_ID_VMAP_BUSINESS_OBJECT_EVENT_TOOLTIP": "Événement généré lors de la mise à jour de l'objet métier Les calques associés à l'objet métier se rafraichissent lorsqu'ils le reçoivent Il est recommandé de gérer les évènements lorsque plusieurs personnes travaillent sur une même zone.",
+    "FORM_DESCRIPTION_VMAP_BUSINESS_OBJECT_EVENT": "Description",
+    "BTN_ADD_EVENT_VMAP_BUSINESS_OBJECT_EVENT": "Ajouter un évènement",
+    "BTN_DELETE_EVENT_VMAP_BUSINESS_OBJECT_EVENT": "Supprimer les évènements",
+    "": "",
+    "FORM_TITLE_VMAP_PRINTREPORT": "Rapport {{::name}}",
+    "FORM_PRINTTEMPLATE_ID_VMAP_PRINTREPORT": "ID",
+    "FORM_NAME_VMAP_PRINTREPORT": "Nom",
+    "FORM_FORMAT_VMAP_PRINTREPORT": "Format d'impression",
+    "FORM_ORIENTATION_VMAP_PRINTREPORT": "Orientation",
+    "FORM_OUTPUT_FORMATS_VMAP_PRINTREPORT": "Format de sortie",
+    "FORM_RESSOURCE_VMAP_PRINTREPORT": "Ressource",
+    "FORM_BUSINESS_OBJECT_VMAP_PRINTREPORT": "Objet métier",
+    "FORM_MULTIOBJECT_VMAP_PRINTREPORT": "Rapport sur plusieurs éléments",
+    "FORM_HTML_DEFINITION_VMAP_PRINTREPORT": "Définition HTML",
+    "FORM_JSON_DEFINITION_VMAP_PRINTREPORT": "Objets JSON",
+    "": "",
+    "FORM_LOGIN_USER_USER": "Utilisateur",
+    "FORM_NAME_USER_USER": "Nom complet",
+    "FORM_EMAIL_USER_USER": "E-mail",
+    "FORM_AGENCY_USER_USER": "Société",
+    "FORM_DEPARTMENT_USER_USER": "Service",
+    "FORM_USER_PASSWORD_USER_USER": "Mot de passe",
+    "FORM_USER_CONFIRM_PASSWORD_USER_USER": "Confirmer le mot de passe",
+    "FORM_INFORMATIONS_USER_USER": "Informations",
+    "FORM_NEW_PASSWORD_USER_USER": "Nouveau mot de passe",
+    "ACCOUNT_UNSUBSCRIBE" : "Désactiver votre compte",
+    "": "",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA1": "Attention, il est fortement déconseillé d'avoir un objet métier dans le schéma ",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA2": ", en effet lors des mises à jour les tables crées dans ce schéma risquent d'être effacées.",
+    "CREATE_BO_ON_UNRECOMMENDED_SCHEMA3": "Voulez vous vraiment continuer ?",
+    "": "",
+    "ERROR_BO_DELETE_EVENT": "Un événement est lié à l'objet métier",
+    "ERROR_BO_DELETE_REPPORT": "Un rapport est lié à l'objet métier",
+    "ERROR_BO_DELETE_LAYER": "Une ou plusieurs couches sont liées à l'objet métier",
+    "": "",
+    "CTRL_IMPORT_VEX_IMPORT_TITLE": "Importer un fichier VEX",
+    "CTRL_IMPORT_VEX_STEP_import_vex_file": "Import fichier",
+    "CTRL_IMPORT_VEX_STEP_config": "Configuration",
+    "CTRL_IMPORT_VEX_STEP_vmap_objects": "Objets vMap",
+    "CTRL_IMPORT_VEX_STEP_import_sql": "SQL",
+    "CTRL_IMPORT_VEX_STEP_web_services": "Services WEB",
+    "CTRL_IMPORT_VEX_STEP_execute_import": "Execution",
+    "CTRL_IMPORT_VEX_STEP_finalize": "Fin",
+    "": "",
+    "CTRL_IMPORT_VEX_LOADING": "Chargement...",
+    "CTRL_IMPORT_VEX_OR": "ou",
+    "CTRL_IMPORT_VEX_AND": "et",
+    "CTRL_IMPORT_VEX_IMPORT_VEX_FILE": "Import du fichier VEX",
+    "CTRL_IMPORT_VEX_SELECT_FILE": "Sélectionner un fichier",
+    "CTRL_IMPORT_VEX_CONFIGURATION": "Configuration",
+    "CTRL_IMPORT_VEX_SELECT_DB": "Base de données",
+    "CTRL_IMPORT_VEX_SELECT_SCHEMA": "Schéma",
+    "CTRL_IMPORT_VEX_SELECT_EXISTING_SCHEMA": "Parmi un schéma existant",
+    "CTRL_IMPORT_VEX_SELECT_SCHEMA_OR": "ou",
+    "CTRL_IMPORT_VEX_CREATE_SCHEMA": "Création d'un nouveau schéma",
+    "CTRL_IMPORT_VEX_SELECT_COORDSYS": "Système de coordonnées",
+    "CTRL_IMPORT_VEX_SELECT_ELEMENTS": "Éléments à importer",
+    "CTRL_IMPORT_VEX_SELECT_ROLE": "Rôles PostgreSQL",
+    "CTRL_IMPORT_VEX_SELECT_USER_ROLE": "Lecture seule",
+    "CTRL_IMPORT_VEX_SELECT_ADMIN_ROLE": "Lecture et écriture",
+    "CTRL_IMPORT_VEX_SELECT_VMAP_OBJETS": "Objets vMap à importer",
+    "CTRL_IMPORT_VEX_SELECT_SQL_MODEL": "Modèle de données",
+    "CTRL_IMPORT_VEX_SELECT_SQL_DATA": "Données",
+    "CTRL_IMPORT_VEX_WEB_SERVICES": "Services WEB",
+    "CTRL_IMPORT_VEX_IMPORT_EXECUTION": "Execution de l'import",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS": "Objets vMap",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_MAPS": "Cartes",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_SERVICES": "Services",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUES": "Calques",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUE_THEMES": "Thèmes des calques",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_VM4MS_LAYERS": "Couches Mapserver",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_BUSINESS_OBJECTS": "Objets métier",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_EVENTS": "Evènements",
+    "CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_REPORTS": "Rapports",
+    "CTRL_IMPORT_VEX_IMPORT_WEB_SERVICES": "Services WEB",
+    "CTRL_IMPORT_VEX_IMPORT_SQL": "SQL",
+    "CTRL_IMPORT_VEX_IMPORT_SQL_MODEL": "Modèle de données",
+    "CTRL_IMPORT_VEX_IMPORT_SQL_DATA": "Données",
+    "CTRL_IMPORT_VEX_TO_DO": "Ce qu'il vous reste à faire:",
+    "CTRL_IMPORT_VEX_TO_DO_MAP": "Affecter des groupes à la carte importée",
+    "CTRL_IMPORT_VEX_TO_DO_PGADMIN": "Affiner les droits sur Pg-admin",
+    "": "",
+    "CTRL_IMPORT_VEX_ERROR_SELECT_VEX_FILE": "Veuillez sélectionner un fichier VEX",
+    "CTRL_IMPORT_VEX_ERROR_VEX_IMPORT_FAIL": "Erreur lors de l'import du fichier VEX",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_VMAP_OBJETS": "Erreur lors de la récupération des objets vMap",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_EXISTING_WEB_SERVICES": "Erreur lors de la récupération des services WEB",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_DATABASES": "Erreur lors de la récupération des bases de données",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_SCHEMAS": "Erreur lors de la récupération des schémas",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_ROLEGROUPS": "Erreur lors de la récupération des rôles de connexion",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_COORDSYS": "Erreur lors de la récupération des systèmes de coordonnées",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_GET_PRIVATE_CONNECTION": "Erreur lors de la récupération de la connexion privée",
+    "CTRL_IMPORT_VEX_ERROR_PRIVATE_CONNECTION_DATABASE_DIFFERENT": "Attention: <br><br>La base de données utilisée par la connexion privée du module Mapserver est différente de celle sélectionnée. <br><br>Il faudra reconfigurer les couches mapserver pour qu'elles puissent fonctionner correctement",
+    "CTRL_IMPORT_VEX_ERROR_DATABASE_REQUIRED": "Base de données requis",
+    "CTRL_IMPORT_VEX_ERROR_SCHEMA_REQUIRED": "Schéma requis",
+    "CTRL_IMPORT_VEX_ERROR_COORDSYS_REQUIRED": "Système de coordonnées requis",
+    "CTRL_IMPORT_VEX_ERROR_USER_ROLE_REQUIRED": "Rôle utilisateur requis",
+    "CTRL_IMPORT_VEX_ERROR_ADMIN_ROLE_REQUIRED": "Rôle administrateur requis",
+    "CTRL_IMPORT_VEX_ERROR_EDIT_NAME_NOT_VALID": "Nouveau nom non valide",
+    "CTRL_IMPORT_VEX_ERROR_EXISTING_VMAP_OBJETS": "Attention <br><br>[number] objet(s) déjà présent(s) sur l'application et mis à jour lors de l'import, cette opération est irréversible.<br><br>Il est possible de renommer les objets à importer en cliquant dessus. <br><br>Voulez-vous continuer ?",
+    "CTRL_IMPORT_VEX_WARNING_SQL": "Attention<br><br>En validant cette partie vous assumez la responsabilité du code SQL qui sera exectué sur le serveur.<br><br>Voulez-vous continuer ?",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_VMAP_OBJECTS": "Erreur lors de l'import des objets vMap",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_WEB_SERVICES": "Erreur lors de l'import des services web",
+    "CTRL_IMPORT_VEX_ERROR_REQUEST_IMPORT_SQL": "Erreur lors de l'import du SQL",
+    "": "",
+    "CTRL_IMPORT_VEX_NEXT": "Suivant",
+    "CTRL_IMPORT_VEX_PREVIOUS": "Précédent",
+    "CTRL_IMPORT_VEX_EXECUTE": "Executer",
+    "CTRL_IMPORT_VEX_TEST": "Tester",
+    "CTRL_IMPORT_VEX_FINISH": "Terminer",
+    "": "",
+    "CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES": "Privilèges insuffisants",
+    "CTRL_EXPORT_VEX_ERROR_INSUFFICIENT_PRIVILEGES_DESCRIPTION": "Pour utiliser les fonctions d'import, vous devez être administrateur Vitis, vMap et vMap4MapServer",
+    "CTRL_EXPORT_VEX_EXPORT_TITLE": "Exporter un fichier VEX",
+    "CTRL_EXPORT_VEX_LOADING": "Chargement...",
+    "CTRL_EXPORT_VEX_STEP_select_vmap_objects": "Objets vMap",
+    "CTRL_EXPORT_VEX_STEP_select_web_services": "Services WEB",
+    "CTRL_EXPORT_VEX_STEP_select_sql_objects": "SQL",
+    "CTRL_EXPORT_VEX_STEP_execute_export": "Execution",
+    "": "",
+    "CTRL_EXPORT_VEX_SELECT_VMAP_OBJETS": "Objets vMap à exporter",
+    "CTRL_EXPORT_VEX_SELECT_WEB_SERVICES": "Services WEB à exporter",
+    "CTRL_EXPORT_VEX_SELECT_SQL": "SQL à exporter",
+    "CTRL_EXPORT_VEX_EXPORT_EXECUTION": "Execution de l'export",
+    "CTRL_EXPORT_VEX_SELECT_DB": "Choix de la base de données",
+    "CTRL_EXPORT_VEX_GENERATE_VEX": "Générer un fichier VEX",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_VMAP_OBJETS": "Erreur lors de la récupération des objets vMap",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_WEB_SERVICES": "Erreur lors de la récupération des services web",
+    "CTRL_EXPORT_VEX_NO_RESULT_REQUEST_GET_WEB_SERVICES": "Aucun service web associé",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_DATABASES": "Erreur lors de la récupération des bases de données",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_GET_SQL_OBJECTS": "Erreur lors de la récupération des objets SQL",
+    "CTRL_EXPORT_VEX_ERROR_REQUEST_EXPORT_VEX": "Erreur lors de l'export VEX",
+    "": "",
+    "CTRL_EXPORT_VEX_NEXT": "Suivant",
+    "CTRL_EXPORT_VEX_PREVIOUS": "Précédent",
+    "CTRL_EXPORT_VEX_EXECUTE": "Executer",
+    "CTRL_EXPORT_VEX_TEST": "Tester",
+    "CTRL_EXPORT_VEX_FINISH": "Terminer",
+    "": "",
+    "ERROR_SERVICE_ASSOCIATED": "Un service vMap est associé",
+    "ERROR_WMSSERVICE_ASSOCIATED": "Un service WMS est associé",
+    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées."
+}
diff --git a/module/less/main.less b/module/less/main.less
new file mode 100755
index 0000000000000000000000000000000000000000..17841d7aef18e7dd6763b48f6aa309197852da67
--- /dev/null
+++ b/module/less/main.less
@@ -0,0 +1,5 @@
+// LESS
+@ui-grid-bg-image: "../images/ui-grid/wbg.gif";
+@font-color-purple: #6d1a67;
+@test-color: black;
+@import 'map.less';
diff --git a/module/less/map.less b/module/less/map.less
new file mode 100755
index 0000000000000000000000000000000000000000..6771e47624ce85135a3df32e6acb14a688a6bcaa
--- /dev/null
+++ b/module/less/map.less
@@ -0,0 +1,16 @@
+/*
+.workspacelist-grid-footer-map {
+    text-align: center;
+}
+*/
+// Boutons pour changer l'ordre des calques.
+.map-layer-order-up {
+    position: absolute;
+    right: 22px;
+    top: 32px;
+}
+.map-layer-order-down {
+    position: absolute;
+    right: 22px;
+    bottom: 20px;
+}
\ No newline at end of file
diff --git a/module/template/layers/layersorder.html b/module/template/layers/layersorder.html
new file mode 100755
index 0000000000000000000000000000000000000000..93b9e4b44f775c61cb93c62f77248ce848f403f9
--- /dev/null
+++ b/module/template/layers/layersorder.html
@@ -0,0 +1,41 @@
+<div id="layersorder-button">
+    <div class="list-group-item active pointer layersorder-button-content" 
+         title="Outil de modification de l'ordre des couches" 
+         collapse="{{ctrl.layersorder_collapsed === true ? 'out' : 'in'}}" 
+         data-target="#layersorder" 
+         onclick="oVmap.getMapManager().collapseElement(this)">
+        <span class="icon-layers2 list-group-icon"></span>
+        <span>Table des matières</span>
+        <span class="list-group-icon2"
+              ng-class="{'icon-keyboard_arrow_down':ctrl.layersorder_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.layersorder_collapsed === true}"></span>
+    </div>
+</div>
+
+<div id="layersorder" class="layers-tool" collapse="{{ctrl.layersorder_collapsed === true ? 'out' : 'in'}}">
+    <div class="indicators" style="margin-right: 4px;">
+        <span class="text-info icon-eye" style="font-size: 18px;line-height: 0"></span>
+    </div>
+    <ul class="sortable-list layer-order-list">
+        <!-- Affiche uniquement les couches qui ont un nom -->
+        <li ng-repeat="layer in ctrl.selectedLayers"
+            class="{{layer.get('type')}}-layer-order-item layer-order-item auto-height"
+            data-hashkey="{{layer.$$hashKey}}">
+            <span class="sortable-handle order-layer">
+                <div class="glyphicon glyphicon-menu-hamburger legend-glyphicon" aria-hidden="true"></div>
+                <div class="layer-name layer-name-order" title="{{layer.get('name')}}">{{layer.get('name')}}</div>
+            </span>
+            <div class="margin-3">
+                <!-- Checkbox visible -->
+                <div class="checkbox checkbox-info inline-checkbox">
+                    <input id="{{$id}}_visible_order_checkbox" 
+                           type="checkbox" 
+                           style="cursor:pointer" 
+                           title="Definit si la couche est visible"
+                           ng-checked="layer.values.visible === true"
+                           ng-click="ctrl.setVisible(layer, !layer.values.visible)">
+                    <label for="{{$id}}_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                </div>
+            </div>
+        </li>
+    </ul>
+</div>
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
new file mode 100644
index 0000000000000000000000000000000000000000..5002135b16e7963f77a07de5163eee7f95c04f80
--- /dev/null
+++ b/module/template/layers/layertree.html
@@ -0,0 +1,172 @@
+<div ng-if="!$root.is_mobile" id="layertree-button">
+    <div class="list-group-item active pointer layertree-button-content"
+         title="Affiche les jeux de données"
+         collapse="{{ctrl.layerstree_collapsed === true ? 'out' : 'in'}}"
+         data-target="#layertree"
+         onclick="oVmap.getMapManager().collapseElement(this)">
+
+        <span class="icon-database list-group-icon"></span>
+        <span>Jeux de données</span>
+        <span class="list-group-icon2" ng-class="{'icon-keyboard_arrow_down':ctrl.layerstree_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.layerstree_collapsed === true}"></span>
+    </div>
+</div>
+
+<div id="layertree" class="layers-tool" collapse="{{ctrl.layerstree_collapsed === true ? 'out' : 'in'}}">
+    <div class="indicators">
+        <span class="text-info icon-eye" style="font-size: 18px;line-height: 0" title="Définit si la couche est visible"></span>
+    </div>
+    <ul class="tree">
+        <div ng-repeat="node in tree.children| orderBy : 'name'" ng-if="node.view === undefined">
+
+            <!-- Service -->
+            <div class="layerstree-phather">
+                <div class="tree-father-collapse-btn service-name left" data-toggle="collapse" data-target="#tree_element_{{$id}}" onclick="setTimeout(function () {
+                                oVmap.resizeLayerTools(true)
+                            }, 500)" title="{{node.name}}">
+                    {{node.name}}
+                </div>
+                <div class="checkbox checkbox-info inline-checkbox right"
+                     ng-class="{'checkbox_indeterminate': node.visible === null}">
+                    <input id="service_{{$id}}_visible"
+                           ng-init="node.visible = ctrl.isGroupVisible(node)"
+                           ng-model="node.visible"
+                           ng-model-options="{getterSetter: true}"
+                           ng-click="ctrl.setGroupVisible(node)"
+                           type="checkbox"
+                           style="cursor:pointer; position: absolute"
+                           title="Definit si le groupe est visible">
+                    <label for="service_{{$id}}_visible"
+                           style="cursor:pointer"
+                           title="Definit si le groupe est visible"></label>
+                </div>
+            </div>
+
+            <!-- Calque -->
+            <ul id="tree_element_{{$id}}" class="collapse layers-tree-ul tree-element" ng-class="{'in': ctrl.layers_collapsed !== true}">
+                <div ng-repeat="layer in node.children">
+                    <li>
+                        <ul class="list-group-item layertree-item auto-height">
+
+                            <!-- Nom du calque -->
+                            <div class="layer-name layer-name-tree" title="{{layer.name}}">{{layer.name}}</div>
+                            <div class="layer-checkboxes">
+                                <button type="button"
+                                        class="btn btn-xs margin-sides-10 hidden"
+                                        ng-click="layer.olLayer.getSource().refreshWithTimestamp()">
+                                    <span class="glyphicon glyphicon-refresh"></span>
+                                </button>
+                                <div type="button" class="btn btn-xs layer-menu-button" ng-click="ctrl.toggleLayerMenu(layer, $event)">
+                                    <span ng-class="{'icon-filter': layer.olLayer.get('is_filtered'), 'icon-format_list_bulleted': !layer.olLayer.get('is_filtered')}"></span>
+                                </div>
+                                <!-- Checkbox visible -->
+                                <div class="checkbox checkbox-info inline-checkbox" style="z-index: 10;">
+                                    <input id="{{layer.$$hashKey}}_visible_order_checkbox"
+                                           type="checkbox"
+                                           style="cursor:pointer; position: absolute"
+                                           title="Definit si le calque est visible"
+                                           ng-checked="layer.olLayer.values.visible === true"
+                                           ng-click="ctrl.setVisible(layer.olLayer, !layer.olLayer.values.visible);node.visible = ctrl.isGroupVisible(node)">
+                                    <label for="{{layer.$$hashKey}}_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                                </div>
+                                <!-- Checkbox interrogation GetFeatureInfo -->
+                                <div class="checkbox checkbox-success inline-checkbox"
+                                        ng-if="layer.olLayer.values.is_queryable_getfeatureinfo === true && ctrl.properties.selection.enable_getfeatureinfo === true"
+                                        ng-class="{'checkbox_indeterminate': ctrl.isLayerWMSQueryable(layer.olLayer) === null}">
+                                    <input id="{{layer.$$hashKey}}_wms_queryable_checkbox"
+                                           type="checkbox"
+                                           style="cursor:pointer; position: absolute"
+                                           title="Definit si le calque est interrogeable par requête WMS"
+                                           ng-disabled="layer.olLayer.values.visible === false"
+                                           ng-checked="ctrl.isLayerWMSQueryable(layer.olLayer)"
+                                           ng-click="ctrl.toggleLayerWMSQueryable(layer.olLayer)">
+                                    <label for="{{layer.$$hashKey}}_wms_queryable_checkbox" style="cursor:pointer" title="Definit si le calque est interrogeable par requête WMS"></label>
+                                </div>
+                            </div>
+                        </ul>
+                    </li>
+                    <div class="dropdown-menu layer-menu" ng-class="{'block': layer.displayedMenu === true}">
+                        <div class="layer-menu-list">
+                            <li ng-if="layer.olLayer.get('is_filtered')" ng-click="ctrl.displayFilterLayerModal(layer.olLayer)">
+                                <a href="#">
+                                    <span class="icon-filter"></span>
+                                    Filtre
+                                </a>
+                            </li>
+                            <li>
+                                <a href="#">
+                                    <div class="row">
+                                        <div class="col-xs-6">
+                                            <span class="icon-star-half"></span>
+                                            Transparence
+                                        </div>
+                                        <div class="col-xs-6">
+                                            <div class="layer-menu-list-slider">
+                                                <input data-app-layer-opacity-slider="" id="slider_layer_form_{{layer.$$hashKey}}" type="text">
+                                            </div>
+                                        </div>
+                                    </div>
+                                </a>
+                            </li>
+                            <li ng-if="layer.olLayer.get('type') === 'imagewms' || layer.olLayer.get('type') === 'tilewms'"
+                                ng-repeat="sublayer in layer.olLayer.get('sublayers')">
+                                <div class="sublayer-checkboxes">
+                                    <!-- Checkbox interrogation GetFeatureInfo -->
+                                    <div class="checkbox checkbox-success sublayer-checkbox inline-checkbox" ng-if="layer.olLayer.values.is_queryable_getfeatureinfo === true && ctrl.properties.selection.enable_getfeatureinfo === true">
+                                        <input id="{{layer.$$hashKey}}_sublayer_{{sublayer}}_wms_queryable_checkbox"
+                                        type="checkbox"
+                                        style="cursor:pointer; position: absolute"
+                                        title="Definit si la couche est est interrogeable par requête WMS"
+                                        ng-checked="ctrl.isSublayerWMSQueryable(layer.olLayer, sublayer)"
+                                        ng-disabled="layer.olLayer.values.visible !== true"
+                                        ng-click="ctrl.toggleSublayerWMSQueryable(layer.olLayer, sublayer)">
+                                        <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_wms_queryable_checkbox" style="cursor:pointer" title="Definit si la couche est interrogeable par requête WMS"></label>
+                                    </div>
+                                    <!-- Checkbox visible -->
+                                    <div class="checkbox checkbox-info sublayer-checkbox inline-checkbox">
+                                        <input id="{{layer.$$hashKey}}_sublayer_{{sublayer}}_visible_checkbox"
+                                               type="checkbox"
+                                               style="cursor:pointer; position: absolute"
+                                               title="Definit si la couche est visible"
+                                               ng-checked="ctrl.isSublayerActive(layer.olLayer, sublayer)"
+                                               ng-disabled="layer.olLayer.values.visible !== true"
+                                               ng-click="ctrl.toggleSubLayer(layer.olLayer, sublayer, '#' + layer.$$hashKey + '_sublayer_' + sublayer + '_visible_checkbox')">
+                                        <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="Definit si la couche est visible">{{sublayer}}</label>
+                                    </div>
+                                </div>
+                            </li>
+                        </div>
+                    </div>
+                </div>
+            </ul>
+        </div>
+    </ul>
+</div>
+
+<!--Modale pour le filtrage-->
+<div id="layerstree-filter-modal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content" style="max-height: 100%">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title">Filtrer la couche: {{ctrl.olFilteredLayer.get('name')}}</h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3">
+                <div id="layerstree_filter_formreader"
+                     app-form-reader
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+            </div>
+            <div class="modal-footer modal-footer-sm">
+                <button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
+                <button type="button" class="btn btn-primary" onclick="oVmap.simuleClick('layerstree_filter_formreader_submit_btn')">Appliquer le filtre</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--
+    Bouton invisible qui sert à charger les cartes:
+    ceci a été fait car ce bouton a besoin de ctrl.reloadTree
+    qui se trouve uniquement ici. Pour appeler la fonction:
+-->
+<button id="btn-reload-map" style="display: none" ng-click="ctrl.reloadTree()">Reload map</button>
diff --git a/module/template/layers/maplegend.html b/module/template/layers/maplegend.html
new file mode 100755
index 0000000000000000000000000000000000000000..a82570aa249be47f2f17a50eb48f4238af16d693
--- /dev/null
+++ b/module/template/layers/maplegend.html
@@ -0,0 +1,34 @@
+<div class="maplegendtool">
+    <div ng-if="!$root.is_mobile" id="maplegendcontainer-button">
+        <div class="list-group-item active pointer maplegend-button-content" 
+             title="Légende de la carte" 
+             collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}"
+             data-target="#maplegendcontainer" 
+             onclick="oVmap.getMapManager().collapseElement(this)">
+            <span class="icon-info list-group-icon"></span>
+            <span>Légende</span>
+            <span class="list-group-icon2"
+                  ng-class="{'icon-keyboard_arrow_down':ctrl.legend_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.legend_collapsed === true}"></span>
+        </div>
+    </div>
+    <div id="maplegendcontainer" class="layers-tool legend" collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}">
+        <div id="maplegend" class="tree legend">
+            <div ng-repeat="(sLayerName, layer) in ctrl.oUrls" class="layer-legend"
+                 ng-show="ctrl.areLegendsLoaded(layer)">
+                <div id="legend_father{{$index}}" data-toggle="collapse" data-target="#legend_element_{{$index}}">
+                    <div style="display: inline-block; width:98%">
+                        <div class="legend_father_name" title="{{sLayerName}}">{{sLayerName}}</div>
+                    </div>
+                </div>
+                <div id="legend_element_{{$index}}" class="collapse in">
+                    <ul class="list-group-item auto-height">
+                        <div ng-repeat="node in layer"
+                             ng-show="node.legendBlobURL">                            
+                            <img ng-src="{{node.legendBlobURL}}" class="legend-img" legend-image-node>
+                        </div>
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/bingsuggestions.html b/module/template/layers/mapmodal/bingsuggestions.html
new file mode 100755
index 0000000000000000000000000000000000000000..73c103c1635603357940220ab7f594c0ff7134aa
--- /dev/null
+++ b/module/template/layers/mapmodal/bingsuggestions.html
@@ -0,0 +1,73 @@
+<!-- Liste des couches utilisables -->
+
+
+<h3>Ajouter une couche Bing Maps: </h3>
+<hr>
+
+<div>
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Couche:</b>
+        </div>
+        <div class="col-xs-4">
+            <b>Clé Bing:</b>
+        </div>
+        <div class="col-xs-3">
+            <b>Langue:</b>
+        </div>
+        <div class="col-xs-2">
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-xs-3">
+            <input type="text" ng-model="ctrl.sImagerySet" class="form-control" placeholder="Type of imagery" aria-describedby="sizing-addon1">
+        </div>
+        <div class="col-xs-4">
+            <input type="text" ng-model="ctrl.sKey" class="form-control" placeholder="Bing Maps API Key" aria-describedby="sizing-addon1">
+        </div>
+        <div class="col-xs-3">
+            <select ng-model="ctrl.sCulture" class="form-control">
+                <option value="fr-FR">French</option>
+                <option value="en-US">English</option>
+            </select>
+        </div>
+        <div class="col-xs-2">
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+        </div>
+    </div>
+</div>
+
+<br>
+<hr>
+
+<div ng-repeat="node in ctrl.catalog.services.bing">
+    <div class="row">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
+            <img src="{{node.thumbnail}}" 
+                 class="img-responsive pointer opacity-hover" 
+                 ng-click="ctrl.addLayer(node)">
+        </div>
+        <div class="col-xs-9">
+            <b>{{node.imagerySet}}</b>
+            <p>
+                <i>
+                    {{node.description}}
+                </i>
+            </p>
+            <p>
+                Lang: <i>{{node.culture}}</i>
+            </p>
+        </div>
+    </div>
+    <div class="row" style="margin-bottom: -15px">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'"></div>
+        <div class="auto-overflow" ng-class="{ 'col-xs-7': (node.thumbnail | getType) == 'string', 'col-xs-10': (node.thumbnail | getType) != 'string' }">
+            <b>key</b>: <i>{{node.key}}</i>
+        </div>
+        <div class="col-xs-2">
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+        </div>
+    </div>
+    <hr>
+</div>
+<button id="btn-reload-bing" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/loadgeometry.html b/module/template/layers/mapmodal/loadgeometry.html
new file mode 100755
index 0000000000000000000000000000000000000000..91a3b423bf39239ba40af70babc47f9d6613b2ab
--- /dev/null
+++ b/module/template/layers/mapmodal/loadgeometry.html
@@ -0,0 +1,46 @@
+<!-- Liste des cartes utilisables -->
+<h3>Ajouter une géométrie: </h3>
+<hr>
+
+
+<div>
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Service</b>
+            <input type="text" ng-model="sServiceName" class="form-control" placeholder="Nom du service">
+        </div>
+        <div class="col-xs-3">
+            <b>Couche</b>
+            <input type="text" ng-model="sLayerTitle" class="form-control" placeholder="Nom de la couche">
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-12">
+            <b>Fichier ou URL</b>
+            <div class="input-group">
+                <input type="text" id="upload-geometry-file-info" class="form-control" ng-change="bIsUrl = true" ng-model="sFileName" placeholder="http://www.ma-carte.com/get-geometry.php">
+                <span class="input-group-btn">
+                    <span class="btn btn-success btn-file">                       
+                        Chercher&hellip; <input type="file" id="browse-geometry-button"/>
+                    </span>
+                </span>
+            </div>
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-12">
+            <b>Ou vous pouvez simplement déplacer le fichier ci-dessous</b>
+            <div class="upload-drop-zone" id="upload-geometry-file-drop-zone">Déplacer le fichier ici</div>
+            <div class="right"><i>Formats supportés: GPX, GeoJSON, IGC, KML, TopoJSON</i></div><br>
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-12">
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+        </div>
+    </div>
+</div>
+<button id="btn-reload-geometry" style="display: none" ng-click="ctrl.reload()"></button>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/maplist.html b/module/template/layers/mapmodal/maplist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f484cc331c25d69cb5ccbb75ce05221b1ef92c12
--- /dev/null
+++ b/module/template/layers/mapmodal/maplist.html
@@ -0,0 +1,155 @@
+<!-- Liste des cartes utilisables -->
+
+
+<h3>Liste des cartes utilisables: </h3>
+<hr>
+<div>
+    <div class="row">
+        <div class="col-md-10">
+            <b>Fichier:</b>
+        </div>
+        <div class="col-md-2">
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-md-10">
+            <div class="input-group">
+                <input type="text" id="upload-file-info" class="form-control" ng-model="ctrl.newMapUrl" placeholder="http://www.ma-carte.com/get-map.php">
+                <span class="input-group-btn">
+                    <span class="btn btn-success btn-file">
+                        Chercher&hellip; <input type="file" id="browse-map-button" onchange='oVmap.getMapManager().getMapModalTool().getMapListTool().changeFilePath(this)'>
+                    </span>
+                </span>
+            </div>
+        </div>
+        <div class="col-md-2">
+            <!-- l'attribut "url" est utilisé si on rentre le path à la main, si on rentre par le bouton "browse", alors on utilisera le contennu de browse-map-button -->
+            <button type="button" id="upload-file-add-button" url="{{ctrl.newMapUrl}}" file-container="" class="btn btn-success right" onclick="oVmap.getMapManager().loadMapFromFile(this)">Utiliser</button>
+        </div>
+    </div>
+</div>
+<br>
+<div class="upload-drop-zone" id="maplist-file-drop-zone">Déplacer le fichier ici</div>
+<div id="maplist-log-message"></div>
+<div class="row">
+    <div class="col-md-10"></div>
+    <div class="col-md-2">
+        <button type="button"
+                id="upload-file-new-map-button"
+                class="btn btn-success right"
+                data-toggle="modal"
+                data-target="#mapmodal-newmap-modal"
+                ng-click="ctrl.initNewMapForm()">
+            Nouvelle carte (vide)
+        </button>
+    </div>
+</div>
+
+<div ng-repeat="node in ctrl.catalog.maps">
+    <div class="row">
+        <div class="col-md-3">
+            <img src="{{node.thumbnail}}" url="{{node.url}}" class="img-responsive pointer opacity-hover" data-dismiss="modal" onclick="oVmap.getMapManager().loadMap(this)">
+        </div>
+        <div class="col-md-9">
+            <b>{{node.name}}</b>
+            <p>
+                <i>
+                    {{node.description}}
+                </i>
+            </p>
+        </div>
+    </div>
+    <div class="row" style="margin-bottom: -15px">
+        <div class="col-md-3"></div>
+        <div class="col-md-6">
+            <div ng-if="node.theme_name !== null && node.theme_name !== undefined">
+                <b>Thème</b>: <i>{{node.theme_name}}</i>
+            </div>
+        </div>
+        <div class="col-md-3">
+            <button type="button" url="{{node.url}}" class="btn btn-primary right" data-dismiss="modal" onclick="oVmap.getMapManager().loadMap(this)">Utiliser cette carte</button>
+        </div>
+    </div>
+    <hr>
+</div>
+<button id="btn-reload-maplist" style="display: none" ng-click="ctrl.reload()">Reload map</button>
+
+
+
+<!-- new map modal -->
+<div id="mapmodal-newmap-modal" class="modal fade" role="dialog">
+    <div class="modal-dialog">
+
+        <!-- Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" onclick="$('#mapmodal-newmap-modal').modal('hide')">&times;</button>
+                <h4 class="modal-title">Nouvelle carte</h4>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <label>Centre</label>
+                    <div class="row">
+                        <div class="col-md-4">
+                            <div class="input-group">
+                                <span class="input-group-addon">X: </span>
+                                <input type="float" class="form-control" ng-model="ctrl.mapForm.view.center[0]">
+                            </div>
+                        </div>
+                        <div class="col-md-4">
+                            <div class="input-group">
+                                <span class="input-group-addon">Y: </span>
+                                <input type="float" class="form-control" ng-model="ctrl.mapForm.view.center[1]">
+                            </div>
+                        </div>
+                        <div class="col-md-4">
+                            <div class="input-group">
+                                <button id="myMap-newMapForm-reproject"
+                                        class="btn btn-success"
+                                        title="Reprojeter en fonction de la nouvelle projection"
+                                        ng-click="ctrl.reprojectCenter()">Reprojeter</button>
+                            </div>
+                        </div>
+                    </div>
+                    <br>
+
+                    <label>Niveau de zoom</label>
+                    <div class="row">
+                        <div class="col-md-3">
+                            <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.zoom">
+                        </div>
+                    </div>
+                    <br>
+                    <label>Niveau de zoom maximum</label>
+                    <div class="row">
+                        <div class="col-md-3">
+                            <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.maxZoom">
+                        </div>
+                    </div>
+                    <br>
+                    <label>Niveau de zoom minimum</label>
+                    <div class="row">
+                        <div class="col-md-3">
+                            <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.minZoom">
+                        </div>
+                    </div>
+                    <br>
+
+                    <label>Projection</label>
+                    <select class="form-control" ng-model="ctrl.mapForm.view.projection">
+                        <option ng-repeat="(key, value) in ctrl.projections"
+                                value="{{key}}">{{value}}</option>
+                    </select>
+                    <br>
+                    <br>
+                    <div style="width: 100%">
+                        <button type="submit"
+                                class="btn btn-primary center"
+                                onclick="$('#mapmodal-newmap-modal').modal('hide')"
+                                ng-click="ctrl.createNewMap()">Créér et utiliser</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/layers/mapmodal/maplistlitle.html b/module/template/layers/mapmodal/maplistlitle.html
new file mode 100644
index 0000000000000000000000000000000000000000..2089b99cf5622ae5d17850d76b84c3b77b3102f1
--- /dev/null
+++ b/module/template/layers/mapmodal/maplistlitle.html
@@ -0,0 +1,64 @@
+<!-- Liste des cartes utilisables -->
+<div>
+    <!--Champ de recherche-->
+    <div style="width: 100%; height: 30px;">
+
+        <select class="form-control minus left margin-5 margin-sides-10" style="width: 200px" ng-model="filterTheme">
+            <option value="">Tous</option>
+            <option ng-repeat="theme in themes | orderBy" ng-value="theme">{{theme}}</option>
+        </select>
+
+        <input class="form-control input-sm right margin-sides-10 margin-5"
+               type="text"
+               placeholder="Rechercher"
+               style="width: 200px;"
+               ng-model="filter">
+    </div>
+
+    <!--Liste des cartes-->
+    <div class="map-list-litle-panel-list">
+        <div ng-repeat="oTheme in mapsByThemes" class="margin-sides-5 row">
+
+            <div ng-init="collapsedThemes[oTheme.themeId] = false">
+                <span class="arrow-collapse pointer"
+                      ng-class="{'icon-keyboard_arrow_right': (collapsedThemes[oTheme.themeId] === true), 'icon-keyboard_arrow_down': (collapsedThemes[oTheme.themeId] !== true)}"
+                      ng-click="collapsedThemes[oTheme.themeId] = !collapsedThemes[oTheme.themeId]"></span>
+                <span class="pointer"
+                      ng-click="collapsedThemes[oTheme.themeId] = !collapsedThemes[oTheme.themeId]">{{oTheme.themeId === 'null' ? 'Autres' : oTheme.themeName}}</span>
+            </div>
+            <hr style="margin: 3px 15px">
+
+            <div id="maplistlitle_{{$index}}_maps" ng-show="collapsedThemes[oTheme.themeId] !== true">
+                <div ng-repeat="map in oTheme.maps| orderBy: 'name'">
+                    <div ng-if="($index + 1) % 4 === 0" class="row">
+                        <div url="{{map.url}}"
+                             title="{{map.description}}"
+                             class="col-md-3 margin-10 pointer opacity-hover underline-hover maplist-map"
+                             style="text-align: center; font-size: 12px;"
+                             onclick="oVmap.getMapManager().loadMap(this)"
+                             data-dismiss="modal">
+
+                            <div onclick="$('#maplistlitle-container').removeClass('open')" ng-class="{'border-black': map.used === true}" style="overflow:hidden" ng-attr-title="{{map.description}}">
+                                <div class="img-map" style="background-image: url('{{map.thumbnail}}')"></div>
+                                <span>{{map.name}}</span>
+                            </div>
+                        </div>
+                    </div>
+                    <div ng-if="($index + 1) % 4 !== 0"
+                         url="{{map.url}}"
+                         title="{{map.description}}"
+                         class="col-md-3 margin-10 pointer opacity-hover underline-hover maplist-map"
+                         style="text-align: center; font-size: 12px;"
+                         onclick="oVmap.getMapManager().loadMap(this)"
+                         data-dismiss="modal">
+
+                        <div onclick="$('#maplistlitle-container').removeClass('open')" ng-class="{'border-black': map.used === true}" style="overflow:hidden" ng-attr-title="{{map.description}}">
+                            <div class="img-map" style="background-image: url('{{map.thumbnail}}')"></div>
+                            <span>{{map.name}}</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/layers/mapmodal/maplistlitle_mobile.html b/module/template/layers/mapmodal/maplistlitle_mobile.html
new file mode 100644
index 0000000000000000000000000000000000000000..1c7713ffa71b6345a23fbd964ae430141e4d5f90
--- /dev/null
+++ b/module/template/layers/mapmodal/maplistlitle_mobile.html
@@ -0,0 +1,44 @@
+<!-- Liste des cartes utilisables -->
+<div class="height-100">
+    <!-- Recherche -->
+    <div style="width: 100%; height: 30px;">
+        <div class="row">
+            <div class="col-xs-6">
+                <select class="form-control minus left margin-5 margin-sides-10" ng-model="filterTheme">
+                    <option value="">Tous</option>
+                    <option ng-repeat="theme in themes track by $index" ng-value="theme">{{theme}}</option>
+                </select>
+            </div>
+            <div class="col-xs-6">
+                <input class="form-control input-sm right margin-sides-10 margin-5" type="text" placeholder="Rechercher" ng-model="filter">
+            </div>
+        </div>
+    </div>
+    <!-- Liste -->
+    <div class="map-list-litle-panel-list">
+        <div ng-repeat="oTheme in mapsByThemes" class="margin-sides-5 row">
+
+            <div>
+                <span class="arrow-collapse icon-keyboard_arrow_down"></span>
+                <span class="pointer">{{oTheme.themeId === 'null' ? 'Autres' : oTheme.themeId}}</span>
+            </div>
+            <hr style="margin: 3px 15px">
+
+            <div id="maplistlitle_{{$index}}_maps">
+                <div ng-repeat="map in oTheme.maps| orderBy: 'name'"
+                     class="col-xs-6 col-sm-3 margin-10" >
+                    <div url="{{map.url}}"
+                         title="{{map.description}}"
+                         style="text-align: center; font-size: 12px;"
+                         onclick="oVmap.getMapManager().loadMap(this)">
+
+                        <div ng-class="{'border-black': map.used === true}" style="overflow:hidden" ng-attr-title="{{map.name}}">
+                            <div class="img-map" style="background-image: url('{{map.thumbnail}}')"></div>
+                            <span>{{map.name}}</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/layers/mapmodal/mapmodal.html b/module/template/layers/mapmodal/mapmodal.html
new file mode 100755
index 0000000000000000000000000000000000000000..564c21f759c19544a482e9d3a31bf3f19fe018de
--- /dev/null
+++ b/module/template/layers/mapmodal/mapmodal.html
@@ -0,0 +1,61 @@
+<!-- Fichier contenant la fenêtre modale -->
+<div class="modal-dialog modal-l">
+    <div class="modal-content">
+        <div class="modal-header">
+            <button type="button" id="close-modal-button" class="close" data-dismiss="modal">&times;</button>
+            <h4 class="modal-title">Gestion des cartes</h4>
+        </div>
+        <!-- Body -->
+        <div class="modal-body modal-body-big">
+
+            <div class="row" style="height: 100%;">
+                <div class="col-md-3" style="width: 20%">
+                    <br>
+                    <ul class="nav nav-pills nav-stacked" style="width: 180px">
+                        <br>
+                        <li data-toggle="pill" href="#modal-mymap" class="list-group-item list-group-item-modal active" onclick="oVmap.simuleClick('btn-reload-myMap')">Ma carte</li>
+                        <li data-toggle="pill" href="#modal-maplist" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-maplist')">Changer de carte</li>
+                        <br>
+                        <br>
+                        <i class="center"> -- Ajout de couches -- </i>
+                        <br>
+                        <br>
+                        <li data-toggle="pill" href="#modal-wms" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wms')">Service WMS</li>
+                        <li data-toggle="pill" href="#modal-wmts" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wmts')">Service WMTS</li>
+                        <li data-toggle="pill" href="#modal-xyz" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-xyz')">Service XYZ</li>
+                        <li id="modal-geometry-modal-button" data-toggle="pill" href="#modal-geometry" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-geometry')">Fichier local</li>
+                        <li data-toggle="pill" href="#modal-osm" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-osm')">Open Street Map</li>
+                        <li data-toggle="pill" href="#modal-bing" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-bing')">Bing Maps</li>
+                    </ul>
+                </div>
+
+                <div class="col-md-9" style="height: 100%;width: 80%">
+                    <div id="modal-mymap" class="mapmodal-element fade in active">
+                        <app-mymap app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-mymap>
+                    </div>
+                    <div id="modal-maplist" class="mapmodal-element fade">
+                        <app-maplist app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-maplist>
+                    </div>
+                    <div id="modal-wms" class="mapmodal-element fade">
+                        <app-wmssuggestions app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-wmssuggestions>
+                    </div>
+                    <div id="modal-wmts" class="mapmodal-element fade">
+                        <app-wmtssuggestions app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-wmtssuggestions>
+                    </div>
+                    <div id="modal-xyz" class="mapmodal-element fade">
+                        <app-xyzsuggestions app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-xyzsuggestions>
+                    </div>
+                    <div id="modal-geometry" class="mapmodal-element fade">
+                        <app-loadgeometry app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-loadgeometry>
+                    </div>
+                    <div id="modal-osm" class="mapmodal-element fade">
+                        <app-osmsuggestions app-lang="ctrl.lang" app-proj="ctrl.proj" app-map="ctrl.map"></app-osmsuggestions>
+                    </div>
+                    <div id="modal-bing" class="mapmodal-element fade">
+                        <app-bingsuggestions id="app-bingsuggestions" app-proj="ctrl.proj" app-lang="ctrl.lang" app-map="ctrl.map"</app-bingsuggestions>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/layers/mapmodal/mymap.html b/module/template/layers/mapmodal/mymap.html
new file mode 100755
index 0000000000000000000000000000000000000000..da0f769f163d046e75f2fb512a8dfd4592bd58e3
--- /dev/null
+++ b/module/template/layers/mapmodal/mymap.html
@@ -0,0 +1,87 @@
+<!-- Gestion de la carte en cours -->
+
+
+<h3>Carte en cours: </h3>
+
+<hr>
+
+<!-- Vue -->
+<br>
+<div class="input-group">
+    <span class="input-group-addon" id="sizing-addon2">Projection:</span>
+    <label type="text" class="form-control" value="{{ctrl.displayedView.projection}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.projection}}</label>
+</div>
+<br>
+<div class="row">
+    <div class="col-md-3">
+        <div class="input-group">
+            <span class="input-group-addon" id="sizing-addon2">Zoom:</span>
+            <label type="text" class="form-control" value="{{ctrl.displayedView.zoom}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.zoom}}</label>
+        </div>
+    </div>
+    <div class="col-md-9">
+        <div class="input-group">
+            <span class="input-group-addon" id="sizing-addon2">Centre:</span>
+            <label type="text" class="form-control" value="{{ctrl.displayedView.center}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.center}}</label>
+        </div>
+    </div>
+</div>
+<br>
+<div class="input-group">
+    <span class="input-group-addon" id="sizing-addon2">Etendue</span>
+    <label type="text" class="form-control font-12" value="{{ctrl.displayedView.extent}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.extent}}</label>
+</div>
+
+<br>
+<br>
+
+<!-- Liste des services & couches -->
+<div ng-repeat="service in ctrl.oLayersTree.children">
+
+    <div ng-if="service.children" class="tree my-map-tree white">
+        <ul style="padding-left: 0px">
+            <li>
+                <!-- service -->
+                <span>
+                    <div class="tree-father-collapse-btn" data-toggle="collapse" data-target="#tree_element_{{$id}}">
+                        {{service.name}}
+                    </div>
+                </span>
+                <ul id="tree_element_{{$id}}" class="collapse in">
+                    <!-- liste des couches -->
+                    <li ng-repeat="layer in service.children">
+                        <div class="list-group-item auto-height" style="margin-right: 30px">
+                            <div class="row">
+                                <div class="col-md-10" style="padding-right: 0px">
+                                    <div class="layer-name layer-name-tree">{{layer.name}}</div>
+                                    <div class="checkbox checkbox-info inline-checkbox">
+                                        <input ng-model="layer.olLayer.getVisible()" ng-model-options="{getterSetter: true}" type="checkbox" style="cursor:default; position: absolute" title="Definit si la couche est visible">
+                                        <label for="" style="cursor:default" title="Definit si la couche est visible"></label>
+                                    </div>
+                                </div>
+                                <div class="col-md-2">
+                                    <button class="btn btn-xs btn-warning glyphicon glyphicon glyphicon-trash right" aria-hidden="true" data-toggle="tooltip" title="Supprime la couche de la carte" ng-click="ctrl.removeLayer(layer.olLayer)"></button>
+                                </div>
+                            </div>						
+                        </div>
+                    </li>
+                </ul>
+            </li>
+        </ul>
+    </div>
+</div>
+
+<br>
+<div style="display: inline-block; width: 100%">
+
+    <div ng-if="ctrl.isIE">
+        <a id="exportMapButtonIe" class="btn btn-warning left" ng-click="ctrl.downloadBlob()">Télécharger ie</a>
+    </div>
+    <div ng-if="!ctrl.isIE">
+        <!-- le href est défini dans nsVmap.nsMapManager.nsMapModal.MyMap.mymapController.reloadMapFile -->
+        <a id="exportMapButton" class="btn btn-warning left" href="" download="map.json">Télécharger</a>
+    </div>
+
+
+</div>
+<button id="btn-reload-myMap" style="display: none" ng-click="ctrl.reloadTree()">Reload map</button>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/osmsuggestions.html b/module/template/layers/mapmodal/osmsuggestions.html
new file mode 100755
index 0000000000000000000000000000000000000000..cd6b870f1cd90782bcab1a4ecb0f96bdff38a5a9
--- /dev/null
+++ b/module/template/layers/mapmodal/osmsuggestions.html
@@ -0,0 +1,61 @@
+<!-- Liste des couches utilisables -->
+
+
+<h3>Ajouter une couche OSM: </h3>
+<hr>
+
+<div>
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Nom:</b>
+        </div>
+        <div class="col-xs-7">
+            <b>URL:</b>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-xs-3">
+            <input type="text" ng-model="ctrl.sLayerName" class="form-control" placeholder="Service name" aria-describedby="sizing-addon1">
+        </div>
+        <div class="col-xs-7">
+            <input type="text" ng-model="ctrl.sLayerUrl" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1">
+        </div>
+        <div class="col-xs-2">
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+        </div>
+    </div>
+</div>
+
+<br>
+<hr>
+
+<div ng-repeat="node in ctrl.catalog.services.osm">
+    <div class="row">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
+            <img src="{{node.thumbnail}}" 
+                 class="img-responsive pointer opacity-hover" 
+                 ng-click="ctrl.addLayer(node)">
+        </div>
+        <div class="col-xs-9">
+            <b>{{node.name}}</b>
+            <p>
+                <i>
+                    {{node.description}}
+                </i>
+            </p>
+        </div>
+    </div>
+    <div class="row" style="margin-bottom: -15px">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'"></div>
+        <div class="auto-overflow" ng-class="{ 'col-xs-7': (node.thumbnail | getType) == 'string', 'col-xs-10': (node.thumbnail | getType) != 'string' }">
+            <div>
+                <b>url</b>: <i>{{node.url}}</i>
+            </div>
+        </div>
+        <div class="col-xs-2">
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+        </div>
+    </div>
+    <hr>
+</div>
+<button id="btn-reload-osm" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/wmssuggestions.html b/module/template/layers/mapmodal/wmssuggestions.html
new file mode 100755
index 0000000000000000000000000000000000000000..f376667739b53412c9cee147b9b5190156853cbd
--- /dev/null
+++ b/module/template/layers/mapmodal/wmssuggestions.html
@@ -0,0 +1,109 @@
+<!-- Liste des cartes utilisables -->
+
+
+<h3>Ajouter une couche WMS: </h3>
+<hr>
+
+<form ng-submit="ctrl.getCapabilities()">
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Service: </b>
+            <select class="form-control" 
+                    ng-model="oSelectedService" 
+                    ng-options="oSelectedService.name for oSelectedService in aServices"></select>
+        </div>
+        <div class="col-xs-9">
+            <b>URL: </b>
+            <div class="input-group">
+                <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="oSelectedService.url" ng-change="ctrl.reloadServicesList()">
+                <span class="input-group-btn">
+                    <button type="submit" class="btn btn-success">Voir le contenu</button>
+                </span>
+            </div>
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-6">
+        </div>
+        <div class="col-xs-3">
+            <div class="form-group">
+                <b>Identifiant (optionnel):</b>
+                <input type="text" class="form-control" ng-model="oSelectedService.login" ng-change="ctrl.reloadServicesList()">
+            </div>
+        </div>
+        <div class="col-xs-3">
+            <div class="form-group">
+                <b>Mot de passe (optionnel):</b>
+                <input type="password" class="form-control" ng-model="oSelectedService.password" ng-change="ctrl.reloadServicesList()">
+            </div>
+        </div>
+    </div>
+</form>
+
+<div id="load-img-wms" style="display: none; text-align: center"><img src="images/ajax-load-big.gif"></div>
+<div id="wms-suggestions-list" style="display: none">
+
+    <input class="form-control input-sm right margin-sides-10 margin-5" 
+           type="text" 
+           placeholder="Rechercher" 
+           style="width: 200px;"
+           ng-model="filter">
+
+    <table class="table table-striped">
+        <thead>
+            <tr>
+                <th>Titre</th>
+                <th>Nom</th>
+                <th>Projection</th>
+                <th></th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr ng-repeat="node in ctrl.aLayersFiltered">
+                <td class="WMSSuggestionTitle">{{node.Title}}</td>
+                <td class="WMSSuggestion" title="{{node.Name}}">{{node.Name}}</td>
+                <td class="WMSSuggestion">{{node.projections}}</td>
+                <!-- Si la projeciton est bonne -->
+                <td class="WMSSuggestionsButton">
+                    <button type="button" 
+                            class="btn btn-info"
+                            ng-class="{'btn-danger': node.projections.indexOf(ctrl.proj) === -1}"
+                            ng-click="ctrl.addLayer(node)">Ajouter</button>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>
+<button id="btn-reload-wms" style="display: none" ng-click="ctrl.reload()">Reload map</button>
+
+<div id="wms-select-style-modal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" onclick="$('#wms-select-style-modal').modal('hide');" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title">{{ctrl.oLayerToAdd.Title}}</h4>
+            </div>
+            <div class="modal-body">
+                <form id="wms-select-style-modal-form"
+                      ng-submit="ctrl.addLayer(ctrl.oLayerToAdd, oSelectedStyle.Name)">
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <label>Style</label>                            
+                            <select class="form-control" 
+                                    ng-model="oSelectedStyle" 
+                                    ng-options="oStyle.Title for oStyle in ctrl.oLayerToAdd.Style"></select>
+                            <br>
+                            <div ng-repeat="(key, value) in ctrl.oLayerToAdd.Style[iSelectedStyleIndex]" ng-if="(value | getType) == 'string'">
+                                <label>{{key}}: </label>{{value}}
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="submit" class="btn btn-primary" form="wms-select-style-modal-form">Valider</button>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/wmtssuggestions.html b/module/template/layers/mapmodal/wmtssuggestions.html
new file mode 100755
index 0000000000000000000000000000000000000000..5a2f5eadc0ba26f1be0558d74624fc642ae0e6d0
--- /dev/null
+++ b/module/template/layers/mapmodal/wmtssuggestions.html
@@ -0,0 +1,133 @@
+<!-- Liste des cartes utilisables -->
+
+
+<h3>Ajouter une couche WMTS: </h3>
+<hr>
+
+<form ng-submit="ctrl.getCapabilities()">
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Service: </b>
+            <select id="select-wmts-service" class="form-control" 
+                    ng-model="iServiceIndex" 
+                    ng-change="ctrl.selectService(iServiceIndex)">
+                <option value=""></option>
+                <option ng-repeat="node in ctrl.catalog.services.wmts" value="{{$index}}">{{node.name}}</option>
+            </select>
+        </div>
+        <div class="col-xs-3">
+            <b>Type: </b>
+            <select id="select-wmts-service" class="form-control" 
+                    ng-model="ctrl.sRequestType">
+                <option value="KVP">KVP</option>
+                <option value="REST">REST</option>
+            </select>
+        </div>
+        <div class="col-xs-3">
+            <b>Version: </b>
+            <input type="text" id="getCapabilities-wmts-version-field" class="form-control" placeholder="Version" aria-describedby="sizing-addon1" ng-model="ctrl.sRequestVersion">
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-12">
+            <b>URL: </b>
+            <div class="input-group">
+                <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="ctrl.sRequestUrl">
+                <span class="input-group-btn">
+                    <button type="submit" class="btn btn-success">Voir le contenu</button>
+                </span>
+            </div>
+        </div>
+    </div>    
+</form>
+
+<br>
+
+<div id="load-img-wmts" style="display: none; text-align: center"><img src="images/ajax-load-big.gif"></div>
+<div id="wmts-suggestions-list" style="display: none">
+
+    <input class="form-control input-sm right margin-sides-10 margin-5" 
+           type="text" 
+           placeholder="Rechercher" 
+           style="width: 200px;"
+           ng-model="filter">
+
+    <table class="table table-striped">
+        <thead>
+            <tr>
+                <th>Titre</th>
+                <th>Nom</th>
+                <th>Matrice</th>
+                <th></th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr ng-repeat="oLayer in ctrl.aLayersFiltered">
+                <td class="WMTSSuggestionTitle" title="{{oLayer.Title}}">{{oLayer.Title}}</td>
+                <td class="WMTSSuggestion" title="{{oLayer.Identifier}}">{{oLayer.Identifier}}</td>
+                <td class="WMSSuggestion">
+                    <div ng-repeat="oMatrix in oLayer.TileMatrixSetLink">{{oMatrix.TileMatrixSet}}</div>
+                </td>
+                <!-- Si la projeciton est bonne -->
+                <td class="WMTSSuggestionsButton">
+                    <button type="button" 
+                            class="btn btn-info"
+                            ng-click="ctrl.addLayer(oLayer)">Ajouter</button>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>
+<button id="btn-reload-wmts" style="display: none" ng-click="ctrl.reload()">Reload map</button>
+
+<div id="wmts-select-matrix-modal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" onclick="$('#wmts-select-matrix-modal').modal('hide');" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title">{{ctrl.oLayerToAdd.Title}}</h4>
+            </div>
+            <div class="modal-body">
+
+                <div class="row">
+                    <div class="col-xs-4">
+                        <label>Style</label>
+                        <select class="form-control" 
+                                ng-model="oSelectedStyle" 
+                                ng-change="ctrl.sLayerToAdd_style_name = oSelectedStyle.Identifier"
+                                ng-options="oStyle.Title for oStyle in ctrl.oLayerToAdd.Style"></select>
+                        <br>
+                        <div ng-repeat="(key, value) in oSelectedStyle" ng-if="(value | getType) == 'string'">
+                            <label>{{key}}: </label>{{value}}
+                        </div>
+                    </div>
+                    <div class="col-xs-4">
+                        <label>Format</label>
+                        <select id="select-wmts-service" class="form-control" 
+                                ng-model="ctrl.sLayerToAdd_format_name">
+                            <option value="?"></option>
+                            <option ng-repeat="sFormat in ctrl.oLayerToAdd.Format" value="{{sFormat}}">{{sFormat}}</option>
+                        </select>
+                    </div>
+                    <div class="col-xs-4">
+                        <label>Matrice</label>
+                        <select id="select-wmts-service" class="form-control" 
+                                ng-model="ctrl.sLayerToAdd_matrix_name">
+                            <option value="?"></option>
+                            <option ng-repeat="oMatrix in ctrl.oLayerToAdd.TileMatrixSetLink" value="{{oMatrix.TileMatrixSet}}">{{oMatrix.TileMatrixSet}}</option>
+                        </select>
+                        <br>
+                        <div ng-repeat="(key, value) in ctrl.oLayerToAdd_matrix_def" ng-if="(value | getType) == 'string'">
+                            <label>{{key}}: </label>{{value}}
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" ng-click="ctrl.addLayerToAdd()">Valider</button>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/layers/mapmodal/xyzsuggestions.html b/module/template/layers/mapmodal/xyzsuggestions.html
new file mode 100755
index 0000000000000000000000000000000000000000..f07b7c08342d99f47c08b53c22fec7dba51908b3
--- /dev/null
+++ b/module/template/layers/mapmodal/xyzsuggestions.html
@@ -0,0 +1,71 @@
+<!-- Liste des couches utilisables -->
+
+
+<h3>Ajouter une couche XYZ: </h3>
+<i>
+    Services tuilés définis par XYZ dans l'URL exemple: http://tile.stamen.com/toner/{z}/{x}/{y}.png.
+    Par défaut, cela suit le modèle le plus utilisé où X(0) et Y(0) sont en haut à gauche.
+    Les grilles de type TMS où ces coordonnées se trouvent en bas à gauche peuvent
+    être utilisées en utilisant {-y} dans l'URL
+</i>
+<hr>
+
+<form ng-submit="ctrl.addLayer()">
+    <div class="row">
+        <div class="col-xs-3">
+            <b>Service:</b>
+            <input type="text" class="form-control" placeholder="Nom du service" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sService" required>
+        </div>
+        <div class="col-xs-3">
+            <b>Couche:</b>
+            <input type="text" class="form-control" placeholder="Nom de la couche" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sLayer" required>
+        </div>
+    </div>
+    <br>
+    <div class="row">
+        <div class="col-xs-10">
+            <b>URL: </b>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-xs-10">
+            <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sUrl" required>
+        </div>
+        <div class="col-xs-2">
+            <button type="submit" class="btn btn-success right">Ajouter</button>
+        </div>
+    </div>
+</form>
+
+<hr>
+
+<div ng-repeat="node in ctrl.catalog.services.xyz">
+    <div class="row">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
+            <img src="{{node.thumbnail}}" 
+                 class="img-responsive pointer opacity-hover" 
+                 ng-click="ctrl.addLayer(node)">
+        </div>
+        <div class="col-xs-9">
+            <b>{{node.name}}</b>
+            <p>
+                <i>
+                    {{node.description}}
+                </i>
+            </p>
+        </div>
+    </div>
+    <div class="row" style="margin-bottom: -15px">
+        <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'"></div>
+        <div class="auto-overflow" ng-class="{ 'col-xs-7': (node.thumbnail | getType) == 'string', 'col-xs-10': (node.thumbnail | getType) != 'string' }">
+            <div>
+                <b>url</b>: <i>{{node.url}}</i>
+            </div>
+        </div>
+        <div class="col-xs-2">
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+        </div>
+    </div>
+    <hr>
+</div>
+<button id="btn-reload-xyz" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
diff --git a/module/template/map/map.html b/module/template/map/map.html
new file mode 100755
index 0000000000000000000000000000000000000000..3b411e522279f80b57ea992c17df4bc89ceb09cd
--- /dev/null
+++ b/module/template/map/map.html
@@ -0,0 +1,82 @@
+<!-- Interface de saisie -->
+<div ng-if="$root.is_mobile" id="mobile-draw-menu" class="ol_draw_menu hidden">
+    <div class="ol_draw_menu_horizontal_bar"></div>
+    <div class="ol_draw_menu_vertical_bar"></div>
+    <div class="ol_draw_menu_top_buttons_container">
+        <div class="col-xs-6">
+            <div class="dropdown">
+                <button type="button" class="btn btn-warning" id="ol_draw_menu_dropdown_menu" data-toggle="dropdown">Menu <span class="caret"></span></button>
+                <ul class="dropdown-menu" aria-labelledby="ol_draw_menu_dropdown_menu">
+                    <li>
+                        <a href="#" ng-click="ctrl.cancelMobileDraw()">
+                            <span class="icon-block"></span>
+                            Annuler la saisie
+                        </a>
+                    </li>
+                    <li>
+                        <a href="#" ng-click="ctrl.undoLastChange()">
+                            <span class="icon-rotate_left"></span>
+                            Précédent
+                        </a>
+                    </li>
+                    <li>
+                        <a href="#" ng-click="ctrl.redoLastChange()">
+                            <span class="icon-rotate_right"></span>
+                            Suivant
+                        </a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+        <div class="col-xs-6">
+            <button type="button" class="btn btn-warning" ng-disabled="!ctrl.isDrawFeatureComplete()" ng-click="ctrl.finishMobileDraw()">Terminer</button>
+        </div>
+    </div>
+    <div class="ol_draw_menu_bottom_buttons_container">
+        <div class="col-xs-6">
+            <button type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">Localiser</button>
+        </div>
+        <div class="col-xs-6">
+            <button type="button" class="btn btn-warning" ng-click="ctrl.addMobileDrawPoint()">Ajouter</button>
+        </div>
+    </div>
+</div>
+
+<!-- Interface de modification -->
+<div ng-if="$root.is_mobile" id="mobile-geom-edit-menu" class="ol_draw_menu hidden">
+    <div class="ol_geom_edit_menu_horizontal_bar"></div>
+    <div class="ol_geom_edit_menu_vertical_bar"></div>
+    <div class="ol_draw_menu_top_buttons_container">
+        <div ng-show="edit_state === 1" class="color-white text-center">
+            <h4>Choix du vertex à modifier</h4>
+        </div>
+        <div class="col-xs-6">
+            <div ng-show="edit_state === 2" class="dropdown">
+                <button type="button" class="btn btn-warning" id="ol_geom_edit_menu_dropdown_menu" data-toggle="dropdown">Menu <span class="caret"></span></button>
+                <ul class="dropdown-menu" aria-labelledby="ol_geom_edit_menu_dropdown_menu">
+                    <li>
+                        <a href="#" ng-click="ctrl.cancelMobileGeomEdition()">
+                            <span class="icon-block"></span>
+                            Annuler l'opération
+                        </a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+        <div class="col-xs-6">
+        </div>
+    </div>
+    <div class="ol_draw_menu_bottom_buttons_container">
+        <div class="col-xs-6">
+            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.finishMobileGeomEdition()">Terminer</button>
+            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">Localiser</button>
+        </div>
+        <div class="col-xs-6">
+            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyVertex()">Choisir</button>
+            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyGeometry()">Valider</button>
+        </div>
+    </div>
+</div>
+
+<!--Bandeau popup mobile-->
+<div id="mobile-popup-bar" ng-if="$root.is_mobile" class="hidden"></div>
\ No newline at end of file
diff --git a/module/template/modules/cadastre.html b/module/template/modules/cadastre.html
new file mode 100644
index 0000000000000000000000000000000000000000..c60769689241461015832eea2c4c444243b9eb4e
--- /dev/null
+++ b/module/template/modules/cadastre.html
@@ -0,0 +1,1227 @@
+<div class="module-title list-group-item active lighen">MODULE CADASTRE</div>
+
+<div id="cadastre-tools" style="margin-bottom: 10px">
+
+    <!--Onglets de navigation-->
+    <ul class="nav nav-tabs white">
+        <li style="width: 50%" class="active">
+            <a data-toggle="tab" href="#cadastre-by-map-form" onclick="oVmap.getMap().removeActionsAndTooltips()">
+                <span class="glyphicon glyphicon-map-marker"></span> Carte
+            </a>
+        </li>
+        <li style="width: 50%">
+            <a data-toggle="tab" href="#cadastre-form" onclick="oVmap.getMap().removeActionsAndTooltips()">
+                <span class="glyphicon glyphicon-search"></span> Formulaire
+            </a>
+        </li>
+    </ul>
+
+    <!-- Sélection par carte -->
+    <div id="cadastre-by-map-form" class="cadastre cadastre-map-search fade absolute active in">
+
+        <div id="cadastre-map-search-accordion" class="panel-group margin-10">
+
+            <!--Rapport en un clic-->
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h4 class="panel-title">
+                        <a class="accordion-toggle font-14"
+                           data-toggle="collapse"
+                           data-parent="#cadastre-map-search-accordion"
+                           href="#cadastre-map-search-collapse-one-click"
+                           aria-expanded="true"
+                           aria-controls="collapseOne"
+                           onclick="oVmap.getMap().removeActionsAndTooltips()">
+                            <span class="glyphicon glyphicon-screenshot" style="margin-right: 5px"></span> Rapport en un clic
+                            <i class="indicator glyphicon glyphicon-chevron-down pull-right"></i>
+                        </a>
+                    </h4>
+                </div>
+                <div id="cadastre-map-search-collapse-one-click" class="panel-collapse collapse in">
+                    <div class="panel-body">
+                        <i>Choisissez le type de rapport et cliquez sur une parcelle pour voir le rapport</i>
+                        <div class="row" style="padding: 10px 5px 0px 5px;">
+                            <div class="col-md-4 padding-sides-2 height-md-4" style="height: 85px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-FicheDescriptive'}" ng-click="ctrl.selectCadastreOnMap('FicheDescriptive', ctrl.currentAction === 'cadastre-FicheDescriptive')">
+                                    <div class="squared-btn-text">Fiche descriptive</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 height-md-4" style="height: 85px" ng-hide="ctrl.isCadastreLightUser">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-ReleveDePropriete'}" ng-click="ctrl.selectCadastreOnMap('ReleveDePropriete', ctrl.currentAction === 'cadastre-ReleveDePropriete')">
+                                    <div class="squared-btn-text">Relevé de propriété</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 height-md-4" style="height: 85px" ng-hide="ctrl.isCadastreLightUser">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-FicheUrbanisme'}" ng-click="ctrl.selectCadastreOnMap('FicheUrbanisme', ctrl.currentAction === 'cadastre-FicheUrbanisme')">
+                                    <div class="squared-btn-text">Fiche d'urbanisme</div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+
+            <!--Recheche avancée-->
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h4 class="panel-title">
+                        <a class="accordion-toggle collapsed font-14"
+                           data-toggle="collapse"
+                           data-parent="#cadastre-map-search-accordion"
+                           href="#cadastre-map-search-collapse-advanced-search"
+                           onclick="oVmap.getMap().removeActionsAndTooltips()">
+                            <span class="glyphicon glyphicon-cog" style="margin-right: 5px"></span> Recherche avancée
+                            <i class="indicator glyphicon glyphicon-chevron-down pull-right"></i>
+                        </a>
+                    </h4>
+                </div>
+                <div id="cadastre-map-search-collapse-advanced-search" class="panel-collapse collapse">
+
+                    <div class="panel-body">
+                        <label>Recherche d'objet</label>
+                        <div class="row" style="padding: 0px 5px 0px 5px;">
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.searchOnMapCurrentMode === 'commune'}" ng-click="ctrl.searchOnMapInit('commune')">
+                                    <div class="squared-btn-text">Commune</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.searchOnMapCurrentMode === 'section'}" ng-click="ctrl.searchOnMapInit('section')">
+                                    <div class="squared-btn-text">Section</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.searchOnMapCurrentMode === 'lieuDit'}" ng-click="ctrl.searchOnMapInit('lieuDit')">
+                                    <div class="squared-btn-text">Lieu-dit</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.searchOnMapCurrentMode === 'parcelle'}" ng-click="ctrl.searchOnMapInit('parcelle')">
+                                    <div class="squared-btn-text">Parcelle</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px" ng-hide="ctrl.isCadastreLightUser">
+                                <div class="squared-btn" ng-class="{'active': ctrl.searchOnMapCurrentMode === 'bati'}" ng-click="ctrl.searchOnMapInit('bati')">
+                                    <div class="squared-btn-text">Bâti</div>
+                                </div>
+                            </div>
+                        </div>
+                        <br>
+                        <label>Mode de sélection</label>
+                        <div class="row" style="padding: 0px 5px 0px 5px;">
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-selectByPoint'}" ng-click="ctrl.locateCadastreOnMap('Point', ctrl.currentAction === 'cadastre-selectByPoint')">
+                                    <div class="squared-btn-text">Point</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-selectByLineString'}" ng-click="ctrl.locateCadastreOnMap('LineString', ctrl.currentAction === 'cadastre-selectByLineString')">
+                                    <div class="squared-btn-text">Ligne</div>
+                                </div>
+                            </div>
+                            <div class="col-md-4 padding-sides-2 padding-2 height-md-4" style="height: 89px">
+                                <div class="squared-btn" ng-class="{'active': ctrl.currentAction === 'cadastre-selectByPolygon'}" ng-click="ctrl.locateCadastreOnMap('Polygon', ctrl.currentAction === 'cadastre-selectByPolygon')">
+                                    <div class="squared-btn-text">Polygone</div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="checkbox checkbox-info left margin-2 margin-sides-10">
+                            <input id="cadastre-location-multiple-checkbox" type="checkbox" ng-model="ctrl.locationMultiple" class="ng-pristine ng-untouched ng-valid">
+                            <label for="cadastre-location-multiple-checkbox">
+                                Ajouter à la sélection
+                            </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+
+
+        <!--Boutons-->
+        <div class="cadastre-btn-container" style="margin-left: -4px;">
+            <div class="cadastre-btn-container-title">UTILISER LA SELECTION</div>
+            <div class="cadastre-btn-container-actions">
+                <div class="cadastre-btn-container-actions-element-3" ng-click="ctrl.selectLocation()">
+                    <span class="glyphicon glyphicon-plus cadastre-btn-container-actions-element-icon"></span>
+                    <div class="margin-sides-10">Ajouter au panier</div>
+
+                </div>
+                <div id="cadastre-btn-container-actions-map-replace-card" class="cadastre-btn-container-actions-element-3" ng-click="ctrl.emptySelection();
+                    ctrl.selectLocation()">
+                    <span class="glyphicon glyphicon-repeat cadastre-btn-container-actions-element-icon"></span>
+                    <div class="margin-sides-10">Remplacer panier</div>
+                </div>
+                <div class="cadastre-btn-container-actions-element-3" onclick="oVmap.getMap().getLocationOverlayFeatures().clear()">
+                    <span class="glyphicon glyphicon-remove cadastre-btn-container-actions-element-icon"></span>
+                    <div class="margin-sides-10">Effacer la sélection</div>
+                </div>
+            </div>
+            <div class="cadastre-btn-container-rapports">
+                <button class="btn" type="button" ng-click="ctrl.initRapportsBootstrapTables('#Cadastre-rapports')">
+                    <span class="left glyphicon glyphicon-new-window" style="margin: 4px 8px"></span>
+                    <span class="left" style="margin: 0px 14px">Générer un rapport</span>
+                    <span class="right" style="margin: 6px 0px">
+                        <span class="icon-keyboard_arrow_right list-group-icon2"></span>
+                    </span>
+                </button>
+            </div>
+        </div>
+
+    </div>
+
+    <!--Formulaires-->
+    <div id="cadastre-form" class="forms-container fade absolute">
+
+        <!--Menu-->
+        <div class="margin-sides-3" style="margin-top: 5px">
+            <label class="font-11">Recherche d'objet:</label>
+            <div class="btn-group" style="width: 100%">
+                <a class="btn btn-sm font-11 btn-dropdown dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="false">
+                    <div id="cadastre-parcelle-form-menu" class="left"></div> <span class="caret right" style="margin: 5px;;"></span>
+                </a>
+                <ul class="dropdown-menu dropdown-menu-auto font-12">
+                    <li class="inactive">
+                        <a data-toggle="pill" ng-click="ctrl.currentMode = 'commune'" href="#cadastre-Commune-form">Commune</a>
+                    </li>
+                    <li class="inactive">
+                        <a data-toggle="pill" ng-click="ctrl.currentMode = 'section'" href="#cadastre-Section-form">Section</a>
+                    </li>
+                    <li class="inactive">
+                        <a data-toggle="pill" ng-click="ctrl.currentMode = 'lieuDit'" href="#cadastre-Lieu-dit-form">Lieu dit</a>
+                    </li>
+                    <li class="inactive">
+                        <a data-toggle="pill" ng-click="ctrl.currentMode = 'parcelle'" href="#cadastre-Parcelle-form">Parcelle</a>
+                    </li>
+                    <li class="inactive" ng-hide="ctrl.isCadastreLightUser">
+                        <a data-toggle="pill" ng-click="ctrl.currentMode = 'bati'" href="#cadastre-Bati-par-proprietaire-form">Bâti</a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+
+        <!--Formulaires-->
+        <div class="cadastre-forms">
+            <!-- Commune -->
+            <div id="cadastre-Commune-form" class="cadastre fade absolute">
+
+                <label class="cadastre-label">Commune</label>
+                <select id="Commune-select-commune" class="form-control minus" style="width: inherit">
+                    <option value=""></option>
+                    <option ng-repeat="commune in ctrl.aCommunes" ng-if="commune.nom !== ''" value="{{commune.id_com}}">{{commune.nom}}</option>
+                </select>
+                <br>
+            </div>
+
+            <!-- Section -->
+            <div id="cadastre-Section-form" class="cadastre fade absolute">
+
+                <label class="cadastre-label">Commune</label>
+                <select id="Section-select-commune" class="form-control minus" style="width: inherit" ng-model="sectionCommune" ng-change="ctrl.putBaseElemBySelectOnTable(ctrl.cadastreAPI_ + '/sections', 'id_com', '#Section-select-commune', '#Section-table-section', 'section')">
+                    <option value=""></option>
+                    <option ng-repeat="sectionCommune in ctrl.aCommunes" ng-if="sectionCommune.nom !== ''" value="{{sectionCommune.id_com}}">{{sectionCommune.nom}}</option>
+                </select>
+
+                <label class="cadastre-label">Section(s)</label>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <div id="Section-table-section-toolbar" class="btn-group cadastre-table-btn-group" style="display: none">
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Section-table-section')" title="Sélectionner tout">
+                        <span class="glyphicon glyphicon-ok"></span>
+                    </button>
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Section-table-section')" title="Déselectionner tout">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </button>
+                </div>
+                <table id="Section-table-section" data-toolbar="#Section-table-section-toolbar" data-toggle="table" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-checkbox="true"></th>
+                            <th data-field="commune"></th>
+                            <th data-field="section"></th>
+                        </tr>
+                    </thead>
+                </table>
+            </div>
+
+            <!-- Lieu dit -->
+            <div id="cadastre-Lieu-dit-form" class="cadastre fade absolute">
+
+                <label class="cadastre-label">Commune</label>
+                <select id="Lieu-dit-select-commune" class="form-control minus" style="width: inherit" ng-model="lieuDitCommune" ng-change="ctrl.putBaseElemBySelectOnTable(ctrl.cadastreAPI_ + '/lieudits', 'id_com', '#Lieu-dit-select-commune', '#Lieu-dit-table-lieu-dit', 'tex')">
+                    <option value=""></option>
+                    <option ng-repeat="lieuDitCommune in ctrl.aCommunes" ng-if="lieuDitCommune.nom !== ''" value="{{lieuDitCommune.id_com}}">{{lieuDitCommune.nom}}</option>
+                </select>
+
+                <label class="cadastre-label">Lieu dit</label>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <div id="Lieu-dit-table-lieu-dit-toolbar" class="btn-group" style="display: none">
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Lieu-dit-table-lieu-dit')" title="Sélectionner tout">
+                        <span class="glyphicon glyphicon-ok"></span>
+                    </button>
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Lieu-dit-table-lieu-dit')" title="Déselectionner tout">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </button>
+                </div>
+                <table id="Lieu-dit-table-lieu-dit" data-toolbar="#Lieu-dit-table-lieu-dit-toolbar" data-toggle="table" data-search="true" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-checkbox="true"></th>
+                            <th data-field="tex"></th>
+                        </tr>
+                    </thead>
+                </table>
+            </div>
+
+            <!-- Parcelle -->
+            <div id="cadastre-Parcelle-form" class="cadastre fade absolute">
+                <label class="cadastre-label">Recherche par:</label>
+                <div class="btn-group" style="width: 100%">
+                    <a class="btn btn-sm font-11 btn-dropdown dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="false">
+                        <div id="cadastre-parcelle-form-menu" class="left"></div> <span class="caret right" style="margin: 5px;"></span>
+                    </a>
+                    <ul class="dropdown-menu dropdown-menu-auto font-12">
+                        <li class="inactive">
+                            <a data-toggle="pill" ng-click="ctrl.currentParcelleMode = 'section'" href="#cadastre-Parcelle-par-section-form">Section</a>
+                        </li>
+                        <li class="inactive">
+                            <a data-toggle="pill" ng-click="ctrl.currentParcelleMode = 'adresse'" href="#cadastre-Parcelle-par-adresse-DGFiP-form">Adresse DGFiP</a>
+                        </li>
+                        <li class="inactive" ng-hide="ctrl.isCadastreLightUser">
+                            <a data-toggle="pill" ng-click="ctrl.currentParcelleMode = 'proprietaire'" href="#cadastre-Parcelle-par-proprietaire-form">Propriétaire</a>
+                        </li>
+                    </ul>
+                </div>
+
+                <!-- Parcelle par section -->
+                <div id="cadastre-Parcelle-par-section-form" class="cadastre parcelle fade absolute">
+                    <label class="cadastre-label">Commune</label>
+                    <select id="Parcelle-select-commune" class="form-control minus" style="width: inherit" ng-model="parcelleCommune" onchange="$('#Parcelle-table-parcelle').bootstrapTable('load', []);" ng-change="ctrl.getBaseElemBySelect(ctrl.cadastreAPI_ + '/sections', 'id_com', '#Parcelle-select-commune', 'aSections', 'section')">
+                        <option value=""></option>
+                        <option ng-repeat="parcelleCommune in ctrl.aCommunes" ng-if="parcelleCommune.nom !== ''" value="{{parcelleCommune.id_com}}">{{parcelleCommune.nom}}</option>
+                    </select>
+
+                    <label class="cadastre-label">Section</label>
+                    <select id="Parcelle-select-section" class="form-control minus" style="width: inherit" ng-model="parcelleSection" ng-change="ctrl.putBaseElemBy2SelectOnTable(ctrl.cadastreAPI_ + '/parcelles', 'id_com', '#Parcelle-select-commune', 'id_sec', '#Parcelle-select-section', '#Parcelle-table-parcelle', 'parcelle')">
+                        <option ng-repeat="parcelleSection in ctrl.aSections" value="{{parcelleSection.id_sec}}">{{parcelleSection.section}}</option>
+                    </select>
+
+                    <label class="cadastre-label">Parcelle(s)</label>
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <div id="Parcelle-table-parcelle-toolbar" class="btn-group">
+                        <button type="button" id="Parcelle-table-parcelle-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Parcelle-table-parcelle')" title="Sélectionner tout">
+                            <span class="glyphicon glyphicon-ok"></span>
+                        </button>
+                        <button type="button" id="Parcelle-table-parcelle-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Parcelle-table-parcelle')" title="Déselectionner tout">
+                            <span class="glyphicon glyphicon-remove"></span>
+                        </button>
+                    </div>
+                    <table id="Parcelle-table-parcelle" data-toolbar="#Parcelle-table-parcelle-toolbar" data-toggle="table" data-search="true" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                        <thead>
+                            <tr>
+                                <th data-field="state" data-checkbox="true"></th>
+                                <th data-field="id_par"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+
+                <!-- Parcelle par adresse DGFiP -->
+                <div id="cadastre-Parcelle-par-adresse-DGFiP-form" class="cadastre parcelle fade absolute">
+
+                    <label class="cadastre-label">Commune</label>
+                    <select id="Parcelle-par-adresse-DGFiP-select-commune" class="form-control minus" style="width: inherit" ng-model="parcelleparadresseDGFiPCommune" ng-change="ctrl.getBaseVoiesOnTable(ctrl.cadastreAPI_ + '/voies', 'ID_COM', '#Parcelle-par-adresse-DGFiP-select-commune', '#Parcelle-par-adresse-DGFiP-table-voie')">
+                        <option value=""></option>
+                        <option ng-repeat="parcelleparadresseDGFiPCommune in ctrl.aCommunes" ng-if="parcelleparadresseDGFiPCommune.nom !== ''" value="{{parcelleparadresseDGFiPCommune.id_com}}">{{parcelleparadresseDGFiPCommune.nom}}</option>
+                    </select>
+
+                    <label class="cadastre-label">Voie</label>
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <table id="Parcelle-par-adresse-DGFiP-table-voie" data-toggle="table" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                        <thead>
+                            <tr>
+                                <th data-field="state" data-radio="true"></th>
+                                <th data-field="NOM_VOIE"></th>
+                                <th data-field="DVOILIB" data-visible="false"></th>
+                                <th data-field="ID_RIVOLI" data-visible="false"></th>
+                            </tr>
+                        </thead>
+                    </table>
+
+                    <label class="cadastre-label">Adresse(s)</label>
+                    <select id="Parcelle-par-adresse-DGFiP-select-adresse" class="form-control minus" style="width: inherit">
+                        <option value="">Toutes</option>
+                        <option ng-repeat="parcelleparadresseDGFiPVoie in ctrl.aAdresses" ng-if="parcelleparadresseDGFiPVoie.DNVOIRI.trim().length !== 0" value="{{parcelleparadresseDGFiPVoie.ID_PAR}}">{{parcelleparadresseDGFiPVoie.DNVOIRI}}</option>
+                    </select>
+                </div>
+
+                <!-- Parcelle par propriétaire -->
+                <div id="cadastre-Parcelle-par-proprietaire-form" class="cadastre parcelle fade absolute">
+
+                    <label class="cadastre-label">Commune</label>
+                    <select id="Parcelle-par-proprietaire-select-commune" class="form-control minus" style="width: inherit" onchange="	$('#Parcelle-par-proprietaire-table-proprietaire').bootstrapTable('removeAll');
+                            $('#Parcelle-par-proprietaire-table-comptes').bootstrapTable('removeAll');
+                            $('#Parcelle-par-proprietaire-table-parcelles').bootstrapTable('removeAll');
+                            ">
+                        <option value=""></option>
+                        <option ng-repeat="parcelleparproprietaireCommune in ctrl.aCommunes" ng-if="parcelleparproprietaireCommune.nom !== ''" value="{{parcelleparproprietaireCommune.id_com}}">{{parcelleparproprietaireCommune.nom}}</option>
+                    </select>
+
+                    <label class="cadastre-label">Propriétaire</label>
+                    <form class="input-group" ng-submit="ctrl.getParcelleBaseProprietairesOnTable('#Parcelle-par-proprietaire-select-commune', '#Parcelle-par-proprietaire-search-proprietaire', '#Parcelle-par-proprietaire-table-proprietaire', '#Parcelle-par-proprietaire-table-comptes', '#Parcelle-par-proprietaire-table-parcelles')" style="width: 100%">
+                        <input id="Parcelle-par-proprietaire-search-proprietaire" class="form-control minus" type="text" placeholder="Propriétaire" style="width: 73%">
+                        <button type="submit" class="btn btn-success btn-sm font-11" style="width: 27%;padding: 3px 10px;">Chercher</button>
+                    </form>
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <table id="Parcelle-par-proprietaire-table-proprietaire"
+                           data-toggle="table"
+                           data-height="120"
+                           data-sort-name="ddenom"
+                           data-show-header="false"
+                           data-click-to-select="true"
+                           class="font-10 pointer cadastre-table-list transparent">
+                        <thead>
+                            <tr>
+                                <th data-field="state" data-radio="true"></th>
+                                <th data-field="ID_COM" data-visible="false"></th>
+                                <th data-field="DDENOM"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                    <label class="cadastre-label">Compte(s)</label>
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <div id="Parcelle-par-proprietaire-table-comptes-toolbar" class="btn-group" style="display: none">
+                        <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Parcelle-par-proprietaire-table-comptes')" title="Sélectionner tout">
+                            <span class="glyphicon glyphicon-ok"></span>
+                        </button>
+                        <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Parcelle-par-proprietaire-table-comptes')" title="Déselectionner tout">
+                            <span class="glyphicon glyphicon-remove"></span>
+                        </button>
+                    </div>
+                    <table id="Parcelle-par-proprietaire-table-comptes" data-toggle="table" data-height="150" data-toolbar="#Parcelle-par-proprietaire-table-comptes-toolbar" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                        <thead>
+                            <tr>
+                                <th data-field="state" data-checkbox="true"></th>
+                                <th data-field="ID_COM" data-visible="false"></th>
+                                <th data-field="DNUPRO"></th>
+                            </tr>
+                        </thead>
+                    </table>
+
+                    <label class="cadastre-label">Parcelles(s)</label>
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <div id="Parcelle-par-proprietaire-table-parcelles-toolbar" class="btn-group" style="display: none">
+                        <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Parcelle-par-proprietaire-table-parcelles')" title="Sélectionner tout">
+                            <span class="glyphicon glyphicon-ok"></span>
+                        </button>
+                        <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Parcelle-par-proprietaire-table-parcelles')" title="Déselectionner tout">
+                            <span class="glyphicon glyphicon-remove"></span>
+                        </button>
+                    </div>
+                    <table id="Parcelle-par-proprietaire-table-parcelles" data-toggle="table" data-height="150" data-toolbar="#Parcelle-par-proprietaire-table-parcelles-toolbar" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                        <thead>
+                            <tr>
+                                <th data-field="state" data-checkbox="true"></th>
+                                <th data-field="ID_PAR" data-visible="true"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+
+            <!-- Bâti par propriétaire -->
+            <div id="cadastre-Bati-par-proprietaire-form" class="cadastre fade absolute">
+                <label class="cadastre-label">Commune</label>
+                <select id="Bati-par-proprietaire-select-commune" class="form-control minus" style="width: inherit" ng-model="batiparproprietaireCommune" onchange="
+                        $('#Bati-par-proprietaire-table-proprietaire').bootstrapTable('removeAll');
+                        $('#Bati-par-proprietaire-table-comptes').bootstrapTable('removeAll');
+                        $('#Bati-par-proprietaire-table-invariants').bootstrapTable('removeAll');
+                        $('#Bati-par-proprietaire-table-parcelles').bootstrapTable('removeAll');
+                        ">
+                    <option value=""></option>
+                    <option ng-repeat="batiparproprietaireCommune in ctrl.aCommunes" ng-if="batiparproprietaireCommune.nom !== ''" value="{{batiparproprietaireCommune.id_com}}">{{batiparproprietaireCommune.nom}}</option>
+                </select>
+
+                <label class="cadastre-label">Propriétaire</label>
+                <form class="input-group" ng-submit="ctrl.getBatiBaseProprietairesOnTable('#Bati-par-proprietaire-select-commune', '#Bati-par-proprietaire-search-proprietaire', '#Bati-par-proprietaire-table-proprietaire', '#Bati-par-proprietaire-table-comptes', '#Bati-par-proprietaire-table-invariants', '#Bati-par-proprietaire-table-parcelles')" style="width: 100%">
+                    <input id="Bati-par-proprietaire-search-proprietaire" class="form-control minus" type="text" placeholder="Propriétaire" style="width: 73%">
+                    <button type="submit" class="btn btn-success btn-sm font-11" style="width: 27%;padding: 3px 10px;">Chercher</button>
+                </form>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <table id="Bati-par-proprietaire-table-proprietaire"
+                       data-toggle="table"
+                       data-height="120"
+                       data-sort-name="ddenom"
+                       data-show-header="false"
+                       data-click-to-select="true"
+                       class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-radio="true"></th>
+                            <th data-field="DDENOM"></th>
+                        </tr>
+                    </thead>
+                </table>
+                <label class="cadastre-label">Compte(s)</label>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <div id="Bati-par-proprietaire-table-comptes-toolbar" class="btn-group" style="display: none">
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Bati-par-proprietaire-table-comptes')" title="Sélectionner tout">
+                        <span class="glyphicon glyphicon-ok"></span>
+                    </button>
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Bati-par-proprietaire-table-comptes')" title="Déselectionner tout">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </button>
+                </div>
+                <table id="Bati-par-proprietaire-table-comptes" data-toggle="table" data-height="120" data-toolbar="#Bati-par-proprietaire-table-comptes-toolbar" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-checkbox="true"></th>
+                            <th data-field="DNUPRO"></th>
+                        </tr>
+                    </thead>
+                </table>
+
+                <label class="cadastre-label">Invariant(s)</label>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <div id="Bati-par-proprietaire-table-invariants-toolbar" class="btn-group" style="display: none">
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Bati-par-proprietaire-table-invariants')" title="Sélectionner tout">
+                        <span class="glyphicon glyphicon-ok"></span>
+                    </button>
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Bati-par-proprietaire-table-invariants')" title="Déselectionner tout">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </button>
+                </div>
+                <table id="Bati-par-proprietaire-table-invariants" data-toggle="table" data-height="120" data-toolbar="#Bati-par-proprietaire-table-invariants-toolbar" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-checkbox="true"></th>
+                            <th data-field="ID_PAR" data-visible="false"></th>
+                            <th data-field="INVAR"></th>
+                        </tr>
+                    </thead>
+                </table>
+
+                <label class="cadastre-label">Parcelles(s)</label>
+                <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                <div id="Bati-par-proprietaire-table-parcelles-toolbar" class="btn-group" style="display: none">
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableCheckAll('#Bati-par-proprietaire-table-parcelles')" title="Sélectionner tout">
+                        <span class="glyphicon glyphicon-ok"></span>
+                    </button>
+                    <button type="button" id="Lieu-dit-table-lieu-dit-check-all" class="btn btn-sm font-11 btn-default cadastre-list-select-all" onclick="oVmap.getToolsManager().getTool('Cadastre').tableUncheckAll('#Bati-par-proprietaire-table-parcelles')" title="Déselectionner tout">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </button>
+                </div>
+                <table id="Bati-par-proprietaire-table-parcelles" data-toggle="table" data-height="120" data-toolbar="#Bati-par-proprietaire-table-parcelles-toolbar" data-search="true" data-sort-name="voie" data-show-header="false" data-click-to-select="true" class="font-10 pointer cadastre-table-list transparent">
+                    <thead>
+                        <tr>
+                            <th data-field="state" data-checkbox="true"></th>
+                            <th data-field="id_par"></th>
+                        </tr>
+                    </thead>
+                </table>
+            </div>
+        </div>
+
+        <!--Boutons-->
+        <div class="cadastre-btn-container">
+            <div class="cadastre-btn-container-title">UTILISER LA SELECTION</div>
+            <div class="cadastre-btn-container-actions">
+                <div class="cadastre-btn-container-actions-element" ng-click="ctrl.addToCard(ctrl.currentMode);">
+                    <span class="glyphicon glyphicon-plus cadastre-btn-container-actions-element-icon"></span> Ajouter au panier
+                </div>
+                <div class="cadastre-btn-container-actions-element" ng-click="ctrl.emptySelection();
+                    ctrl.addToCard(ctrl.currentMode);">
+                    <span class="glyphicon glyphicon-repeat cadastre-btn-container-actions-element-icon"></span> Remplacer panier
+                </div>
+                <div class="cadastre-btn-container-actions-element" onclick="oVmap.getMap().getLocationOverlayFeatures().clear()">
+                    <span class="glyphicon glyphicon-remove cadastre-btn-container-actions-element-icon"></span> Effacer la localisation
+                </div>
+                <div class="cadastre-btn-container-actions-element" ng-click="ctrl.locateSelection(ctrl.currentMode)">
+                    <span class="glyphicon glyphicon-map-marker cadastre-btn-container-actions-element-icon"></span> Localiser la sélection
+                </div>
+            </div>
+            <div class="cadastre-btn-container-rapports">
+                <button class="btn" type="button" ng-click="ctrl.initRapportsBootstrapTables('#Cadastre-rapports')">
+                    <span class="left glyphicon glyphicon-new-window" style="margin: 4px 8px"></span>
+                    <span class="left" style="margin: 0px 14px">Générer un rapport</span>
+                    <span class="right" style="margin: 6px 0px">
+                        <span class="icon-keyboard_arrow_right list-group-icon2"></span>
+                    </span>
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Modal Rapports -->
+<div class="modal fade" id="rapports-modal" tabindex="-1" role="dialog" style="z-index: 1042">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h3 class="modal-title" id="myModalLabel"><span class="glyphicon glyphicon-new-window"></span> Générer un rapport</h3>
+            </div>
+            <div class="modal-body modal-body-big">
+                <div id="Cadastre-rapports" style="height: 100%;">
+
+
+                    <div class="row" style="height: 100%;">
+                        <div class="col-md-3">
+                            <br>
+                            <ul class="nav nav-pills nav-stacked" style="width: 180px">
+                                <li ng-show="ctrl.show_veremes_cadastre_parcelle" data-toggle="pill" href="#cadastre-rapport-parcelle" class="list-group-item list-group-item-modal active">Parcelle</li>
+                                <li ng-show="ctrl.show_veremes_cadastre_compte" data-toggle="pill" href="#cadastre-rapport-compte" class="list-group-item list-group-item-modal">Compte</li>
+                            </ul>
+                        </div>
+
+                        <div class="col-md-9" style="height: 100%;">
+
+                            <!--Parcelle-->
+                            <div id="cadastre-rapport-parcelle" class="mapmodal-element fade active in" ng-show="ctrl.show_veremes_cadastre_parcelle">
+                                <br>
+                                <div class="cadastre-rapport-table-container">
+                                    <table id="Cadastre-rapports-table-parcelle"
+                                           data-toggle="table"
+                                           data-sort-name="parcelle"
+                                           data-show-header="true"
+                                           data-click-to-select="true"
+                                           class="font-11 pointer cadastre-table-list-with-checkbox transparent">
+                                        <thead>
+                                            <tr>
+                                                <th data-field="state" data-checkbox="true"></th>
+                                                <th data-field="id_com" data-visible="false"></th>
+                                                <th data-field="id_par" data-visible="false"></th>
+                                                <th data-field="commune" data-sortable="true">Commune</th>
+                                                <th data-field="section" data-sortable="true">Section</th>
+                                                <th data-field="parcelle" data-sortable="true">Parcelle</th>
+                                            </tr>
+                                        </thead>
+                                    </table>
+                                </div>
+                                <br>
+                                <div class="row">
+                                    <div class="col-md-6">
+                                        <button class="cadastre-rapports-fiche-btn"
+                                                ng-click="ctrl.displayParcelleDescriptiveSheetByTable('#Cadastre-rapports-table-parcelle')"
+                                                ng-disabled="ctrl.tablesSelection['#Cadastre-rapports-table-parcelle'].length > 1">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Fiche descriptive
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn"
+                                                ng-click="ctrl.displayUrbanismeSheetByTable('#Cadastre-rapports-table-parcelle')"
+                                                ng-disabled="ctrl.tablesSelection['#Cadastre-rapports-table-parcelle'].length > 1">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Fiche d'urbanisme
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn"
+                                                ng-click="ctrl.displayReleveDeProprieteSheetParcelle('#Cadastre-rapports-table-parcelle')"
+                                                ng-disabled="ctrl.tablesSelection['#Cadastre-rapports-table-parcelle'].length > 1">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Relevé de propriété de la parcelle
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'ToutesInfos', true)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Toutes les informations
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'BatieNonBatie', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Emprises bâties/non-bâties
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'Proprietaire', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Propriétaires
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'SubdivisionFiscale', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Subdivisions fiscales
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'EmprisePosPlu', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Emprises
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'Locaux', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Locaux
+                                        </button>
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayRapportParcelle('#Cadastre-rapports-table-parcelle', 'ProprietaireLocaux', false)">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Propriétaires des locaux
+                                        </button>
+                                    </div>
+                                </div>
+
+                                <a id="cadastre-download-file" class="hidden" href="#" download="rapport.xls">
+                                    <span class="glyphicon glyphicon-download-alt"></span> Télécharger le fichier
+                                </a>
+
+                            </div>
+
+                            <!--Compte-->
+                            <div id="cadastre-rapport-compte" class="mapmodal-element fade" ng-show="ctrl.show_veremes_cadastre_compte">
+                                <br>
+                                <div class="cadastre-rapport-table-container">
+                                    <table id="Cadastre-rapports-table-comptes" data-toggle="table" data-sort-name="parcelle" data-show-header="true" data-click-to-select="true" class="font-11 pointer cadastre-table-list transparent">
+                                        <thead>
+                                            <tr>
+                                                <th data-field="state" data-radio="true"></th>
+                                                <th data-field="id_com" data-visible="false"></th>
+                                                <th data-field="COMMUNE" data-sortable="true">Commune</th>
+                                                <th data-field="DDENOM" data-sortable="true">Propriétaire</th>
+                                                <th data-field="DNUPRO" data-sortable="true">DNUPRO</th>
+                                            </tr>
+                                        </thead>
+                                    </table>
+                                </div>
+                                <br>
+                                <div class="row">
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayReleveDeProprieteSheetStandard('#Cadastre-rapports-table-comptes')" title="Relevé de propriété standard associé au compte">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Relevé de propriété standard
+                                        </button>
+
+                                    </div>
+                                    <div class="col-md-6" ng-hide="ctrl.isCadastreLightUser">
+                                        <button class="cadastre-rapports-fiche-btn" ng-click="ctrl.displayReleveDeProprieteSheetTiers('#Cadastre-rapports-table-comptes')" title="Relevé de propriété tiers associé au compte">
+                                            <span class="glyphicon glyphicon-download-alt"></span> Relevé de propriété tiers
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Modal Fiche descriptive de la parcelle -->
+<div class="modal fade" id="descriptive-parcelle-sheet-modal" role="dialog">
+    <div class="modal-dialog modal-lg">
+        <!-- Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">Fiche descriptive de la parcelle</h4>
+            </div>
+            <div id="descriptive-parcelle-sheet-content" class="modal-body modal-body-big-with-footer">
+
+                <!-- Parcelle -->
+                <h3>{{ctrl.oParcelleInfos.parcelle}}</h3>
+                <hr>
+                <table class="table font-12 table-no-bordered">
+                    <tbody>
+                        <tr>
+                            <td class="bold padding-3">Commune:</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.commune}} ({{ctrl.oParcelleInfos.ID_COM}})</td>
+                        </tr>
+                        <tr>
+                            <td class="bold padding-3">Surface Géographique:</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.sup_fiscale}}</td>
+                        </tr>
+                        <tr>
+                            <td class="bold padding-3">Contenance:</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.DCNTPA}}</td>
+                        </tr>
+                        <tr>
+                            <td class="bold padding-3">Adresse DGFiP:</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.DNVOIRI}} {{ctrl.oParcelleInfos.DINDIC}} {{ctrl.oParcelleInfos.L_NATURE_VOIE}} {{ctrl.oParcelleInfos.DVOILIB}}({{ctrl.oParcelleInfos.CCORIV}})</td>
+                        </tr>
+                        <tr>
+                            <td class="bold padding-3">Batie:</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.GPARBAT}}</td>
+                        </tr>
+                        <tr>
+                            <td class="bold padding-3">Urbaine :</td>
+                            <td class="padding-3">{{ctrl.oParcelleInfos.GURBPA}}</td>
+                        </tr>
+                    </tbody>
+                </table>
+
+                <button class="btn btn-primary btn-sm font-11 margin-sides-10 right print-hidden" data-dismiss="modal" ng-hide="ctrl.isCadastreLightUser" ng-click="ctrl.displayUrbanismeSheet(ctrl.oParcelleInfos.ID_PAR)">Fiche d'urbanisme</button>
+                <button class="btn btn-primary btn-sm font-11 margin-sides-10 right print-hidden" data-dismiss="modal" ng-hide="ctrl.isCadastreLightUser" onclick="$('#releve-propriete-modal-menu').modal('show')"
+                        ng-click="ctrl.tmpID_PAR = ctrl.oParcelleInfos.ID_PAR; ctrl.tmpID_DNUPRO = ctrl.oParcelleInfos.ID_COM + ctrl.oParcelleInfos.aProprietaires[0].DNUPRO">Relevés de propriété</button>
+                <br>
+
+                <!-- Propriétaires -->
+                <div ng-if="ctrl.oParcelleInfos.aProprietaires.length && ctrl.oParcelleInfos.aProprietaires.length !== 0">
+                    <h4 ng-if="ctrl.oParcelleInfos.aProprietaires.length === 1">Propriétaire</h4>
+                    <h4 ng-if="ctrl.oParcelleInfos.aProprietaires.length !== 1">Propriétaires</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>Nom</th>
+                                <th>État civil</th>
+                                <th>Adresse</th>
+                                <th>Indivision</th>
+                                <th>Droit</th>
+                                <th>Destinataire de l'avis</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="proprietaire in ctrl.oParcelleInfos.aProprietaires">
+                                <td>{{proprietaire.DQUALP}} {{proprietaire.DDENOM}}</td>
+                                <td> <div ng-if="proprietaire.DLDNSS != null && proprietaire.DLDNSS != ''">Né{{proprietaire.accordSexe}} le {{proprietaire.JDATNSS}} à {{proprietaire.DLDNSS}}</div></td>
+                                <td>{{proprietaire.DLIGN3}} {{proprietaire.DLIGN4}} {{proprietaire.DLIGN6}}</td>
+                                <td>{{proprietaire.L_CCODEM}}</td>
+                                <td>{{proprietaire.L_CCODRO}}</td>
+                                <td style="text-align: right">{{proprietaire.GDESIP === "1" ? 'Oui' : 'Non'}}</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                    <br>
+                </div>
+
+                <!-- Subdivision Fiscale -->
+                <div ng-if="ctrl.oParcelleInfos.aSubdivisionFiscale.length && trl.oParcelleInfos.aSubdivisionFiscale.length !== 0">
+                    <h4 ng-if="ctrl.oParcelleInfos.aSubdivisionFiscale.length === 1">Subdivision Fiscale</h4>
+                    <h4 ng-if="ctrl.oParcelleInfos.aSubdivisionFiscale.length !== 1">Subdivision Fiscales</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>Lettre</th>
+                                <th>Groupe</th>
+                                <th>Nature</th>
+                                <th>Occupation</th>
+                                <th>Classe</th>
+                                <th>Surface</th>
+                                <th>Revenu</th>
+                                <th>Référence</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="subdivision in ctrl.oParcelleInfos.aSubdivisionFiscale">
+                                <td>{{subdivision.CCOSUB}}</td>
+                                <td>{{subdivision.DSGRPF}}</td>
+                                <td>{{subdivision.CNATSP}}</td>
+                                <td>{{subdivision.L_DSGRPF}}</td>
+                                <td>{{subdivision.DCLSSF}}</td>
+                                <td>{{subdivision.DCNTSF}}</td>
+                                <td>{{subdivision.DRCSUBA}}</td>
+                                <td>{{subdivision.DRCSUB}}</td>
+                            </tr>
+                            <tr class="font-14 bold">
+                                <td>Total</td>
+                                <td></td>
+                                <td></td>
+                                <td></td>
+                                <td></td>
+                                <td>{{ctrl.oParcelleInfos.aSubdivisionFiscale.totalDcntsf}}</td>
+                                <td>{{ctrl.oParcelleInfos.aSubdivisionFiscale.totalDrcsuba}}</td>
+                                <td>{{ctrl.oParcelleInfos.aSubdivisionFiscale.totalDrcsub}}</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Elément Bâti -->
+                <div ng-if="ctrl.oParcelleInfos.aBatis.length && ctrl.oParcelleInfos.aBatis.length !== 0">
+                    <h4 ng-if="ctrl.oParcelleInfos.aBatis.length === 1">Elément Bâti</h4>
+                    <h4 ng-if="ctrl.oParcelleInfos.aBatis.length !== 1">Eléments Bâti</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th></th>
+                                <th>Invariant</th>
+                                <th>Type</th>
+                                <th>Nature</th>
+                                <th>Occupation</th>
+                                <th>Date mut.</th>
+                                <th>Année c.</th>
+                                <th>Propriétaire dest.</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oParcelleInfos.aBatis">
+                                <td>
+                                    <button class="btn btn-primary left" ng-click="ctrl.displayInvariantDescriptiveSheet(element.ID_BAT)">
+                                        <span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span>
+                                    </button>
+                                </td>
+                                <td>{{element.INVAR}}</td>
+                                <td>{{element.L_DTELOC}}</td>
+                                <td>{{element.L_CCONLC}}</td>
+                                <td>{{element.L_DNATLC}}</td>
+                                <td>{{element.JDATAT.substr(0, 2)}}/{{element.JDATAT.substr(2, 2)}}/{{element.JDATAT.substr(4, 4)}}</td>
+                                <td>{{element.JANNAT}}</td>
+                                <td>{{element.DDENOM}}</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Custom elements (rajoutés dans les properties dans l'API) -->
+                <div ng-repeat="node in ctrl.oParcelleInfos.aIntersections">
+                    <div ng-if="node.data.length > 0">
+                        <h4>{{node.title}}</h4>
+                        <table class="table font-12">
+                            <thead>
+                                <!-- Noms des champs -->
+                                <tr class="blue color-white">
+                                    <th ng-if="node[value]" ng-repeat="(key, value) in node.aFields">{{node[value]}}</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <!-- Valeurs des champs -->
+                                <tr ng-repeat="row in node.data">
+                                    <td ng-if="node[value]" ng-repeat="(key, value) in node.aFields">
+                                        <span ng-if="isLink(row[value])" ng-bind-html="getRenderedParsedLink(row[value])"></span>
+                                        <span ng-if="!isLink(row[value])">{{row[value]}}</span>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+
+                <!-- /.modal-body -->
+            </div>
+            <div class="modal-footer" ng-if="ctrl.sketchesLenght !== 0">
+                <button class="btn btn-primary left" onclick="oVmap.printElem('#descriptive-parcelle-sheet-content')">
+                    <span class="glyphicon glyphicon-print" aria-hidden="true"></span>
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Modal Fiche descriptive de l'invariant-->
+<div class="modal fade" id="descriptive-invariant-sheet-modal" role="dialog">
+    <div class="modal-dialog modal-lg">
+        <!-- Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">Fiche descriptive d'un invariant</h4>
+            </div>
+            <div id="descriptive-invariant-sheet-content" class="modal-body modal-body-big-with-footer">
+
+                <!-- Parcelle -->
+                <h3>Invariant: {{ctrl.oInvariant.INVAR}}</h3>
+                <hr>
+                <table class="table font-12 table-no-bordered">
+                    <tbody>
+                        <tr>
+                            <td class="padding-0 bold">Adresse: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.DVOILIB}} </td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Bat.: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.DNUBAT}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Esc.: </td>
+                            <td class="padding-0"> {{parseFloat(ctrl.oInvariant.DESC)}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Niv.: </td>
+                            <td class="padding-0"> {{parseFloat(ctrl.oInvariant.DNIV)}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Commune: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.LIBCOM}}({{ctrl.oInvariant.ID_COM}})</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Type: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.L_DTELOC}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Nature: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.L_CCONLC}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Occupation: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.L_DNATLC}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Date de mutation: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.JDATAT}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Mutation propriétaire: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.CCHPR === "*" ? 'Oui' : 'Non'}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Année de construction: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.JANNAT}}</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Valeur locative totale: </td>
+                            <td class="padding-0"> {{ctrl.oInvariant.DVLTRT}} €</td>
+                        </tr>
+                        <tr>
+                            <td class="padding-0 bold">Nombre d'étages: </td>
+                            <td class="padding-0"> {{parseFloat(ctrl.oInvariant.DNBNIV)}}</td>
+                        </tr>
+                    </tbody>
+                </table>
+                <br>
+
+                <!-- P.E.V -->
+                <div ng-if="ctrl.oInvariant.PEV.length !== 0">
+                    <h4>P.E.V</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>Numéro</th>
+                                <th>Nature</th>
+                                <th>Catégorie</th>
+                                <th>Tarif</th>
+                                <th>Type de local</th>
+                                <th>Valeur cad.</th>
+                                <th>Valeur imp.</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.PEV">
+                                <td>{{parseFloat(element.DNUPEV)}}</td>
+                                <td>{{element.L_CCOAFF}}</td>
+                                <td>{{element.DCAPEC}}</td>
+                                <td>{{element.CCOSTB}}</td>
+                                <td>{{element.DNUREF}}</td>
+                                <td>{{element.BIPEVLA1}}€</td>
+                                <td>{{element.VLBAIA1}}€</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Habitations -->
+                <div ng-if="ctrl.oInvariant.habitations.length !== 0">
+                    <h4>Habitation principale</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>P.E.V</th>
+                                <th>Elements de confort</th>
+                                <th>Divers</th>
+                                <th>Pièces(s)</th>
+                                <th>Annexe(s)</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.habitations">
+                                <!-- P.E.V -->
+                                <td>{{parseFloat(element.DNUPEV)}}</td>
+                                <!-- Elements de confort -->
+                                <td>
+                                    <span>Eau:</span> <span ng-if="element.GEAULC === 'O'">Oui</span> <span ng-if="element.GEAULC === 'N'">Oui</span>
+                                    <br>
+                                    <span>Electricité:</span> <span ng-if="element.GELELC === 'O'">Oui</span> <span ng-if="element.GELELC === 'N'">Oui</span>
+                                    <br>
+                                    <span>Cauffage coll.:</span> <span ng-if="element.GCHCLC === 'O'">Oui</span> <span ng-if="element.GCHCLC === 'N'">Oui</span>
+                                    <br>
+                                    <span>Tout à l'égout:</span> <span ng-if="element.GTEGLC === 'O'">Oui</span> <span ng-if="element.GTEGLC === 'N'">Oui</span>
+                                    <br>
+                                    <span>Baignoire(s):</span> <span>{{parseFloat(element.DNBBAI)}}</span>
+                                    <br>
+                                    <span>Douche(s):</span> <span>{{parseFloat(element.DNBDOU)}}</span>
+                                    <br>
+                                    <span>Lavabo(s):</span> <span>{{parseFloat(element.DNBLAV)}}</span>
+                                    <br>
+                                    <span>Toilette(s):</span> <span>{{parseFloat(element.DNBWC)}}</span>
+                                </td>
+                                <!-- Divers -->
+                                <td>
+                                    <span>Surface: </span><span>{{parseFloat(element.DSUPDC)}}</span>m²
+                                    <br>
+                                    <span>Nombre de pièces: </span><span>{{parseFloat(element.DNBPDC)}}</span>
+                                    <br>
+                                    <span>Nombre de pièces principales: </span><span>{{parseFloat(element.DNBPPR)}}</span>
+                                    <br>
+                                    <span>Entretien: </span><span>{{element.L_DETENT}}</span>
+                                    <br>
+                                    <span>Année d'achèvement: </span><span>{{element.JANNAT}}</span>
+                                    <br>
+                                    <span>Nombre de niveaux: </span><span>{{parseFloat(element.DNBNIV)}}</span>
+                                    <br>
+                                    <span>Toitures: </span><span>{{element.L_DMATTO}}</span>
+                                    <br>
+                                    <span>Gros murs: </span><span>{{element.L_DMATGM}}</span>
+                                </td>
+                                <!-- Pièces(s) -->
+                                <td>
+                                    <span>Salle(s) à manger: </span> {{parseFloat(element.DNBSAM)}}
+                                    <br>
+                                    <span>Chambre(s): </span> {{parseFloat(element.DNBCHA)}}
+                                    <br>
+                                    <span>Cuisine(s): </span> {{parseFloat(element.DNBCU8) + parseFloat(element.DNBCU9)}}
+                                    <br>
+                                    <span>Salle(s) d'eau: </span> {{parseFloat(element.DNBSEA)}}
+                                    <br>
+                                    <span>Annexe(s): </span> {{parseFloat(element.DNBANN)}}
+                                </td>
+                                <!-- Annexe(s) -->
+                                <td>
+                                    <div ng-if="element.L_CCONAD1 && trim(element.L_CCONAD1) !== ''">{{element.L_CCONAD1}}: {{element.DSUEIC1}}</div>
+                                    <div ng-if="element.L_CCONAD2 && trim(element.L_CCONAD2) !== ''">{{element.L_CCONAD2}}: {{element.DSUEIC2}}</div>
+                                    <div ng-if="element.L_CCONAD3 && trim(element.L_CCONAD3) !== ''">{{element.L_CCONAD3}}: {{element.DSUEIC3}}</div>
+                                    <div ng-if="element.L_CCONAD4 && trim(element.L_CCONAD4) !== ''">{{element.L_CCONAD4}}: {{element.DSUEIC4}}</div>
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Locaux pro -->
+                <div ng-if="ctrl.oInvariant.locauxPros.length !== 0">
+                    <h4>Local professionnel</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>P.E.V</th>
+                                <th>Numéro d'ordre</th>
+                                <th>Surface totale</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.locauxPros">
+                                <td>{{parseFloat(element.DNUPEV)}}</td>
+                                <td>{{element.DNUDES}}</td>
+                                <td>{{parseFloat(element.VSURZT)}}m²</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Dépendances -->
+                <div ng-if="ctrl.oInvariant.dependances.length !== 0">
+                    <h4>Dépendances</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>P.E.V</th>
+                                <th>Divers</th>
+                                <th>Eléments de confort</th>
+                                <th>Pièces(s)</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.dependances">
+                                <!-- P.E.V -->
+                                <td>
+                                    {{parseFloat(element.DNUPEV)}}
+                                </td>
+                                <!-- Divers -->
+                                <td>
+                                    <div>Surface: {{element.DSUDEP}}m²</div>
+                                    <div>Nature: {{element.L_CCONAD}}</div>
+                                    <div>Entretien: {{element.L_DETENT}}</div>
+                                    <div>Toitures: {{element.L_DMATTO}}</div>
+                                    <div>Gros murs: {{element.L_DMATGM}}</div>
+                                </td>
+                                <!-- Eléments de confort -->
+                                <td>
+                                    <div>Eau: <span ng-if="element.GEAULC === 'O'">Oui</span>
+                                        <span ng-if="element.GEAULC === 'N'">Non</span></div>
+                                    <div>électicité: <span ng-if="element.GELELC === 'O'">Oui</span>
+                                        <span ng-if="element.GELELC === 'N'">Non</span></div>
+                                    <div>Chauffage coll.: <span ng-if="element.GCHCLC === 'O'">Oui</span>
+                                        <span ng-if="element.GCHCLC === 'N'">Non</span></div>
+                                </td>
+                                <!-- Pièces(s) -->
+                                <td>
+                                    <div>Baignoire(s): {{parseFloat(element.DNBBAI)}}</div>
+                                    <div>Douche(s): {{parseFloat(element.DNBDOU)}}</div>
+                                    <div>Lavabo(s): {{parseFloat(element.DNBLAV)}}</div>
+                                    <div>Toilette(s): {{parseFloat(element.DNBWC)}}</div>
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Propriétaires -->
+                <div ng-if="ctrl.oInvariant.proprietaires.length !== 0">
+                    <h4>Propriétaire</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>Nom</th>
+                                <th>Etat civil</th>
+                                <th>Adresse</th>
+                                <th>Indivision</th>
+                                <th>Droit</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.proprietaires">
+                                <td>{{element.DQUALP}} {{element.DDENOM}}</td>
+                                <td >Né(e) le {{element.JDATNSS}} à {{element.DLDNSS}}</td>
+                                <td>{{element.DLIGN3}} {{element.DLIGN4}} {{element.DLIGN6}}</td>
+                                <td>{{element.L_CCODEM}}</td>
+                                <td>{{element.L_CCODRO}}</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <!-- Lots -->
+                <div ng-if="ctrl.oInvariant.lots.length !== 0">
+                    <h4>Lot-Local</h4>
+                    <table class="table font-12">
+                        <thead>
+                            <tr class="blue color-white">
+                                <th>Identifiant d'un lot</th>
+                                <th>Millièmes</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="element in ctrl.oInvariant.lots">
+                                <td>{{element.KLOT}}</td>
+                                <td>{{element.DNUMQL}}/{{element.DDENQL}}</td>
+                        </tbody>
+                    </table>
+                </div>
+
+            </div>
+            <div class="modal-footer" ng-if="ctrl.sketchesLenght !== 0">
+                <button class="btn btn-primary left" onclick="oVmap.printElem('#descriptive-invariant-sheet-content')">
+                    <span class="glyphicon glyphicon-print" aria-hidden="true"></span>
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Modal menu releve de propriete -->
+<div id="releve-propriete-modal-menu" class="modal fade" role="dialog">
+    <div class="modal-dialog">
+
+        <!-- Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">Relevé de propriété</h4>
+            </div>
+            <div class="modal-body">
+
+                <button class="btn btn-primary" ng-click="ctrl.displayReleveDeProprieteSheetOnMap('standard', ctrl.tmpID_DNUPRO, ctrl.tmpID_PAR)">
+                    Relevé de propriété standard
+                </button>
+                <i>(compte communal numéro {{ctrl.tmpID_DNUPRO}})</i>
+                <br>
+                <br>
+                <button class="btn btn-primary" ng-click="ctrl.displayReleveDeProprieteSheetOnMap('tiers', ctrl.tmpID_DNUPRO, ctrl.tmpID_PAR)">
+                    Relevé de propriété tiers
+                </button>
+                <i>(compte communal numéro {{ctrl.tmpID_DNUPRO}})</i>
+                <br>
+                <br>
+                <button class="btn btn-primary" ng-click="ctrl.displayReleveDeProprieteSheetOnMap('parcelle', ctrl.tmpID_DNUPRO, ctrl.tmpID_PAR)">
+                    Relevé de propriété de la parcelle
+                </button>
+                <i>(parcelle numéro {{ctrl.tmpID_PAR}})</i>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/modules/draw.html b/module/template/modules/draw.html
new file mode 100755
index 0000000000000000000000000000000000000000..5a857cadb9786be7f39adccd889d5740806ee12d
--- /dev/null
+++ b/module/template/modules/draw.html
@@ -0,0 +1,199 @@
+<!-- Module dessin -->
+<div class="module-title list-group-item lighen">MODULE DESSIN</div>
+
+
+<div id="draw-tools" style="margin-bottom: 10px">
+
+
+    <div class="checkbox checkbox-success hidden">
+        <input id="draw-anotations" type="checkbox" style="cursor:pointer" ng-click="ctrl.showHideAnotations()" checked>
+        <label for="draw-anotations" style="cursor:pointer">Afficher / Cacher les étiquettes</label>
+    </div>
+
+    <ul class="list-menu font-14">
+        <li class="basic-tools-dropdown-btn">
+            <a id="draw-point-button"
+               class="btn-draw"
+               ng-class="{'active': ctrl.currentAction === 'draw-drawPoint'}"
+               ng-click="ctrl.drawPoint(ctrl.currentAction === 'draw-drawPoint')">
+                <span class="icon-line"></span>
+                <span class="margin-sides-10">Point</span>
+            </a>
+        </li>
+        <li class="basic-tools-dropdown-btn">
+            <a id="draw-line-button"
+               class="btn-draw"
+               ng-class="{'active': ctrl.currentAction === 'draw-drawLineString'}"
+               ng-click="ctrl.drawLine(ctrl.currentAction === 'draw-drawLineString')">
+                <span class="icon-line"></span>
+                <span class="margin-sides-10">Ligne</span>
+            </a>
+        </li>
+        <li class="basic-tools-dropdown-btn">
+            <a id="draw-polygon-button"
+               class="btn-draw"
+               ng-class="{'active': ctrl.currentAction === 'draw-drawPolygon'}"
+               ng-click="ctrl.drawPolygon(ctrl.currentAction === 'draw-drawPolygon')">
+                <span class="icon-polygon"></span>
+                <span class="margin-sides-10">Polygone</span>
+            </a>
+        </li>
+        <li class="basic-tools-dropdown-btn">
+            <a id="draw-circle-button"
+               class="btn-draw"
+               ng-class="{'active': ctrl.currentAction === 'draw-drawCircle'}"
+               ng-click="ctrl.drawCircle(ctrl.currentAction === 'draw-drawCircle')">
+                <span class="icon-circle"></span>
+                <span class="margin-sides-10">Cercle</span>
+            </a>
+        </li>
+    </ul>
+
+    <div class="hr-gray margin-5"></div>
+
+    <div class="btn-group-vertical btn-draw-group" role="group" aria-label="...">
+
+        <button type="button" 
+                id="draw-modify-button" 
+                class="btn btn-default btn-draw" 
+                ng-class="{'active': ctrl.currentAction === 'draw-modifyFeature'}"
+                ng-click="ctrl.modifyFeature(ctrl.currentAction === 'draw-modifyFeature')">
+            <span class="glyphicon glyphicon-edit"></span><span class="margin-sides-10">Modifier un dessin</span>
+        </button>
+        <button type="button" 
+                id="draw-editInfos-button" 
+                class="btn btn-default btn-draw" 
+                ng-class="{'active': ctrl.currentAction === 'draw-editInfosFeature'}"
+                ng-click="ctrl.editInfosClick(ctrl.currentAction === 'draw-editInfosFeature')">
+            <span class="glyphicon glyphicon-pencil"></span><span class="margin-sides-10">Editer les informations</span>
+        </button>
+        <button type="button" 
+                id="draw-dell-button" 
+                class="btn btn-default btn-draw"
+                ng-class="{'active': ctrl.currentAction === 'draw-deleteFeature'}"
+                ng-click="ctrl.deleteFeature(ctrl.currentAction === 'draw-deleteFeature')">
+            <span class="glyphicon glyphicon-trash"></span><span class="margin-sides-10">Supprimer un dessin</span>
+        </button>
+
+        <!-- <button type="button" id="draw-dellAll-button" class="btn btn-default btn-draw" ng-click="ctrl.deleteAllFeatures()">Supprimer tous les dessins</button> -->
+
+        <div class="hr-gray"></div>
+
+        <button type="button" id="draw-display-features-button" class="btn btn-success btn-draw" ng-click="ctrl.displayFeaturesList()" onclick="oVmap.getMap().removeActionsAndTooltips()">
+            <span class="icon-format_list_bulleted left" style="font-size: 20px;"></span>
+            <span class="right" style="margin: 1px 0px;">VOIR LA LISTE DES DESSINS</span>
+        </button>
+
+    </div>
+
+
+    <!-- Modal View the feature-->
+    <div class="modal fade" id="feature-description-modal" role="dialog">
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">&times;</button>
+                    <button type="button" class="btn btn-primary btn-sm" ng-click="ctrl.displayFeaturesList()">Voir la liste</button>
+
+                </div>
+                <!-- modal-body modal-body-big -->
+                <div class="modal-body modal-body-big" style="height:auto">
+
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <table 	id="draw-feature-description-table" 
+                            class="font-14 draw-table-list">
+                    </table>
+
+                </div>
+                <!-- /.modal-body -->
+                <div class="modal-footer" ng-if="ctrl.sketches.length !== 0">
+                    <button type="button" class="btn btn-primary right margin-sides-5" data-dismiss="modal" ng-click="ctrl.zoomToFeature(ctrl.selectedFeature)">Zoom</button>
+                    <button type="button" class="btn btn-info right margin-sides-5" data-dismiss="modal" ng-click="ctrl.editFeatureInfos(ctrl.selectedFeature)">Modifier</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <!-- Modal Edit the feature-->
+    <div class="modal fade" id="feature-edit-modal" role="dialog" data-keyboard="false" data-backdrop="static">
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <!-- Header ne s'affiche que si les champs obligatoires ont été donnés à la feature -->
+                <div id="draw-edit-modal-header" class="modal-header" ng-class="{'hidden': ctrl.selectedFeature.get('infoValues') == undefined}">
+                    <button type="button" class="close" data-dismiss="modal" ng-click="ctrl.setInfosToFeature(ctrl.selectedFeature)">&times;</button>
+                    <button type="button" class="btn btn-primary btn-sm" ng-click="ctrl.displayFeaturesList()">Voir la liste</button>
+                </div>
+                <div class="modal-body modal-body-big font-12" style="height:auto">
+
+                    <form name="drawForm" ng-submit="ctrl.updateFeatureInfos(ctrl.selectedFeature, ctrl.fields_)">
+
+                        <div ng-repeat="field in ctrl.fields_">
+                            <div class="input-group-sm">
+                                <b>{{field.name}}</b>
+
+                                <div ng-switch="field.type">
+                                    <div ng-switch-when="color">
+
+                                        <div class="input-group">
+                                            <span class="input-group-addon color-span"></span>
+                                            <span class="input-group-addon color-span2"></span>
+                                            <input type="text" id="print-{{field.id}}-input" class="form-control input-sm colorpicker"/>
+                                        </div>
+
+                                    </div>
+                                    <div ng-switch-when="boolean">
+
+                                        <input id="print-{{field.id}}-input" class="bootstrap-toggle" type="checkbox" checked data-toggle="toggle" data-size="mini" data-width="60" data-onstyle="info" data-on="Oui" data-off="Non">
+
+                                    </div>
+                                    <div ng-switch-default>
+                                        <input type="{{field.type}}" id="print-{{field.id}}-input" class="form-control input-sm" ng-required="{{field.required}}"/>
+                                    </div>
+                                </div>
+
+                            </div>  
+                        </div>
+                        <button type="submit" type="button" class="btn btn-primary save-form-btn">Enregistrer</button>
+                        <button type="button" class="btn btn-info save-form-btn margin-sides-10" data-dismiss="modal" ng-click="ctrl.calcelEditFeature(ctrl.selectedFeature)">Annuler</button>
+                    </form>
+                </div>
+                <!-- /.modal-body modal-body-big -->
+            </div>
+        </div>
+    </div>
+
+    <!-- Modal Features list -->
+    <div class="modal fade" id="draw-features-list-modal" role="dialog">
+        <div class="modal-dialog modal-lg">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" id="modal-display-draw-close" class="close" data-dismiss="modal">&times;</button>
+                    <h4 class="modal-title">Dessins</h4>
+                </div>
+                <div id="draw-table-list-body" class="modal-body modal-body-big" style="height:82%">
+                    <div ng-if="ctrl.sketchesLenght == 0">
+                        <b>Aucun dessin à afficher</b>
+                    </div>
+
+                    <!-- Element bootstrap-table plugin (http://bootstrap-table.wenzhixin.net.cn/examples)  -->
+                    <table 	id="draw-features-list-table" 
+                            class="font-14 draw-table-list">
+                    </table>
+
+                    <!-- /.modal-body -->
+                </div>
+                <div class="modal-footer" ng-if="ctrl.sketchesLenght != 0">
+                    <button class="btn btn-primary left" data-dismiss="modal" ng-click="ctrl.removeSelectedFeatures()">Supprimer la selection</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="hidden">
+        <input id="geodesic" type="checkbox" style="cursor:pointer" checked>use geodesic draws
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/studio.html b/module/template/studio.html
new file mode 100755
index 0000000000000000000000000000000000000000..9babe267f9e7551394c66310dfd2bc584c1c64d5
--- /dev/null
+++ b/module/template/studio.html
@@ -0,0 +1,3 @@
+
+<!-- Studio d'édition des formulaires -->
+<div data-app-studio-main-directive></div>
\ No newline at end of file
diff --git a/module/template/tools/advancedselect.html b/module/template/tools/advancedselect.html
new file mode 100755
index 0000000000000000000000000000000000000000..9e0f58029789848d5353dcddb138c5bb9c7fa15d
--- /dev/null
+++ b/module/template/tools/advancedselect.html
@@ -0,0 +1,243 @@
+<div id="vmap-advancedselect-tool"></div>
+
+<div class="basic-tools-select-container basic-tools-dropdown-menu">
+
+    <!--Palette d'interrogation-->
+    <div id="basictools-select-select-palette" ng-show="vmapScope.sizeOf(ctrl.oQueryableBOs) > 0">
+
+        <div class="btn-group btn-block">
+            <button type="button"
+                    class="btn btn-sm btn-info"
+                    style="width: 80%"
+                    ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-selectByPoint' || ctrl.currentAction === 'basicTools-selectByLineString' || ctrl.currentAction === 'basicTools-selectByPolygon' || ctrl.currentAction === 'basicTools-selectByCircle'}"
+                    ng-click="ctrl.selectGeomType !== '' ? ctrl.startSelection(ctrl.selectGeomType, ctrl.currentAction === 'basicTools-selectBy' + ctrl.selectGeomType) : angular.noop">
+                Sélection graphique
+            </button>
+            <button type="button"
+                    class="btn btn-sm btn-default dropdown-toggle"
+                    style="width: 20%"
+                    data-toggle="dropdown"
+                    aria-haspopup="true"
+                    aria-expanded="false">
+                <span class="icon-point" ng-show="ctrl.selectGeomType === 'Point'"></span>
+                <span class="icon-multipoint" ng-show="ctrl.selectGeomType === 'MultiPoint'"></span>
+                <span class="icon-line" ng-show="ctrl.selectGeomType === 'LineString'"></span>
+                <span class="icon-polygon" ng-show="ctrl.selectGeomType === 'Polygon'"></span>
+                <span class="icon-circle" ng-show="ctrl.selectGeomType === 'Circle'"></span>
+            </button>
+            <ul class="dropdown-menu">
+                <li><a href="javascript:void(0)"
+                       ng-click="ctrl.selectGeomType = 'Point'; ctrl.startSelection('Point', false)">
+                        <span class="icon-point"></span> Point
+                    </a></li>
+                <li><a href="javascript:void(0)"
+                       ng-click="ctrl.selectGeomType = 'MultiPoint'; ctrl.startSelection('MultiPoint', false)">
+                        <span class="icon-multipoint"></span> Multi point
+                    </a></li>
+                <li><a href="javascript:void(0)"
+                       ng-click="ctrl.selectGeomType = 'LineString'; ctrl.startSelection('LineString', false)">
+                        <span class="icon-line"></span> Ligne
+                    </a></li>
+                <li><a href="javascript:void(0)"
+                       ng-click="ctrl.selectGeomType = 'Polygon'; ctrl.startSelection('Polygon', false)">
+                        <span class="icon-polygon"></span> Polygone
+                    </a></li>
+                <li><a href="javascript:void(0)"
+                       ng-click="ctrl.selectGeomType = 'Circle'; ctrl.startSelection('Circle', false)">
+                        <span class="icon-circle"></span> Cercle
+                    </a></li>
+            </ul>
+        </div>
+
+        <div class="margin-10"></div>
+
+        <!--Bouton Requêteur-->
+        <div style="text-align: center">
+            <button type="button"
+                    class="btn btn-info btn-sm btn-block"
+                    ng-click="ctrl.displaySelectionTable(ctrl.aSelections)">
+                <span class="icon-format_list_bulleted margin-sides-2"></span>
+                Requêteur
+            </button>
+        </div>
+    </div>
+    <div ng-show="!vmapScope.sizeOf(ctrl.oQueryableBOs) > 0">
+        <label class="margin-10 margin-sides-10">
+            Aucun objet métier ou pas de droits en édition
+        </label>
+    </div>
+
+</div>
+
+<!--Select list modal-->
+<div class="modal fade" id="select-list-modal" role="dialog">
+    <div class="modal-dialog modal-xl">
+        <!--Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title"><span class="icon-format_list_bulleted margin-sides-5"></span>Requêteur</h4>
+            </div>
+            <div class="modal-body modal-body-big">
+
+                <div class="row" style="height: 100%;">
+                    <!--Menu-->
+                    <div class="col-md-2">
+                        <ul class="nav nav-pills nav-stacked" style="width: 180px">
+
+                            <!--Boutons du menu-->
+                            <li data-toggle="pill"
+                                id="select_modal_tab_{{bo.business_object_id}}"
+                                class="list-group-item list-group-item-modal"
+                                ng-repeat="bo in ctrl.oBusinessObjects| orderObjectBy:'title'"
+                                ng-class="{'active': ctrl.sSelectedBo === bo.business_object_id}"
+                                ng-click="ctrl.sSelectedBo = bo.business_object_id">
+                                <span ng-show="ctrl.tableSelectionMetadata[bo.business_object_id]['total_row_number'] !== undefined">
+                                    {{bo.title}} ({{ctrl.tableSelectionMetadata[bo.business_object_id]['total_row_number']}})
+                                </span>
+                                <span ng-show="ctrl.tableSelectionMetadata[bo.business_object_id]['total_row_number'] === undefined">
+                                    {{bo.title}} (0)
+                                </span>
+                            </li>
+                        </ul>
+                    </div>
+
+                    <!--Workspace-->
+                    <div class="col-md-10" style="height: 100%;">
+
+                        <!--Tables-->
+                        <div ng-repeat="(bo_id, bo) in ctrl.oBusinessObjects"
+                             ng-show="ctrl.sSelectedBo === bo_id"
+                             class="mapmodal-element">
+
+                            <!--Search Form reader-->
+                            <div id="select_search_form_reader_{{bo_id}}"
+                                 app-form-reader
+                                 app-properties="ctrl.properties"
+                                 app-token="ctrl.token"></div>
+
+                            <!--Table-->
+                            <div class="select_modal_table_container">
+                                <table id="select_table_{{bo_id}}"
+                                       class="select_modal_table"
+                                       data-toggle="table"
+                                       data-search="false"
+                                       data-escape="false"
+                                       data-show-columns="false"
+                                       data-classes="table table-hover table-condensed"
+                                       data-striped="true"
+                                       data-click-to-select="true"
+                                       data-show-export="false">
+                                    <thead>
+                                        <tr>
+                                            <th data-field="state" data-checkbox="true"></th>
+                                            <th class="col-btn" data-field="action" data-formatter="nsVmap.nsToolsManager.AdvancedSelect.selectTableFormatter" data-events="selectTableEvents"></th>
+                                            <th ng-repeat="(key, value) in bo.list_fields"
+                                                ng-if="value !== 'bo_selection_'"
+                                                data-field="{{value}}"
+                                                data-escape="false"
+                                                data-sortable="true">{{value}}</th>
+                                            <th data-field="bo_selection_" data-visible="false"></th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="select_modal_table_buttons">
+                                <div class="col-md-4 col-sm-12 col-xs-12">
+                                    <div class="input-group input-group-sm"
+                                         ng-show="ctrl.tableSelectionMetadata[bo.business_object_id]['total_pages'] > 1"
+                                         ng-init="ctrl.initTablePage(bo_id)">
+                                        <button class="btn input-group-addon" data-pager-action="previous"
+                                                ng-click="ctrl.goTablePage(bo_id, ctrl.tableSelectionMetadata[bo_id].current_page - 1)"
+                                                ng-disabled="ctrl.tableSelectionMetadata[bo_id].current_page < 2">
+                                            <i class="glyphicon glyphicon-triangle-left"></i>
+                                        </button>
+                                        <input type="number"
+                                               class="form-control"
+                                               style="width: 50px;float: none;"
+                                               data-pager-action="pagenum"
+                                               ng-model="ctrl.tableSelectionMetadata[bo_id].current_page"
+                                               ng-change="ctrl.goTablePageWithTimeout(bo_id, ctrl.tableSelectionMetadata[bo_id].current_page)">
+                                        <input type="number"
+                                               class="form-control"
+                                               style="width: 50px;float: none;"
+                                               data-pager-action="pagenum"
+                                               disabled
+                                               ng-model="ctrl.tableSelectionMetadata[bo_id].total_pages">
+                                        <button class="btn input-group-addon" data-pager-action="next"
+                                                ng-click="ctrl.goTablePage(bo_id, ctrl.tableSelectionMetadata[bo_id].current_page + 1)"
+                                                ng-disabled="ctrl.tableSelectionMetadata[bo_id].current_page == ctrl.tableSelectionMetadata[bo_id].total_pages">
+                                            <i class="glyphicon glyphicon-triangle-right"></i>
+                                        </button>
+                                    </div>
+                                </div>
+                                <div class="col-xs-8" style="text-align: right">
+                                    <button class="btn btn-default" ng-click="ctrl.tableDeleteSelection('#select_table_' + bo_id)" ng-show="bo.user_rights.indexOf('DELETE') !== -1">
+                                        <span class="icon-trash"></span> Supprimer les enregistrements
+                                    </button>
+                                    <button class="btn btn-default" ng-click="ctrl.tableAddToCard('#select_table_' + bo_id, false)">
+                                        <span class="icon-shopping_basket"></span> Ajouter au panier
+                                    </button>
+                                    <button class="btn btn-default" ng-click="ctrl.tableAddToCard('#select_table_' + bo_id, true)">
+                                        <span class="glyphicon glyphicon-repeat"></span> Remplacer panier
+                                    </button>
+                                    <div class="export btn-group dropup">
+                                        <button class="btn btn-default dropdown-toggle" aria-label="export type" title="Export data" data-toggle="dropdown" type="button">
+                                            <i class="glyphicon glyphicon-export icon-share"></i> Exporter <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu" role="menu">
+                                            <li role="menuitem" data-type="json" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'json')"><a href="javascript:void(0)">JSON</a></li>
+                                            <li role="menuitem" data-type="csv" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'csv')"><a href="javascript:void(0)">CSV</a></li>
+                                            <li role="menuitem" data-type="excel" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'xlsx')"><a href="javascript:void(0)">MS-Excel</a></li>
+                                            <li ng-if="ctrl.bGTFExport" role="menuitem" data-type="excel" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'gtf')"><a href="javascript:void(0)">Autres formats</a></li>
+                                        </ul>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--GTF export form modal-->
+<div class="modal fade" id="vmap-gtf-export-form-modal">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title"><span class="glyphicon glyphicon-export icon-share margin-sides-5"></span>Demande d'export</h4>
+            </div>
+            <div class="modal-body">
+                <form id="vmap-gtf-export-form" ng-submit="ctrl.submitGtfExportFormModal(ctrl.oGTFExportAttibutes)">
+                    <div class="form-group">
+                        <label for="vmap-gtf-export-form-format">Format de sortie</label>
+                        <select id="vmap-gtf-export-form-format"
+                                class="form-control"
+                                ng-model="ctrl.oGTFExportAttibutes.format"
+                                ng-options="item.value as item.label for item in ctrl.gtf_export_formats"
+                                ng-required="true"></select>
+                    </div>
+                    <div class="form-group">
+                        <label for="vmap-gtf-export-form-coordsys">Stystème de coordonnées (SRID)</label>
+                        <select id="vmap-gtf-export-form-coordsys"
+                                class="form-control"
+                                ng-model="ctrl.oGTFExportAttibutes.coordsys"
+                                ng-options="item.value as item.label for item in ctrl.gtf_export_coordsys"
+                                ng-required="true"></select>
+                    </div>
+                    <div class="form-group">
+                        <label for="vmap-gtf-export-form-mails">Addresses mail (séparées par un point virgule)</label>
+                        <input type="text" class="form-control" id="vmap-gtf-export-form-mails" placeholder="ex: john.doe@veremes.com;armand@gmail.com" ng-model="ctrl.oGTFExportAttibutes.mails" required>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="submit" class="btn btn-primary" form="vmap-gtf-export-form">Demander un export</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/tools/advancedselect_mobile.html b/module/template/tools/advancedselect_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..35341c47d45db7e68361202fd59e3f942160d01c
--- /dev/null
+++ b/module/template/tools/advancedselect_mobile.html
@@ -0,0 +1,57 @@
+<div id="vmap-advancedselect-tool"></div>
+
+<!-- Sélection de l'objet -->
+<div class="margin-sides-15">
+    <select class="form-control margin-5" ng-model="ctrl.sSelectedBo" ng-options="bo_id as bo.title for (bo_id, bo) in ctrl.oBusinessObjects"></select>
+</div>
+<!-- Menu -->
+<div id="vmap_menu_requeteur_menu_{{bo_id}}" 
+     class="advanced-select-mobile-accordion"
+     ng-repeat="(bo_id, bo) in ctrl.oBusinessObjects"
+     ng-show="ctrl.sSelectedBo === bo_id">
+
+    <div class="panel list-group height-100">
+        <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_requeteur_menu_filtre_{{bo_id}}" data-parent="#vmap_menu_requeteur_menu_{{bo_id}}">
+            <span class="icon-filter menu_logo"></span>
+            Filtre
+        </a>
+        <div id="vmap_menu_requeteur_menu_filtre_{{bo_id}}" class="sublinks collapse in">
+
+            <!--Search Form reader-->
+            <div id="select_search_form_reader_{{bo_id}}"
+                 app-form-reader 
+                 app-properties="ctrl.properties"
+                 app-token="ctrl.token"></div>
+
+        </div>
+        <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_requeteur_menu_table_{{bo_id}}" data-parent="#vmap_menu_requeteur_menu_{{bo_id}}">
+            <span class="icon-table menu_logo"></span>
+            Tableau résultant
+        </a>
+        <div id="vmap_menu_requeteur_menu_table_{{bo_id}}" class="sublinks collapse margin-10 advanced-select-mobile-accordion-table">
+            <table id="select_table_{{bo_id}}" 
+                   class="select_modal_table"
+                   data-toggle="table"
+                   data-search="false"
+                   data-escape="false"
+                   data-show-columns="true"
+                   data-classes="table table-hover table-condensed"
+                   data-striped="true"
+                   data-click-to-select="true"
+                   data-show-export="false">
+                <thead>
+                    <tr>
+                        <th data-field="state" data-checkbox="true"></th>
+                        <th class="col-btn" data-field="action" data-formatter="nsVmap.nsToolsManager.AdvancedSelect.selectTableFormatter" data-events="selectTableEvents"></th>
+                        <th ng-repeat="(key, value) in bo.list_fields"
+                            ng-if="value !== 'selection'"
+                            data-field="{{value}}"
+                            data-escape="false"
+                            data-sortable="true">{{value}}</th>
+                        <th data-field="selection" data-visible="false"></th>
+                    </tr>
+                </thead>
+            </table>
+        </div>
+    </div>
+</div> 
\ No newline at end of file
diff --git a/module/template/tools/basicselect.html b/module/template/tools/basicselect.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f829c663fd7e9b9eded8c88c38dc379a45fca29
--- /dev/null
+++ b/module/template/tools/basicselect.html
@@ -0,0 +1,36 @@
+<div id="vmap-basicselect-tool"></div>
+
+<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+    <a class="basic-tools-element pointer"
+       id="basic-tools-dropdown-basicselect-btn"
+       ng-show="ctrl.aBusinessObjectsList.length > 0 || (ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0)"
+       ng-class="{ 'active2':  ctrl.currentAction === ''}"
+       title="Sélection simple"
+       onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+       <!-- Nom de l'objet interrogé -->
+       <span ng-show="ctrl.sSelectedBo !== 'vmap_select_getfeatureinfo'">
+           {{ctrl.oQueryableBOs[ctrl.sSelectedBo].bo_title}}
+       </span>
+       <span ng-show="ctrl.sSelectedBo === 'vmap_select_getfeatureinfo'">
+           WMS
+       </span>
+       <!-- Icone -->
+        <span class="icon-info" aria-hidden="true"></span>
+    </a>
+    <!-- Liste des objets interrogeables -->
+    <ul class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-basicselect-content"
+        ng-show="ctrl.aBusinessObjectsList.length > 0">
+        <li class="dropdown-header" ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0">Objets métiers</li>
+        <li ng-repeat="bo in ctrl.aQueryableBOs | orderBy : 'bo_title'"
+            ng-click="ctrl.sSelectedBo = bo.bo_id"
+            onclick="oVmap.getMap().removeActionsAndTooltips();oVmap.getToolsManager().getBasicTools().toggleOutTools();">
+            <a href="#">{{bo.bo_title}}</a>
+        </li>
+        <li class="divider" ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0"></li>
+        <li ng-click="ctrl.sSelectedBo = 'vmap_select_getfeatureinfo'"
+            onclick="oVmap.getMap().removeActionsAndTooltips();oVmap.getToolsManager().getBasicTools().toggleOutTools();"
+            ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0">
+            <a href="#">Interrogation WMS</a>
+        </li>
+    </ul>
+</li>
diff --git a/module/template/tools/basictools.html b/module/template/tools/basictools.html
new file mode 100644
index 0000000000000000000000000000000000000000..e85c74762d60d92d19a6b560d5811b7a178fad98
--- /dev/null
+++ b/module/template/tools/basictools.html
@@ -0,0 +1,99 @@
+<div class="map-basic-tools" id="map-basic-tools">
+    <div id="map-basic-tools-row" class="map-basic-tools-row">
+        <div>
+            <ul class="nav nav-pills basic-tools-nav">
+                <!-- Outils de localisation -->
+                <div app-location app-lang="ctrl.lang" app-map="ctrl.map"></div>
+                <!-- Outil d'export d'url -->
+                <div>
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a class="basic-tools-element pointer"
+                           title="Générateur d'URL"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-at" aria-hidden="true"></span>
+                        </a>
+                        <div app-url-exporter app-lang="ctrl.lang" app-map="ctrl.map"
+                             id="basic-tools-dropdown-urlexporter"
+                             class="dropdown-menu basic-tools-dropdown-element"
+                             style="margin: -10px -1px; width: 30%;">
+                        </div>
+                    </li>
+                </div>
+                <!-- Login de l'utilisateur -->
+                <div class="right">
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a class="basic-tools-element pointer"
+                           title="Utilisateur"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-user" aria-hidden="true"></span>
+                        </a>
+                        <div app-vmap-user app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+                             id="basic-tools-dropdown-user"
+                             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-controls-content">
+                        </div>
+                    </li>
+                </div>
+                <!-- Contrôles -->
+                <div class="right">
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a class="basic-tools-element pointer"
+                           title="Outils de contrôle"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-cog" aria-hidden="true"></span>
+                        </a>
+                        <div app-controls app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+                             id="basic-tools-dropdown-controls-content"
+                             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-controls-content">
+                        </div>
+                    </li>
+                </div>
+                <!-- Impression -->
+                <div class="right">
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a id="print-select-btn"
+                           class="basic-tools-element pointer"
+                           title="Impression"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="glyphicon glyphicon-print" aria-hidden="true"></span>
+                        </a>
+                        <div app-print app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+                             id="basic-tools-dropdown-print-content"
+                             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-print-content">		
+                        </div>
+                    </li>
+                </div>
+                <!-- Insertion -->
+                <div class="right">
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a class="basic-tools-element pointer"
+                           id="basic-tools-dropdown-insert-btn" 
+                           title="Insertion"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-add-feature" aria-hidden="true"></span>
+                        </a>
+                        <div app-insert app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+                             id="basic-tools-dropdown-insert-content" 
+                             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-select-content">
+                        </div>
+                    </li>
+                </div>
+                <!--Outils de sélection-->
+                <div app-select app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction" class="right basic-tools-nav"></div>
+                <!-- Mesure -->
+                <div class="right">
+                    <li style="position: inherit" class="basic-tools-dropdown">
+                        <a 	class="basic-tools-element pointer"
+                            title="Outils de mesure"
+                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-measure"></span>
+                        </a>
+                        <div app-measure app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+                             id="basic-tools-dropdown-measure-content"
+                             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-measure-content">
+                        </div>
+                    </li>
+                </div>
+            </ul>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/tools/basictools_mobile.html b/module/template/tools/basictools_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..0d4cf4f74244b71fcc358a229e310247d291c9e8
--- /dev/null
+++ b/module/template/tools/basictools_mobile.html
@@ -0,0 +1,153 @@
+<div class="map-basic-tools" id="map-basic-tools">
+    <div id="map-basic-tools-row" class="map-basic-tools-row">
+        <div>
+            <ul class="nav nav-pills basic-tools-nav" ng-show="!bMobileMenuOpen">
+
+                <!-- Bouton recherche -->
+                <div class="vmap_mobile_tool vmap_mobile_tool_search left" ng-click="ctrl.displayLocationMobileMenu()">
+                    <span class="icon-search"></span>
+                </div>
+                <!-- Sélecteur objet métier -->
+                <div app-select app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction" class="left basic-tools-nav"></div>
+                <!-- Bouton Menu -->
+                <div class="vmap_mobile_tool right" ng-click="ctrl.displayAdvancedMobileMenu()">
+                    <span class="icon-format_list_bulleted"></span>
+                </div>
+                <!-- Bouton Couches -->
+                <div class="vmap_mobile_tool right" ng-click="ctrl.displayLayersMobileMenu()">
+                    <span class="icon-layers2"></span>
+                </div>
+                <!-- Bouton localisation immédiate -->
+                <div class="vmap_mobile_tool right" ng-click="ctrl.locationGeolocateMe()">
+                    <span class="icon-location"></span>
+                </div>
+
+            </ul>
+
+            <ul class="nav nav-pills basic-tools-nav" ng-show="bMobileMenuOpen">
+
+                <!-- Bouton retour -->
+                <div class="btn btn-default vmap_return_tool right" ng-click="ctrl.hideMobileMenu()">
+                    <span class="icon-caret-left"></span> Retour à la carte
+                </div>
+
+            </ul>
+        </div>
+    </div>
+</div>
+
+<div class="mobile-menu" ng-show="bMobileMenuOpen">
+    <!--Outil de localisation-->
+    <div ng-show="bMobileLocationMenuOpen">
+        <div app-location app-lang="ctrl.lang" app-map="ctrl.map"></div>
+    </div>
+    <!--Outil couches et cartes-->
+    <div ng-show="bMobileLayersMenuOpen" class="height-100">
+        <ul class="nav nav-tabs navbar-default">
+            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_legend">Légende</a></li>
+            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_layers">Couches</a></li>
+            <li class="right active"><a data-toggle="tab" href="#vmap_menu_map_maps">Cartes</a></li>
+        </ul>
+        <div class="tab-content" style="height: calc(100% - 42px)">
+            <!-- Cartes -->
+            <div id="vmap_menu_map_maps" class="tab-pane height-100 fade in active">
+                <app-maplistlitle app-lang="ctrl.lang" app-maplistlitle-map="ctrl.map"></app-maplistlitle>
+            </div>
+            <!-- Couches -->
+            <div id="vmap_menu_map_layers" class="tab-pane height-100 overflow_y fade">
+                <div app-layertree app-map="ctrl.map" app-proj="ctrl.proj" app-lang="ctrl.lang" id="app-layertree"></div>
+            </div>
+            <!-- Légende -->
+            <div id="vmap_menu_map_legend" class="tab-pane height-100 overflow_y fade">
+                <div app-maplegend app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" app-lang="vmapCtrl.lang" id="app-maplegend"></div>
+            </div>
+        </div>
+    </div>
+
+    <!--Outils Avancés-->
+    <div ng-show="bMobileAdvancedMenuOpen" class="height-100">
+        <div id="vmap_menu_mobile_menu">
+            <div class="panel list-group">
+                <a id="vmap_menu_mobile_menu_user_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_user" data-parent="#vmap_menu_mobile_menu">
+                    <span class="icon-user mobile_menu_logo"></span>
+                    Utilisateur
+                </a>
+                <div id="vmap_menu_mobile_menu_user" app-vmap-user app-lang="ctrl.lang" app-map="ctrl.map" class="sublinks collapse"></div>
+                <a id="vmap_menu_mobile_menu_location_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_location" data-parent="#vmap_menu_mobile_menu">
+                    <span class="icon-map mobile_menu_logo"></span>
+                    Localisation
+                </a>
+                <div id="vmap_menu_mobile_menu_location" class="sublinks collapse">
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoHome()"><span class="icon-home mobile_menu_logo"></span> Position initialie</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGeolocateMe()"><span class="icon-location mobile_menu_logo"></span> Ma position</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationMaxExtent()"><span class="icon-language mobile_menu_logo"></span> Étendue max</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoCoordinates()"><span class="icon-coordinates mobile_menu_logo"></span> Coordonnées</a>
+                </div>
+                <a id="vmap_menu_mobile_menu_measure_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_measure" data-parent="#vmap_menu_mobile_menu">
+                    <span class="icon-measure mobile_menu_logo"></span>
+                    Mesurer
+                </a>
+                <div id="vmap_menu_mobile_menu_measure" app-measure app-lang="ctrl.lang" app-map="ctrl.map" class="sublinks collapse"></div>
+                <a id="vmap_menu_mobile_menu_requeteur_button" href="#" class="list-group-item" data-parent="#vmap_menu_mobile_menu" ng-click="ctrl.displayRequeteur()">
+                    <span class="icon-table mobile_menu_logo"></span>
+                    Requêteur
+                </a>
+                <a id="vmap_menu_mobile_menu_insert_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_insert" data-parent="#vmap_menu_mobile_menu">
+                    <span class="icon-add-feature mobile_menu_logo"></span>
+                    Insertion
+                </a>
+                <div id="vmap_menu_mobile_menu_insert" class="sublinks collapse">
+                    <div app-insert app-lang="ctrl.lang" app-map="ctrl.map"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <!--Requêteur-->
+    <div ng-show="bMobileRequeteurOpen" class="height-100">
+        <div app-advancedselect app-lang="ctrl.lang" app-map="ctrl.map" class="height-100"></div>
+    </div>
+</div>
+
+<!-- Contrôles -->
+<div class="hidden">
+    <div app-controls app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+         id="basic-tools-dropdown-controls-content"
+         class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-controls-content">
+    </div>
+</div>
+
+<!--Modale pour la localisation sur coordonnées-->
+<div id="location-goto-modal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content" style="max-height: 100%">
+            <div class="modal-header">
+                <!-- Bouton retour -->
+                <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal">
+                    <span class="icon-caret-left"></span> Retour
+                </div>
+                <h4 class="modal-title">Rejoindre les coordonnées</h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer">
+                <b>Projection:</b>
+                <select class="form-control" ng-model="locationGoToProjection">
+                    <option value="EPSG:4326">{{locationProjections['EPSG:4326']}}</option>
+                    <option value="EPSG:3857">{{locationProjections['EPSG:3857']}}</option>
+                    <option value="EPSG:2154">{{locationProjections['EPSG:2154']}}</option>
+                </select>
+                <br>
+                <b>Coordonnées:</b>
+                <div class="input-group-sm">
+                    <input type="number" class="form-control" placeholder="X" ng-model="locationGoToX">
+                </div>
+                <div class="input-group-sm">
+                    <input type="number" class="form-control" placeholder="Y" ng-model="locationGoToY">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
+                <button type="button" class="btn btn-primary" ng-click="ctrl.locationGoTo(locationGoToX, locationGoToY, locationGoToProjection)">Valider</button>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/tools/controls.html b/module/template/tools/controls.html
new file mode 100755
index 0000000000000000000000000000000000000000..63a7284c85166b12882126b5b69fbf2ac43b3810
--- /dev/null
+++ b/module/template/tools/controls.html
@@ -0,0 +1,19 @@
+
+<i class="basic-tools-dropdown-title">Outils</i>
+
+<ul class="basic-tools-dropdown-menu">
+    <li role="separator" class="divider"></li>
+
+
+    <li ng-repeat="tool in ctrl.aAvaliableControls" 
+        ng-click="tool.active = !tool.active; ctrl.Controls.setToolActive(tool.id, tool.active);">
+        <a data-toggle="tooltip" data-placement="left"
+           title="{{::tool.description}}">
+            <div class="checkbox checkbox-info left margin-2">
+                <input id="{{::tool.id}}-tool" type="checkbox" ng-model="tool.active">
+                <label for="{{::tool.id}}-tool" class="unselectable">
+                    {{::tool.title}}
+                </label>
+            </div>
+        </a></li>
+</ul>
diff --git a/module/template/tools/infocontainer.html b/module/template/tools/infocontainer.html
new file mode 100644
index 0000000000000000000000000000000000000000..187bfcaedb5653aec80fb2cebccfe0d4ec8c5f15
--- /dev/null
+++ b/module/template/tools/infocontainer.html
@@ -0,0 +1,97 @@
+
+<div id="infocontainer-info-container">
+
+    <!--boutons de navigation-->
+    <div id="infocontainer-nav" class="transparent">
+
+        <ul class="nav nav-pills nav-infocontainer">
+            <li class="margin-sides-10">
+                <label class="color-dark-blue">
+                    <span class="icon-shopping_basket my-card-logo"></span>
+                    MON PANIER
+                </label>
+            </li>
+            <li role="presentation"
+                ng-repeat="tab in ctrl.infos"
+                ng-class="{'active': ctrl.selectedTabIndex === this['$index']}">
+                <a data-toggle="pill"
+                   id="infocontainer-{{this['$index']}}-btn"
+                   class="basic-tools-element pointer infocontainer-nav-element btn"
+                   ng-click="ctrl.displayTabByIndex(this['$index'])">
+                    <span class="infocontainer-nav-title">{{tab.tabName}}</span>
+                    <span class="infocontainer-btn-close-tab pointer"
+                          ng-click="ctrl.removeTab(tab)">
+                        <span class="glyphicon glyphicon-remove"></span>
+                    </span>
+                </a>
+            </li>
+        </ul>
+
+        <div class="infocontainer-btn-container">
+            <div class="infocontainer-btn-remove-location">
+                <button class="btn btn-default btn-xs"
+                        type="button"
+                        onclick="oVmap.getMap().getLocationOverlayFeatures().clear()">
+                    <span class="glyphicon glyphicon-remove"></span> Localisation
+                </button>
+            </div>
+            <div class="btn-group dropup infocontainer-btn-export">
+                <button id="infocontainer-dropdown-exports"
+                        class="btn btn-default btn-xs dropdown-toggle"
+                        type="button"
+                        data-toggle="dropdown"
+                        aria-haspopup="true"
+                        aria-expanded="false">
+                    <i class="glyphicon glyphicon-export icon-share"></i> Exporter <span class="caret"></span>
+                </button>
+                </ul>
+                <ul class="dropdown-menu pull-right">
+                    <li role="menuitem" data-type="json" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'json')"><a href="javascript:void(0)">JSON</a></li>
+                    <li role="menuitem" data-type="xml" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'xml')"><a href="javascript:void(0)">XML</a></li>
+                    <li role="menuitem" data-type="csv" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'csv')"><a href="javascript:void(0)">CSV</a></li>
+                    <li role="menuitem" data-type="txt" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'txt')"><a href="javascript:void(0)">TXT</a></li>
+                    <!--<li role="menuitem" data-type="sql" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'sql')"><a href="javascript:void(0)">SQL</a></li>-->
+                    <li role="menuitem" data-type="excel" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'excel')"><a href="javascript:void(0)">MS-Excel</a></li>
+                </ul>
+            </div>
+            <div class="btn-group dropup infocontainer-btn-reports">
+                <button id="infocontainer-dropdown-reports"
+                        class="btn btn-default btn-xs dropdown-toggle"
+                        type="button"
+                        data-toggle="dropdown"
+                        aria-haspopup="true"
+                        aria-expanded="false"
+                        ng-click="ctrl.setAvaliablePrintReports(ctrl.infos[ctrl.selectedTabIndex].tabCode)">
+                    Rapports <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu pull-right">
+                    <li ng-repeat="printReport in ctrl.avaliablePrintReports">
+                        <a href="javascript:void(0)"
+                           class="padding-sides-10"
+                           ng-click="ctrl.generatePrintReport(printReport, $parent.ctrl.selectedTabIndex)">
+                            <span class="glyphicon glyphicon-download-alt margin-sides-5"></span>
+                            {{printReport.name}}
+                            <span ng-class="printReport.multiobject ? 'icon-file-o' : 'icon-files-o'" class="margin-sides-5"></span>
+                        </a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </div>
+
+    <!--tables-->
+    <div id="infocontainer-info-lists">
+
+        <div id="infocontainer-{{this['$index']}}"
+             class="fade absolute infocontainer-table"
+             ng-repeat="tab in ctrl.infos"
+             ng-init="tab.index = this['$index']"
+             ng-class="{'active in': ctrl.selectedTabIndex === this['$index']}">
+
+            {{tab.content}}
+
+            <table id="infocontainer-table-{{this['$index']}}"
+                   class="font-10 white infocontainer-table-content"></table>
+        </div>
+    </div>
+</div>
diff --git a/module/template/tools/insert.html b/module/template/tools/insert.html
new file mode 100644
index 0000000000000000000000000000000000000000..8011c69fe13be35cb5aa0684448a4108da9abb2b
--- /dev/null
+++ b/module/template/tools/insert.html
@@ -0,0 +1,284 @@
+<div class="basic-tools-insert-container basic-tools-dropdown-menu form-group-xxs">
+
+    <div id="vmap-insert-tool"></div>
+
+    <!--selecteur d'objet métier-->
+    <div class="padding-sides-10 margin-10" ng-show="vmapScope.sizeOf(aInsertableBOs) > 0">
+        <div id="select-insert-layer-dropdown-button-group" class="btn-group width-100">
+            <label class="control-label text-center">Créer un objet</label>
+            <select id="{{:refresh:field.id}}"
+                    class="form-control"
+                    ng-model="selectedBoId">
+                <option value=""></option>
+                <option ng-repeat="bo in aInsertableBOs" ng-value="bo.bo_id">{{::bo['bo_title']}}</option>
+            </select>
+        </div>
+    </div>
+    <div ng-show="!vmapScope.sizeOf(aInsertableBOs) > 0">
+        <label class="margin-10 margin-sides-10">
+            Aucun objet métier ou pas de droits en insertion
+        </label>
+    </div>
+
+    <div ng-show="selectedBoId">
+        <!--Boutons de dessin-->
+        <div ng-show="oInsertObject.sGeomColumn !== null">
+            <div class="hr-gray margin-10"></div>
+
+            <div class="btn-group btn-block" style="text-align: center; padding: 0px 8px;">
+                <button type="button"
+                        class="btn btn-sm btn-info"
+                        style="width: 80%"
+                        ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-insert-insertPoint' || ctrl.currentAction === 'basicTools-insert-insertLineString' || ctrl.currentAction === 'basicTools-insert-insertPolygon' || ctrl.currentAction === 'basicTools-insert-insertCircle'}"
+                        ng-click="ctrl.addPartGeomType !== '' ? ctrl.startInsertion('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-insert-insert' + ctrl.addPartGeomType) : angular.noop">
+                    Ajouter une partie
+                </button>
+                <button type="button"
+                        class="btn btn-sm btn-default dropdown-toggle"
+                        style="width: 20%"
+                        data-toggle="dropdown"
+                        aria-haspopup="true"
+                        aria-expanded="false">
+                    <span class="caret" ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' && ctrl.addPartGeomType === ''"></span>
+                    <span class="icon-point" ng-show="ctrl.addPartGeomType === 'Point'"></span>
+                    <span class="icon-line" ng-show="ctrl.addPartGeomType === 'LineString'"></span>
+                    <span class="icon-polygon" ng-show="ctrl.addPartGeomType === 'Polygon'"></span>
+                    <span class="icon-circle" ng-show="ctrl.addPartGeomType === 'Circle'"></span>
+                </button>
+                <ul class="dropdown-menu">
+                    <li><a href="javascript:void(0)"
+                           ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POINT' || oInsertObject.sGeomType === 'MULTIPOINT'"
+                           ng-click="ctrl.addPartGeomType = 'Point'; ctrl.startInsertion('insertPoint', false)">
+                            <span class="icon-point"></span> Point
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'LINESTRING' || oInsertObject.sGeomType === 'MULTILINESTRING'"
+                           ng-click="ctrl.addPartGeomType = 'LineString'; ctrl.startInsertion('insertLineString', false)">
+                            <span class="icon-line"></span> Ligne
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POLYGON' || oInsertObject.sGeomType === 'MULTIPOLYGON'"
+                           ng-click="ctrl.addPartGeomType = 'Polygon'; ctrl.startInsertion('insertPolygon', false)">
+                            <span class="icon-polygon"></span> Polygone
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POLYGON' || oInsertObject.sGeomType === 'MULTIPOLYGON'"
+                           ng-click="ctrl.addPartGeomType = 'Circle'; ctrl.startInsertion('insertCircle', false)">
+                            <span class="icon-circle"></span> Cercle
+                        </a></li>
+                </ul>
+            </div>
+
+            <div class="hr-gray margin-10"
+                 ng-show="(featuresLength > 0) || (oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POLYGON' || oInsertObject.sGeomType === 'MULTIPOLYGON')"></div>
+
+            <ul class="list-menu gray-list-menu">
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-insert-editFeature'}"
+                       ng-click="ctrl.startInsertion('editFeature', ctrl.currentAction === 'basicTools-insert-editFeature')"
+                       ng-show="featuresLength > 0">
+                        <span class="icon-edit"></span>
+                        <span class="margin-sides-10">Modifier la géométrie</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-insert-deleteFeature'}"
+                       ng-click="ctrl.startInsertion('deleteFeature', ctrl.currentAction === 'basicTools-insert-deleteFeature')"
+                       ng-show="featuresLength > 0">
+                        <span class="icon-trash"></span>
+                        <span class="margin-sides-10">Supprimer une partie</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-show="(oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POLYGON' || oInsertObject.sGeomType === 'MULTIPOLYGON') && featuresLength > 0"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-insert-addHole'}"
+                       ng-click="ctrl.startInsertion('addHole', ctrl.currentAction === 'basicTools-insert-addHole')">
+                        <span class="icon-dot-circle-o"></span>
+                        <span class="margin-sides-10">Ajouter trou</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-show="(oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POLYGON' || oInsertObject.sGeomType === 'MULTIPOLYGON') && featuresLength > 0"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-insert-deleteHole'}"
+                       ng-click="ctrl.startInsertion('deleteHole', ctrl.currentAction === 'basicTools-insert-deleteHole')">
+                        <span class="icon-dot-circle-o"></span>
+                        <span class="margin-sides-10">Supprimer trou</span>
+                    </a>
+                </li>
+            </ul>
+        </div>
+        <div class="hr-gray margin-10"></div>
+        <!--Édition des attributs-->
+        <ul class="list-menu gray-list-menu">
+            <li class="basic-tools-dropdown-btn">
+                <a class="btn-draw"
+                   ng-click="ctrl.displayEditFrom()">
+                    <span class="icon-format_list_bulleted"></span>
+                    <span class="margin-sides-10">Éditer les attributs</span>
+                </a>
+            </li>
+        </ul>
+        <div class="hr-gray margin-10"></div>
+        <!--Snapping-->
+        <div>
+            <div class="basic-tools-dropdown-btn vmap-insert-snapping-collapse-button "
+                 ng-click="ctrl.isSnapMenuCollapse = !ctrl.isSnapMenuCollapse">
+                <span class ="glyphicon glyphicon-magnet" ></span>
+                <span class="margin-sides-10"> Accrochage vectoriel </span>
+                <span class="glyphicon"
+                      ng-class="{'glyphicon-menu-down': ctrl.isSnapMenuCollapse, 'glyphicon-menu-right': !ctrl.isSnapMenuCollapse }"></span>
+            </div>
+            <div class="collapse"
+                 ng-class="{'in': ctrl.isSnapMenuCollapse}">
+                <div style="margin: 0px 32px; min-height: 26px;">
+                    <div ng-repeat="oBo in aQueryableBOs">
+                        <div class="row">
+                            <div class="left">
+                                <!-- Checkbox visible -->
+                                <div class="checkbox checkbox-info margin-3">
+                                    <input id="vmap-insert-snapping-menu-checkbox-{{$index}}"
+                                           type="checkbox"
+                                           style="cursor:pointer"
+                                           ng-model="oBo.bo_snapping_enabled"
+                                           ng-click="ctrl.loadVectorSnappingData()">
+                                    <label for="vmap-insert-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="Definit si l'objet métier est accrochable">
+                                        {{oBo.bo_title}}
+                                    </label>
+                                </div>
+                            </div>
+                            <div class="right">
+                                <div ng-show="(oBo.bo_snapping_enabled)">
+                                    <span ng-class="{'fa fa-2x fa-spinner fa-spin': !oBo.isMouseOverSnaoMenuOb, 'fa fa-2x fa-close color-red': oBo.isMouseOverSnaoMenuOb }"
+                                          ng-mouseover="(oBo.isMouseOverSnaoMenuOb = true)"
+                                          ng-mouseleave="(oBo.isMouseOverSnaoMenuOb = false)"
+                                          ng-click="ctrl.stopLoadingBoVectorSnappingData(oBo); oBo.bo_snapping_enabled = false"
+                                          ng-show="(oBo.bo_snapping_loaded == false)"></span>
+                                    <span class="fa fa-2x fa-check color-green"
+                                          ng-show="(oBo.bo_snapping_loaded == true)"></span>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="basic-tools-dropdown-btn" style="margin: 0px 23px; min-height: 26px;">
+                    <div class="row">
+                        <button type="button"
+                                class="btn btn-info btn-xs width-100"
+                                ng-click="ctrl.showSnappingOptionsModal()">
+                            <span class="fa fa-cog margin-sides-2"></span>
+                            Options d'accrochage
+                        </button>
+                    </div>
+                </div>
+                <div class="hr-gray margin-10" ng-class="{'in': ctrl.isSnapMenuCollapse}"></div>
+            </div>
+        </div>
+        <!--Messages d'alerte pour l'échelle d'édition-->
+        <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMaxScaleOk">
+            <span class="glyphicon glyphicon-warning-sign"></span> Échelle maximale de saisie atteinte
+        </div>
+        <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMinScaleOk">
+            <span class="glyphicon glyphicon-warning-sign"></span> Échelle minimale de saisie atteinte
+        </div>
+        <!--Boutons-->
+        <div style="text-align: center; padding: 0px 8px;">
+            <button type="button"
+                    class="btn btn-info btn-sm btn-block"
+                    ng-click="ctrl.submitInsertion()">
+                <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
+                Sauvegarder
+            </button>
+        </div>
+    </div>
+</div>
+
+<!--Modale formulaire-->
+<div class="modal fade" id="basictools-insert-form-reader-modal" role="dialog">
+    <div class="modal-dialog"
+         ng-class="{'modal-60':oInsertObject.add_form_size == 2, 'modal-90':oInsertObject.add_form_size == 3}">
+        <!--Modal content-->
+        <div class="modal-content" style="">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">×</button>
+                <h4 class="modal-title">Attributs</h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3 font-12 width-100">
+
+                <!--Form reader-->
+                <div id="basictools-insert-form-reader"
+                     app-form-reader
+                     app-form-definition-name="oInsertObject.sFormDefinitionName"
+                     app-form-definition="oInsertObject.oFormDefinition"
+                     app-form-values="oInsertObject.oFormValues"
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+
+            </div>
+            <div class="modal-footer modal-footer-sm text-left">
+                <button class="btn btn-info"
+                        ng-click="ctrl.validateForm()">
+                    Modifier la géométrie
+                </button>
+                <button type="submit" class="btn btn-primary" form="basictools-insert-form-reader-form"
+                        ng-click="ctrl.trySubmitInsertion()">
+                    <span class="glyphicon glyphicon-share-alt margin-2"></span>
+                    Sauvegarder
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--Snapping parameters modal-->
+<div class="modal fade" id="vmap-insert-snap-options-modal" role="dialog">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">×</button>
+                <h4 class="modal-title" data-translate="TITLE_SNAPPING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3 font-12">
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <select class="form-control"
+                            ng-model="ctrl.tmpSnapOptions.mode">
+                        <option value="segment_edge_node" data-translate="FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                        <option value="edge_node" data-translate="FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                        <option value="node" data-translate="FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                    </select>
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <input type="number" class="form-control" ng-model="ctrl.tmpSnapOptions.tolerance">
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_LIMIT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <input type="number" class="form-control" ng-model="ctrl.tmpSnapOptions.limit">
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <div class="radio radio-inline">
+                        <input type="radio" name="vmap_insert_snap_visible" id="vmap_insert_snap_visible_1" ng-model="ctrl.tmpSnapOptions.visible" ng-value="true">
+                        <label for="vmap_insert_snap_visible_1">Oui</label>
+                    </div>
+                    <div class="radio radio-inline">
+                        <input type="radio" name="vmap_insert_snap_visible" id="vmap_insert_snap_visible_2" ng-model="ctrl.tmpSnapOptions.visible" ng-value="false">
+                        <label for="vmap_insert_snap_visible_2">Non</label>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer modal-footer-sm text-left">
+                <button class="btn btn-primary" ng-click="ctrl.resetSnapOptions()">
+                    Rétablir les paramètres par défaut
+                </button>
+                <button class="btn btn-primary" ng-click="ctrl.submitSnappingOptionsModal()">
+                    Valider
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/tools/insert_mobile.html b/module/template/tools/insert_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..768c5b0f7aba4cee60b8cf12d7350ca33cfa9f12
--- /dev/null
+++ b/module/template/tools/insert_mobile.html
@@ -0,0 +1,38 @@
+
+<div id="vmap-insert-tool"></div>
+
+<a ng-repeat="bo in aInsertableBOs" class="list-group-item sublist-group-item" ng-click="ctrl.mobileStartInsertion(bo.bo_id)"><span class="icon-info insert_menu_logo"></span> {{::bo['bo_title']}}</a>
+
+<div class="modal fade" id="basictools-insert-form-reader-modal" role="dialog">
+    <div class="modal-dialog">
+        <!--Modal content-->
+        <div class="modal-content" style="">
+            <div class="modal-header">
+                <!-- Bouton retour -->
+                <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal" onclick="oVmap.getToolsManager().getBasicTools().toggleOutTools()">
+                    <span class="icon-caret-left"></span> Retour
+                </div>
+                <h4 class="modal-title">Attributs</h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3 font-12 width-100">
+
+                <!--Form reader-->
+                <div id="basictools-insert-form-reader"
+                     app-form-reader 
+                     app-form-definition-name="oInsertObject.sFormDefinitionName" 
+                     app-form-definition="oInsertObject.oFormDefinition"
+                     app-form-values="oInsertObject.oFormValues" 
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+
+            </div>
+            <div class="modal-footer modal-footer-sm text-left">
+                <button type="submit" class="btn btn-primary" form="basictools-insert-form-reader-form"
+                        ng-click="ctrl.trySubmitInsertion()">
+                    <span class="glyphicon glyphicon-share-alt margin-2"></span>
+                    Sauvegarder
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
new file mode 100644
index 0000000000000000000000000000000000000000..a9f3e9bca3288fb5fc5a32a7d83eb4dec5ce8667
--- /dev/null
+++ b/module/template/tools/location.html
@@ -0,0 +1,212 @@
+<!--location search-->
+<li id="location-search-tool" role="presentation">
+    <form ng-submit="ctrl.searchLocation()" id="location-search-form" class="margin-sides-5 from-control">
+        <!--Recherche-->
+        <input id="location-search-input"
+               type="text" 
+               placeholder="Localiser.."
+               ng-model="ctrl.locationSearch"
+               ng-click="ctrl.searchLocation()">
+        <!--Sélecteur-->
+        <select id="location-search-api-select"
+                ng-model="ctrl.sSelectedLocationService"
+                ng-change="ctrl.searchLocation()">            
+            <!--Géocodeurs-->
+            <option ng-repeat="(key, value) in ctrl.locationServices"
+                    value="{{key}}">{{value.title}}</option>
+            <!--Objets métier-->
+            <option ng-repeat="node in ctrl.oBusinessObjects | orderObjectBy:'bo_title'"
+                    ng-if="node.bo_search_field && node.bo_result_field"
+                    value="{{node.bo_id}}">{{node.bo_title}}</option>
+        </select>
+    </form>
+
+    <div class="dropdown-menu basic-tools-dropdown-element">
+
+        <!--Bandeau du haut-->
+        <div style="margin: 10px">
+            <label>Résultats de la recherche: </label>
+            <span class="glyphicon glyphicon-remove right pointer margin-sides-10" 
+                  ng-click="ctrl.removeLocation()"></span>
+        </div>
+
+        <!--Infos sur le chargement-->
+        <div style="text-align: center" class="margin-10">
+            <img class="hidden" src="images/ajax-load-big.gif" height="42" width="42" ng-class="{'block': ctrl.searching === true}">
+            <span ng-class="{'hidden': ctrl.noResults === ''}">{{ctrl.noResults}}</span>
+        </div>
+
+        <!-- Objet métier -->
+        <div ng-if="locationServiceType === 'business_object'" class="location-search-dropdown-content">
+            <div class="location-search-dropdown-result"
+                 ng-repeat="node in ctrl.locationResults">
+
+                <div class="pointer opacity-hover"
+                     ng-click="ctrl.addToSelection(node, ctrl.oBusinessObjects[ctrl.sSelectedLocationService])">
+                    <span ng-bind-html="node['bo_summary'][ctrl.oBusinessObjects[ctrl.sSelectedLocationService].bo_result_field]"></span>
+                </div>
+
+                <div class="location-search-dropdown-result-buttons pointer collapsed" data-toggle="collapse" href="#location-custom-search-dropdown-result-infos-{{this['$index']}}">
+                    <a>Détails</a>
+                    <i class="caret right" style="margin: 9px 0px 0px 6px;"></i>
+                </div>
+
+                <div class="collapse" id="location-custom-search-dropdown-result-infos-{{this['$index']}}">
+                    <div style="padding-bottom: 10px">
+                        <ul>
+                            <li ng-repeat="key in node['bo_summary_attributs']"
+                                ng-bind-html="key + ': '+node['bo_summary'][key]">
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Géocodeur -->
+        <div ng-if="locationServiceType === 'geocoder'" class="location-search-dropdown-content">
+            <div class="location-search-dropdown-result" 
+                 ng-repeat="node in ctrl.locationResults">
+                <div class="pointer opacity-hover"
+                     ng-click="ctrl.locatePlace(node)">
+                    <span>{{node.title}}</span>
+                </div>					
+
+                <div class="location-search-dropdown-result-buttons pointer collapsed" data-toggle="collapse" href="#location-search-dropdown-result-infos-{{this['$index']}}">
+                    <a>Détails</a>
+                    <i class="caret right" style="margin: 9px 0px 0px 6px;"></i>
+                </div>
+
+                <div class="collapse" id="location-search-dropdown-result-infos-{{this['$index']}}">
+                    <div style="padding-bottom: 10px" ng-if="node.summary">	
+                        <ul>
+                            <li ng-repeat="oSummaryElement in node.summary">{{oSummaryElement.label}}: {{oSummaryElement.value}}</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!--Bandeau du bas-->
+        <div style="text-align: center; margin: 10px;">
+            <button type="button" class="btn btn-sm btn-primary" ng-click="ctrl.searchLocation(ctrl.locationSearch, 12)">
+                Plus de résultats
+            </button>			
+        </div>
+    </div>
+</li>
+
+<!--Go home-->
+<li role="presentation">
+    <a id="original-position-tool"
+       class="basic-tools-element pointer" title="Centrer la carte sur l’emprise par défaut"
+       ng-click="ctrl.goHome()">
+        <span class="glyphicon glyphicon-home" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Refresh map-->
+<li role="presentation">
+    <a id="original-position-tool"
+       class="basic-tools-element pointer" title="Rafraichir les couches de la carte"
+       ng-click="ctrl.refreshMap()">
+        <span class="icon-repeat" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Max extent-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Centrer la carte à l’étendue maximale"
+       ng-click="ctrl.maxExtent()">
+        <span class="icon-language" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Geolocate me-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Centrer la carte sur ma position"
+       ng-click="ctrl.geolocateMe()">
+        <span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Go to-->
+<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+
+    <a class="basic-tools-element pointer"
+       title="Centrer la carte sur une position donnée"
+       onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+        <span class="icon-coordinates" aria-hidden="true" style="font-size: 19px;line-height: 0.7 !important;"></span>
+    </a>
+
+    <div class="dropdown-menu basic-tools-dropdown-element" style="margin: -11px -1px">
+        <div class="row margin-sides-0 margin-10">
+            <div class="col-md-5">
+                <div class="input-group-sm">
+                    <input type="number" class="form-control" placeholder="X" ng-model="goToX">
+                </div>
+                <div class="input-group-sm">
+                    <input type="number" class="form-control" placeholder="Y" ng-model="goToY">
+                </div>
+            </div>			
+            <div class="col-md-5">
+                <b>Projection:</b>
+                <select class="form-control" ng-model="goToProj">
+                    <option value="EPSG:4326">{{ctrl.projections['EPSG:4326']}}</option>
+                    <option value="EPSG:3857">{{ctrl.projections['EPSG:3857']}}</option>
+                    <option value="EPSG:2154">{{ctrl.projections['EPSG:2154']}}</option>
+                </select>
+            </div>
+            <div class="col-md-2">
+                <br>
+                <button type="button" class="btn btn-success btn-sm"
+                        ng-click="ctrl.goTo(goToX, goToY, goToProj)">
+                    Go
+                </button>
+            </div>
+        </div>
+    </div>
+</li>
+
+<!--Previous history-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Aller à l'étendue précédente"
+       ng-click="ctrl.previousHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset >= ctrl.aLocationHistory.length - 1}">
+        <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Next history-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Aller à l'étendue suivante"
+       ng-click="ctrl.nextHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset === 0}">
+        <span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!-- Modal -->
+<div id="scale-modal" class="modal fade" role="dialog">
+    <div class="modal-dialog">
+
+        <!-- Modal content-->
+        <div class="modal-content">
+            <form ng-submit="ctrl.addScale()">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">&times;</button>
+                    <h4 class="modal-title">Nouvelle échelle</h4>
+                </div>
+                <div class="modal-body">
+                    <i>Saisissez une nouvelle échelle puis cliquez sur "ajouter"</i>
+                    <div class="input-group">
+                        <span class="input-group-addon" id="new-scale-describer">1:</span>
+                        <input type="number" class="form-control" id="new-scale-input" aria-describedby="new-scale-describer" required>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="submit" class="btn btn-primary">Ajouter</button>
+                </div>
+            </form>
+        </div>
+
+    </div>
+</div>
diff --git a/module/template/tools/location_mobile.html b/module/template/tools/location_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..1151791517505cb1102c080a84140027f66e6c73
--- /dev/null
+++ b/module/template/tools/location_mobile.html
@@ -0,0 +1,96 @@
+<!--location search-->
+<div id="location-search-tool" class="height-100 overflow_y">
+    <!--Formulaire-->
+    <form ng-submit="ctrl.searchLocation()" id="location-search-form">
+        <div class="col-xs-6">
+            <input id="location-search-input" class="form-control input-sm right margin-sides-10 margin-5" type="text" placeholder="Rechercher.." ng-model="ctrl.locationSearch" ng-click="ctrl.searchLocation()">
+        </div>
+        <div class="col-xs-6">
+            <select id="location-search-api-select"
+                    class="form-control minus left margin-5 margin-sides-10"
+                    ng-if="sizeOf(ctrl.oBusinessObjects) > 0"
+                    ng-model="ctrl.sSelectedLocationService"
+                    ng-change="ctrl.searchLocation()">            
+                <!--Géocodeurs-->
+                <option ng-repeat="(key, value) in ctrl.locationServices"
+                        value="{{key}}">{{value.title}}</option>
+                <!--Objets métier-->
+                <option ng-repeat="(key, value) in ctrl.oBusinessObjects"
+                        ng-if="value.bo_search_field && value.bo_result_field"
+                        value="{{key}}">{{value.bo_title}}</option>
+            </select>
+        </div>
+    </form>
+    <!--GIF chargement-->
+    <div style="text-align: center" class="margin-10">
+        <img class="hidden" src="images/ajax-load-big.gif" height="42" width="42" ng-class="{'block': ctrl.searching === true}">
+        <span ng-class="{'hidden': ctrl.noResults === ''}">{{ctrl.noResults}}</span>
+    </div>
+    <!--Résultats-->
+    <div id="vmap_menu_location_results">
+        <div class="panel list-group">
+            <!--Objet métier--> 
+            <div ng-if="locationServiceType === 'business_object'" ng-repeat="node in ctrl.locationResults">
+                <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_location_results_{{$index}}" data-parent="#vmap_menu_location_results" onclick="$('#vmap_menu_location_results .in').collapse('hide');">
+                    <span ng-bind-html="node['bo_summary'][ctrl.oBusinessObjects[ctrl.sSelectedLocationService].bo_result_field]"></span>
+                </a>
+                <div id="vmap_menu_location_results_{{$index}}" class="sublinks collapse">
+                    <div style="padding-bottom: 10px">
+                        <ul style="margin: 10px 0px 40px 0px;">
+                            <li ng-repeat="key in node['bo_summary_attributs']"
+                                ng-bind-html="key + ': '+node['bo_summary'][key]">
+                            </li>
+                            <div style="margin: 10px;">
+                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.addToSelection(node, ctrl.oBusinessObjects[ctrl.sSelectedLocationService])">Voir sur la carte</button>
+                            </div>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+            <!--Géocodeur--> 
+            <div ng-if="locationServiceType === 'geocoder'" ng-repeat="node in ctrl.locationResults">
+                <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_location_results_{{$index}}" data-parent="#vmap_menu_location_results" onclick="$('#vmap_menu_location_results .in').collapse('hide');">
+                    {{node.title}}
+                </a>
+                <div id="vmap_menu_location_results_{{$index}}" class="sublinks collapse">
+                    <div style="padding-bottom: 10px">
+                        <ul style="margin: 10px 0px 40px 0px;">
+                            <li ng-repeat="oSummaryElement in node.summary">{{oSummaryElement.label}}: {{oSummaryElement.value}}</li>
+                            <div style="margin: 10px;">
+                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.locatePlace(node)">Voir sur la carte</button>
+                            </div>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<!-- Modal -->
+<div id="scale-modal" class="modal fade" role="dialog">
+    <div class="modal-dialog">
+
+        <!-- Modal content-->
+        <div class="modal-content">
+            <form ng-submit="ctrl.addScale()">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">&times;</button>
+                    <h4 class="modal-title">Nouvelle échelle</h4>
+                </div>
+                <div class="modal-body">
+                    <i>Saisissez une nouvelle échelle puis cliquez sur "ajouter"</i>
+                    <div class="input-group">
+                        <span class="input-group-addon" id="new-scale-describer">1:</span>
+                        <input type="number" class="form-control" id="new-scale-input" aria-describedby="new-scale-describer" required>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="submit" class="btn btn-primary">Ajouter</button>
+                </div>
+            </form>
+        </div>
+
+    </div>
+</div>
diff --git a/module/template/tools/measure.html b/module/template/tools/measure.html
new file mode 100755
index 0000000000000000000000000000000000000000..4bde3781695ed8ea7df4feff4ca5a7c5b760b1df
--- /dev/null
+++ b/module/template/tools/measure.html
@@ -0,0 +1,171 @@
+
+
+<div style="display: none">
+    <input id="geodesic" type="checkbox" style="cursor:pointer" checked>use geodesic measures
+</div>
+<div style="display: none" class="checkbox checkbox-success">
+    <input id="measure-anotations" type="checkbox" style="cursor:pointer" ng-click="ctrl.showHideAnotations()" checked>
+    <label for="measure-anotations" style="cursor:pointer">Afficher / Cacher les annotations</label>
+</div>
+
+<i class="basic-tools-dropdown-title">Mesure</i>
+
+<ul class="basic-tools-dropdown-menu">
+    <li role="separator" class="divider"></li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-point-button"
+           class="btn-measure"
+           ng-class="{
+                   'active'
+                   : ctrl.currentAction === 'basicTools-measurePoint'}"
+           ng-click="ctrl.drawPoint(ctrl.currentAction === 'basicTools-measurePoint')">
+            <span class="icon-point"></span>
+            <span class="margin-sides-10">Point</span>
+        </a>
+    </li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-line-button"
+           class="btn-measure"
+           ng-class="{
+                   'active': ctrl.currentAction === 'basicTools-measureLineString'}"
+           ng-click="ctrl.measureLine(ctrl.currentAction === 'basicTools-measureLineString')">
+            <span class="icon-line"></span>
+            <span class="margin-sides-10">Ligne</span>
+        </a>
+    </li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-polygon-button"
+           class="btn-measure"
+           ng-class="{
+                   'active': ctrl.currentAction === 'basicTools-measurePolygon'}"
+           ng-click="ctrl.measurePolygon(ctrl.currentAction === 'basicTools-measurePolygon')">
+            <span class="icon-polygon"></span>
+            <span class="margin-sides-10">Polygone</span>
+        </a>
+    </li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-circle-button"
+           class="btn-measure"
+           ng-class="{
+                   'active'
+                   : ctrl.currentAction === 'basicTools-measureCircle'}"
+           ng-click="ctrl.measureCircle(ctrl.currentAction === 'basicTools-measureCircle')">
+            <span class="icon-circle"></span>
+            <span class="margin-sides-10">Cercle</span>
+        </a>
+    </li>
+
+    <li role="separator" class="divider"></li>
+
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-modify-button"
+           class="btn-measure"
+           ng-class="{
+                   'active'
+                   : ctrl.currentAction === 'basicTools-modifyMeasure'}"
+           ng-click="ctrl.modifyFeature(ctrl.currentAction === 'basicTools-modifyMeasure')">
+            <span class="glyphicon glyphicon-pencil"></span>
+            <span class="margin-sides-10">Editer</span>
+        </a>
+    </li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-dell-button"
+           class="btn-measure"
+           ng-class="{
+                   'active': ctrl.currentAction === 'basicTools-deleteMeasure'}"
+           ng-click="ctrl.deleteFeature(ctrl.currentAction === 'basicTools-deleteMeasure')">
+            <span class="glyphicon glyphicon-remove"></span>
+            <span class="margin-sides-10">Supprimer</span>
+        </a>
+    </li>
+    <li class="basic-tools-dropdown-btn">
+        <a id="measure-deleteAllFeatures-btn" class="btn-measure" ng-click="ctrl.deleteAllFeatures()">
+            <span class="glyphicon glyphicon-trash"></span>
+            <span class="margin-sides-10">Vider</span>
+        </a>
+    </li>
+
+    <li role="separator" class="divider"></li>
+    <li class="basic-tools-dropdown-btn"><a id="measure-display-features-button"
+                                            data-toggle="modal"
+                                            data-target="#measureAndDrawModal"
+                                            ng-click="ctrl.displayFeatures()">
+            Afficher les mesures
+        </a></li>
+</ul>
+
+
+<!--Modal-->
+<div class="modal fade" id="measureAndDrawModal" role="dialog">
+    <div class="modal-dialog modal-lg">
+        <!--Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button id="modal-display-measure-close" type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">Mesures</h4>
+            </div>
+            <div class="modal-body modal-body-big" style="height:82%">
+                <div ng-if="ctrl.sketches.length === 0">
+                    <b>Aucune mesure à afficher</b>
+                </div>
+                <div ng-repeat="feature in ctrl.sketches">
+
+                    <div ng-if="feature.get('Type') === 'Cercle'">
+                        <div class="font-15" class="font-14">
+                            <div><b class="font-15">Type: </b>{{feature.get('Type')}}</div>
+                            <div><b class="font-15">Rayon: </b>{{feature.get('Rayon')}}</div>
+                            <div><b class="font-15">Projection des coordonnées </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
+                        </div>
+                        <table class="table table-striped bordered margin-10 font-14">
+                            <thead>
+                                <tr class="info">
+                                    <th ng-repeat="key in feature.get('Keys')" ng-if="key !== 'geometry' && key !== 'Type' && key !== 'Rayon' && key !== 'Id' && key !== 'Coordonnées' && key !== 'Projection' && key !== 'Keys'">{{key}}</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td ng-repeat="key in feature.get('Keys')" ng-if="key !== 'geometry' && key !== 'Type' && key !== 'Rayon' && key !== 'Id' && key !== 'Coordonnées' && key !== 'Projection' && key !== 'Keys'">{{feature.get(key)}}</td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+
+                    <div ng-if="feature.get('Type') !== 'Cercle'">
+                        <div class="font-15" ng-repeat="key in feature.get('Keys')" ng-if="key !== 'Coordonnées' && key !== 'Projection' && key !== 'geometry' && key !== 'Id' && key !== 'Keys'">
+                            <b class="font-15">{{key}}: </b>{{feature.get(key)}}
+                        </div>
+                        <div class="font-15" ng-repeat="key in feature.get('Keys')" ng-if="key === 'Coordonnées'">
+                            <b class="font-15">{{key}}: </b>{{ctrl.transform(feature.get('Coordonnées'), ctrl.projection, feature.get('Projection'))}}
+                        </div>
+                        <div><b class="font-15">Projection des coordonnées: </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
+                    </div>
+
+                    <table class="table table-striped bordered margin-10 font-14" ng-if="feature.get('Type') !== 'Point' || feature.get('Type') !== 'Cercle'">
+                        <thead>
+                            <tr class="info">
+                                <th ng-repeat="key in feature.Points.keys">
+                                    {{key}}
+                                </th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr ng-repeat="point in feature.Points">
+                                <td ng-repeat="key in feature.Points.keys">
+                                    {{point[key]}}
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                    <button type="button" class="btn btn-primary right margin-sides-5" data-dismiss="modal" ng-click="ctrl.zoomToFeature(feature)">Voir sur la carte</button>
+                    <br>
+                    <br>
+                </div>
+                <!--end ng-repeat-->
+            </div>
+            <!--/.modal-body modal-body-big-->
+            <div class="modal-footer" ng-if="ctrl.sketches.length !== 0">
+                <a id="export-csv-button" class="btn btn-primary" download='Mesures.csv' href="" >Exporter tout en CSV</a>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/tools/measure_mobile.html b/module/template/tools/measure_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..b69fba213951917ea1b0ebbcb0939f3627d00699
--- /dev/null
+++ b/module/template/tools/measure_mobile.html
@@ -0,0 +1,14 @@
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePoint()"><span class="icon-point mobile_menu_logo"></span> Point</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureLine()"><span class="icon-line mobile_menu_logo"></span> Ligne</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePolygon()"><span class="icon-polygon mobile_menu_logo"></span> Polygone</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureCircle()"><span class="icon-circle mobile_menu_logo"></span> Cercle</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileDeleteAllFeatures()"><span class="icon-trash mobile_menu_logo"></span> Vider</a>
+
+<div style="display: none">
+    <input id="geodesic" type="checkbox" style="cursor:pointer" checked>use geodesic measures
+</div>
+<div style="display: none" class="checkbox checkbox-success">
+    <input id="measure-anotations" type="checkbox" style="cursor:pointer" ng-click="ctrl.showHideAnotations()" checked>
+    <label for="measure-anotations" style="cursor:pointer">Afficher / Cacher les annotations</label>
+</div>
+
diff --git a/module/template/tools/print.html b/module/template/tools/print.html
new file mode 100644
index 0000000000000000000000000000000000000000..0a1fd62b4dcf92147ce7b543f37d661637c5f70c
--- /dev/null
+++ b/module/template/tools/print.html
@@ -0,0 +1,65 @@
+
+<div style="text-align: left">
+
+    <div class="print-form-label" ng-show="!ctrl.models.length > 0">
+        Aucun modèle d'impression associé
+    </div>
+
+    <form role="form" ng-submit="ctrl.prepareAndLaunchPrint()" ng-show="ctrl.models.length > 0">
+        <div class="print-form-label">Modèle</div>
+        <select id="select-print-format" class="form-control minus"
+                ng-model="modelIndex"
+                ng-options="index as model.name for (index, model) in ctrl.models"
+                ng-change="ctrl.loadModelParmas(modelIndex)"></select>
+
+        <div class="print-form-label" ng-if="ctrl.printStyles.length > 0">Style</div>
+        <select id="select-print-format" class="form-control minus"
+                ng-if="ctrl.printStyles.length > 0"
+                ng-model="$parent.selectedPrintstyleId"
+                ng-options="printStyle.printstyle_id as printStyle.name for printStyle in ctrl.printStyles | orderBy : 'name'">
+            <option value=""></option>
+        </select>
+
+        <div ng-repeat="variable in ctrl.selectedModel.variables" ng-if="variable.editable === true">
+            <div class="print-form-label">{{variable.label}}</div>
+            <input class="minus" style="width: 100%; border: 0px;" type="text" placeholder="{{variable.description}}" ng-model="variable.value">
+            <br>
+        </div>
+
+        <div class="print-form-label">Echelle</div>
+        <select id="select-print-scale" class="form-control minus" ng-model="ctrl.scale" ng-change="ctrl.changeScale(ctrl.scale)">
+            <option value="auto">{{ctrl.currentScale}}</option>
+            <option value="1000000">1:1,000,000</option>
+            <option value="500000">1:500,000</option>
+            <option value="200000">1:200,000</option>
+            <option value="100000">1:100,000</option>
+            <option value="50000">1:50,000</option>
+            <option value="25000">1:25,000</option>
+            <option value="10000">1:10,000</option>
+            <option value="5000">1:5,000</option>
+            <option value="2500">1:2,500</option>
+            <option value="2000">1:2,000</option>
+            <option value="1000">1:1,000</option>
+            <option value="500">1:500</option>
+            <option value="200">1:200</option>
+            <option value="100">1:100</option>
+        </select>
+
+        <div class="print-form-label">Résolution</div>
+        <select id="select-print-resolution" class="form-control minus" ng-model="ctrl.dpi">
+            <option value="1">72 dpi</option>
+            <option value="2" ng-show="ctrl.resolution <= 4">144 dpi</option>
+            <option value="4" ng-show="ctrl.resolution <= 2">288 dpi</option>
+        </select>
+
+        <button type="button"
+                class="btn btn-info btn-sm"
+                style="margin-top: 10px"
+                ng-class="{'active': ctrl.currentAction === 'print-modifyPrintZone'}"
+                ng-click="ctrl.managePrintZone()"><span class="glyphicon glyphicon-move"></span></button>
+
+        <button type="submit"
+                class="btn btn-info btn-sm"
+                style="margin-top: 10px">Imprimer</button>
+    </form>
+</div>
diff --git a/module/template/tools/select.html b/module/template/tools/select.html
new file mode 100644
index 0000000000000000000000000000000000000000..420c5b37e81360aa9fd3fcd128e1d46bb3f5e001
--- /dev/null
+++ b/module/template/tools/select.html
@@ -0,0 +1,385 @@
+
+<div id="vmap-select-tool"></div>
+
+<!-- Selection Avancée -->
+<div class="right" ng-if="!$root.is_mobile">
+    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+        <a class="basic-tools-element pointer"
+           id="basic-tools-dropdown-select-btn"
+           title="Sélection multiple"
+           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+            <span class="icon-info" aria-hidden="true"></span> +
+        </a>
+        <div app-advancedselect app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction"
+             id="basic-tools-dropdown-select-content"
+             class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-select-content">
+        </div>
+    </li>
+</div>
+
+<!-- Selection Basique -->
+<div app-basicselect app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction" class="right"></div>
+
+<!--Palette d'édition (non visible par défaut)-->
+<div id="basictools-select-modify-palette"
+     class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-select-modifypalette-content">
+    <div class="basic-tools-select-container basic-tools-dropdown-menu">
+        <div>
+            <!--Bouton ajouter une partie-->
+            <div class="btn-group btn-block">
+                <button type="button"
+                        class="btn btn-sm btn-info"
+                        style="width: 80%"
+                        ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-select-insertPoint' || ctrl.currentAction === 'basicTools-select-insertLineString' || ctrl.currentAction === 'basicTools-select-insertPolygon' || ctrl.currentAction === 'basicTools-select-insertCircle'}"
+                        ng-click="ctrl.addPartGeomType !== '' ? ctrl.startEdition('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-select-insert' + ctrl.addPartGeomType) : angular.noop">
+                    Ajouter une partie
+                </button>
+                <button type="button"
+                        class="btn btn-sm btn-default dropdown-toggle"
+                        style="width: 20%"
+                        data-toggle="dropdown"
+                        aria-haspopup="true"
+                        aria-expanded="false">
+                    <span class="caret" ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' && ctrl.addPartGeomType === ''"></span>
+                    <span class="icon-point" ng-show="ctrl.addPartGeomType === 'Point'"></span>
+                    <span class="icon-line" ng-show="ctrl.addPartGeomType === 'LineString'"></span>
+                    <span class="icon-polygon" ng-show="ctrl.addPartGeomType === 'Polygon'"></span>
+                    <span class="icon-circle" ng-show="ctrl.addPartGeomType === 'Circle'"></span>
+                </button>
+                <ul class="dropdown-menu">
+                    <li><a href="javascript:void(0)"
+                           ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POINT' || ctrl.editableFeatureType === 'MULTIPOINT'"
+                           ng-click="ctrl.addPartGeomType = 'Point'; ctrl.startEdition('insertPoint', false)">
+                            <span class="icon-point"></span> Point
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'LINESTRING' || ctrl.editableFeatureType === 'MULTILINESTRING'"
+                           ng-click="ctrl.addPartGeomType = 'LineString'; ctrl.startEdition('insertLineString', false)">
+                            <span class="icon-line"></span> Ligne
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON'"
+                           ng-click="ctrl.addPartGeomType = 'Polygon'; ctrl.startEdition('insertPolygon', false)">
+                            <span class="icon-polygon"></span> Polygone
+                        </a></li>
+                    <li><a href="javascript:void(0)"
+                           ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON'"
+                           ng-click="ctrl.addPartGeomType = 'Circle'; ctrl.startEdition('insertCircle', false)">
+                            <span class="icon-circle"></span> Cercle
+                        </a></li>
+                </ul>
+            </div>
+            <div class="hr-gray margin-10"></div>
+            <!--Modification de géométrie-->
+            <ul class="list-menu gray-list-menu">
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-select-editFeature'}"
+                       ng-click="ctrl.startEdition('editFeature', ctrl.currentAction === 'basicTools-select-editFeature')">
+                        <span class="icon-edit"></span>
+                        <span class="margin-sides-10">Modifier la géométrie</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-select-deleteFeature'}"
+                       ng-click="ctrl.startEdition('deleteFeature', ctrl.currentAction === 'basicTools-select-deleteFeature')">
+                        <span class="icon-trash"></span>
+                        <span class="margin-sides-10">Supprimer une partie</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-show="(ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON')"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-select-addHole'}"
+                       ng-click="ctrl.startEdition('addHole', ctrl.currentAction === 'basicTools-select-addHole')">
+                        <span class="icon-dot-circle-o"></span>
+                        <span class="margin-sides-10">Ajouter un trou</span>
+                    </a>
+                </li>
+                <li class="basic-tools-dropdown-btn">
+                    <a class="btn-draw"
+                       ng-show="(ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON')"
+                       ng-class="{'active': ctrl.currentAction === 'basicTools-select-deleteHole'}"
+                       ng-click="ctrl.startEdition('deleteHole', ctrl.currentAction === 'basicTools-select-deleteHole')">
+                        <span class="icon-dot-circle-o"></span>
+                        <span class="margin-sides-10">Supprimer un trou</span>
+                    </a>
+                </li>
+            </ul>
+            <div class="hr-gray margin-10"></div>
+            <!--Snapping-->
+            <div>
+                <div class="basic-tools-dropdown-btn vmap-select-snapping-collapse-button "
+                     ng-click="ctrl.isSnapMenuCollapse = !ctrl.isSnapMenuCollapse">
+                    <span class ="glyphicon glyphicon-magnet" ></span>
+                    <span class="margin-sides-10"> Accrochage vectoriel </span>
+                    <span class="glyphicon"
+                          ng-class="{'glyphicon-menu-down': ctrl.isSnapMenuCollapse, 'glyphicon-menu-right': !ctrl.isSnapMenuCollapse }"></span>
+                </div>
+                <div class="collapse"
+                     ng-class="{'in': ctrl.isSnapMenuCollapse}">
+                    <div style="margin: 0px 23px; min-height: 26px;">
+                        <div ng-repeat="oBo in ctrl.aQueryableBOs">
+                            <div class="row">
+                                <div class="left">
+                                    <!-- Checkbox visible -->
+                                    <div class="checkbox checkbox-info margin-3">
+                                        <input id="vmap-select-snapping-menu-checkbox-{{$index}}"
+                                               type="checkbox"
+                                               style="cursor:pointer"
+                                               ng-model="oBo.bo_snapping_enabled"
+                                               ng-click="ctrl.loadVectorSnappingData()">
+                                        <label for="vmap-select-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="Definit si l'objet métier est accrochable">
+                                            {{oBo.bo_title}}
+                                        </label>
+                                    </div>
+                                </div>
+                                <div class="right">
+                                    <div ng-show="(oBo.bo_snapping_enabled)">
+                                        <span ng-class="{'fa fa-2x fa-spinner fa-spin': !oBo.isMouseOverSnaoMenuOb, 'fa fa-2x fa-close color-red': oBo.isMouseOverSnaoMenuOb }"
+                                              ng-mouseover="(oBo.isMouseOverSnaoMenuOb = true)"
+                                              ng-mouseleave="(oBo.isMouseOverSnaoMenuOb = false)"
+                                              ng-click="ctrl.stopLoadingBoVectorSnappingData(oBo); oBo.bo_snapping_enabled = false"
+                                              ng-show="(oBo.bo_snapping_loaded == false)"></span>
+                                        <span class="fa fa-2x fa-check color-green"
+                                              ng-show="(oBo.bo_snapping_loaded == true)"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="basic-tools-dropdown-btn" style="margin: 0px 23px; min-height: 26px;">
+                        <div class="row">
+                            <button type="button"
+                                    class="btn btn-info btn-xs width-100"
+                                    ng-click="ctrl.showSnappingOptionsModal()">
+                                <span class="fa fa-cog margin-sides-2"></span>
+                                Options d'accrochage
+                            </button>
+                        </div>
+                    </div>
+                    <div class="hr-gray margin-10" ng-class="{'in': ctrl.isSnapMenuCollapse}"></div>
+                </div>
+            </div>
+            <!--Messages d'alerte pour l'échelle d'édition-->
+            <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMaxScaleOk">
+                <span class="glyphicon glyphicon-warning-sign"></span> Échelle maximale de saisie atteinte
+            </div>
+            <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMinScaleOk">
+                <span class="glyphicon glyphicon-warning-sign"></span> Échelle minimale de saisie atteinte
+            </div>
+            <!--Boutons-->
+            <div style="text-align: center">
+                <button type="button"
+                        class="btn btn-info btn-sm"
+                        ng-click="ctrl.finishEdition()">
+                    <span class="glyphicon glyphicon-remove margin-sides-2"></span>
+                    Annuler
+                </button>
+                <button type="button"
+                        class="btn btn-info btn-sm"
+                        ng-show="ctrl.editGeometryFromForm"
+                        ng-click="ctrl.validateGeomAndDisplayEditForm()">
+                    <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
+                    Valider géométrie
+                </button>
+                <button type="button"
+                        class="btn btn-info btn-sm"
+                        ng-show="!ctrl.editGeometryFromForm"
+                        ng-click="ctrl.submitGeomEdition(); ctrl.finishEdition();">
+                    <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
+                    Sauvegarder
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Fenêtre résultat GetFeatureInfo -->
+<div id="getFeatureInfo-result-window" class="basic-tools-dropdown-element basic-tools-dropdown-select-getFeatureInfo-content dropdown-menu">
+    <div class="modal-header">
+        <button type="button" class="close" ng-click="ctrl.closeGetFeatureInfoResultWindow()">×</button>
+        <h4 class="modal-title">Résultat requête WMS (GetFeatureInfo)</h4>
+    </div>
+    <div class="modal-body modal-body-big">
+        <div class="row" style="height: 99%;">
+            <!-- Bouttons calques -->
+            <div class="col-md-4">
+                <div ng-if="ctrl.iGetFeatureInfoWithResultLayers > 0" class="">
+                    <i>Avec résultat</i>
+                    <ul class="nav nav-pills nav-stacked" style="width: 180px">
+                        <li data-toggle="pill"
+                            class="list-group-item list-group-item-modal"
+                            ng-repeat="oCalque in ctrl.aGetFeatureInfoResult | orderBy:'name'"
+                            ng-class="{'active': ctrl.aGetFeatureInfoSelectedLayer === $index}"
+                            ng-click="ctrl.aGetFeatureInfoSelectedLayer = $index; ctrl.aGetFeatureInfoSelectedSubLayer = 0; ctrl.setCollapseSublayersTabs()"
+                            ng-show="oCalque.have_results === true">
+                            <span>
+                                {{oCalque.name}}
+                            </span>
+                        </li>
+                    </ul>
+                </div>
+                <div ng-if="ctrl.iGetFeatureInfoWithoutResultLayers > 0" class="margin-20">
+                    <i>Sans résultat</i>
+                    <ul class="nav nav-pills nav-stacked" style="width: 180px">
+                        <li data-toggle="pill"
+                            class="list-group-item list-group-item-modal"
+                            ng-repeat="oCalque in ctrl.aGetFeatureInfoResult | orderBy:'name'"
+                            ng-class="{'active': ctrl.aGetFeatureInfoSelectedLayer === $index}"
+                            ng-click="ctrl.aGetFeatureInfoSelectedLayer = $index; ctrl.aGetFeatureInfoSelectedSubLayer = 0; ctrl.setCollapseSublayersTabs()"
+                            ng-show="oCalque.have_results !== true">
+                            <span>
+                                {{oCalque.name}}
+                            </span>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-md-8" style="height: calc(100% - 42px);">
+
+                <!-- Bouttons couches -->
+                <ul class="nav nav-tabs" id="select-getFeatureInfo-result-window-sublayer-tabs" ng-if="collapseSublayersTabs != true">
+                    <li ng-repeat="oSubLayer in ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers | orderBy:sortGetFeatureInfoSubLayers"
+                        ng-class="{'active': ctrl.aGetFeatureInfoSelectedSubLayer === oSubLayer.index}"
+                        ng-click="ctrl.aGetFeatureInfoSelectedSubLayer = oSubLayer.index; ctrl.autocollapseGetFeatureInfoWindowTabs()">
+                        <a href="#">{{oSubLayer.name}}</a>
+                    </li>
+                </ul>
+                <ul class="nav nav-tabs" ng-if="collapseSublayersTabs == true">
+                    <li ng-repeat="oSubLayer in ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers | orderBy:sortGetFeatureInfoSubLayers"
+                        ng-if="ctrl.aGetFeatureInfoSelectedSubLayer === oSubLayer.index"
+                        ng-click="ctrl.aGetFeatureInfoSelectedSubLayer = oSubLayer.index; ctrl.autocollapseGetFeatureInfoWindowTabs()"
+                        class="active">
+                        <a href="#">{{oSubLayer.name}}</a>
+                    </li>
+                    <li id="select-getFeatureInfo-result-window-sublayer-collapsed-container">
+                        <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                            + <span class="caret"></span>
+                        </a>
+                        <ul class="dropdown-menu pull-right" id="select-getFeatureInfo-result-window-sublayer-collapsed-tab">
+                            <li ng-repeat="oSubLayer in ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers | orderBy:sortGetFeatureInfoSubLayers"
+                                ng-if="ctrl.aGetFeatureInfoSelectedSubLayer !== oSubLayer.index"
+                                ng-click="ctrl.aGetFeatureInfoSelectedSubLayer = oSubLayer.index; ctrl.autocollapseGetFeatureInfoWindowTabs()">
+                                <a href="#">{{oSubLayer.name}}</a>
+                            </li>
+                        </ul>
+                    </li>
+                </ul>
+
+                <!-- Résultats -->
+                <div ng-if="ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers[ctrl.aGetFeatureInfoSelectedSubLayer].result" style="height: 100%;">
+                    <iframe ng-src="{{ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers[ctrl.aGetFeatureInfoSelectedSubLayer].url_trusted}}" width="100%" height="100%"></iframe>
+                </div>
+                <div ng-if="!ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers[ctrl.aGetFeatureInfoSelectedSubLayer].result">
+                    <br>
+                    Aucun résultat disponible
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--Snapping parameters modal-->
+<div class="modal fade" id="vmap-select-snap-options-modal" role="dialog">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">×</button>
+                <h4 class="modal-title" data-translate="TITLE_SNAPPING_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3 font-12">
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <select class="form-control"
+                            ng-model="ctrl.tmpSnapOptions.mode">
+                        <option value="segment_edge_node" data-translate="FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                        <option value="edge_node" data-translate="FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                        <option value="node" data-translate="FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></option>
+                    </select>
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <input type="number" class="form-control" ng-model="ctrl.tmpSnapOptions.tolerance">
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_LIMIT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <input type="number" class="form-control" ng-model="ctrl.tmpSnapOptions.limit">
+                </div>
+                <div class="col-sm-6">
+                    <h5 data-translate="FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
+                    <div class="radio radio-inline">
+                        <input type="radio" name="vmap_select_snap_visible" id="vmap_select_snap_visible_1" ng-model="ctrl.tmpSnapOptions.visible" ng-value="true">
+                        <label for="vmap_select_snap_visible_1">Oui</label>
+                    </div>
+                    <div class="radio radio-inline">
+                        <input type="radio" name="vmap_select_snap_visible" id="vmap_select_snap_visible_2" ng-model="ctrl.tmpSnapOptions.visible" ng-value="false">
+                        <label for="vmap_select_snap_visible_2">Non</label>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer modal-footer-sm text-left">
+                <button class="btn btn-primary" ng-click="ctrl.resetSnapOptions()">
+                    Rétablir les paramètres par défaut
+                </button>
+                <button class="btn btn-primary" ng-click="ctrl.submitSnappingOptionsModal()">
+                    Valider
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--Select card modal-->
+<div class="modal fade" id="select-card-modal" role="dialog">
+    <div class="modal-dialog"
+         ng-class="{'modal-60':ctrl.editSelection.display_form_size == 2, 'modal-90':ctrl.editSelection.display_form_size == 3}">
+        <!--Modal content-->
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">{{ctrl.parseFormTile(ctrl.editSelection.bo_formtitle, ctrl.editSelection.bo_form)}}</h4>
+            </div>
+            <div class="modal-body modal-body-big-3 font-12">
+                <!--Form reader-->
+                <div id="select_display_form_reader"
+                     app-form-reader
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--Select edit modal-->
+<div class="modal fade" id="select-edit-modal" role="dialog">
+    <div class="modal-dialog"
+         ng-class="{'modal-60':ctrl.editSelection.edit_form_size == 2, 'modal-90':ctrl.editSelection.edit_form_size == 3}">
+        <!--Modal content-->
+        <div class="modal-content" style="">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+                <h4 class="modal-title">{{ctrl.parseFormTile(ctrl.editSelection.bo_formtitle, ctrl.editSelection.bo_form)}}</h4>
+            </div>
+            <div class="modal-body modal-body-big-with-footer-3 font-12">
+                <!--Form reader-->
+                <div id="select_edit_form_reader"
+                     app-form-reader
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+            </div>
+            <div class="modal-footer modal-footer-sm text-left">
+                <button class="btn btn-primary" ng-click="ctrl.editFormFeature(ctrl.editSelection)" ng-if="!$root.is_mobile">
+                    <span class="icon-line margin-2"></span>
+                    Modifier la géométrie
+                </button>
+                <button class="btn btn-primary"
+                        onclick="oVmap.simuleClick('basictools-select-form-reader-submit-btn')">
+                    <span class="glyphicon glyphicon-share-alt margin-2"></span>
+                    Sauvegarder
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/module/template/tools/selection-info.html b/module/template/tools/selection-info.html
new file mode 100755
index 0000000000000000000000000000000000000000..67ae224a98b68e690f824768279d50fd56899d33
--- /dev/null
+++ b/module/template/tools/selection-info.html
@@ -0,0 +1,44 @@
+
+<div id="selection-info-container">
+
+	<!--boutons de navigation-->
+	<div id="selection-nav" class="transparent">
+		<ul class="nav nav-pills nav-select">
+			<li role="presentation" ng-repeat="node in ctrl.FeaturesSelected">
+				<a data-toggle="pill"
+				   id="selection-layer-{{this['$index']}}-btn"
+				   class="basic-tools-element pointer selection-nav-element btn btn-default"
+				   href="#selection-layer-{{this['$index']}}"
+				   ng-click="ctrl.reloadSelection()">
+					{{node.name}}
+				</a>
+			</li>
+		</ul>
+	</div>
+
+	<!--tables-->
+	<div id="selection-info-lists">
+		<div id="selection-layer-{{this['$index']}}" 
+			 class="fade absolute selection-table" 
+			 ng-repeat="node in ctrl.FeaturesSelected">
+			<table id="selection-table-{{this['$index']}}" class="font-10"></table>
+		</div>
+	</div>
+
+
+
+
+	<div id="selection-message"></div>
+	<div id="feature-info" style="display: none"></div>
+	<div id="feature-info2" style="display: none"></div>
+
+	<button id="btn-refresh-selection" ng-click="ctrl.reloadSelection()" style="display: none">Reset Selection</button>
+
+	<div class="load-img"><img src="images/ajax-load-big.gif"></div>
+
+
+
+
+</div>
+
+
diff --git a/module/template/tools/tools.html b/module/template/tools/tools.html
new file mode 100755
index 0000000000000000000000000000000000000000..d9884503827ebafb5bdfc2e000eb074ad7e27f09
--- /dev/null
+++ b/module/template/tools/tools.html
@@ -0,0 +1,25 @@
+
+<!--Bandeau de droite-->
+<tools-container id="tools-container"></tools-container>
+
+<!-- Bandeau du haut -->
+<div id="basic-tools-bar" app-basictools app-lang="ctrl.lang" app-map="ctrl.map" app-infos="ctrl.infos" app-action="ctrl.currentAction"></div>
+
+<!-- Boutons badeau de droite -->
+<div id="tool-sidebar" ng-show="ctrl.oToolsTree !== undefined">
+
+	<div ng-repeat="(id, value) in ctrl.oToolsTree"
+		id="{{id}}-button"
+		class="{{value.infos.icon}}"
+		data-toggle="tooltip"
+		data-placement="left"
+		data-trigger='hover'
+		title="{{value.infos.tooltip}}"
+		onclick="angular.element($('#olMap')).scope().ctrl.startAnimation(); oVmap.getToolsManager().getBasicTools().toggleOutTools(); $('[data-toggle=\'tooltip\']').tooltip('hide');"
+		ng-click="ctrl.openedTool !== id ? ctrl.openedTool = id : ctrl.openedTool = '_'; $parent.$parent.vmapCtrl.right_open = ctrl.openedTool !== '_'"
+		ng-class="ctrl.openedTool === id ? 'tool-btn tool-btn-active' : 'tool-btn'"
+		style="background-color; background-image: url({{value.infos.image}})"></div>
+
+	<div id="close-tools" class="right-sidebar-closeband" onclick="oVmap.simuleClickOnClass('tool-btn-active')"></div>
+
+</div>
\ No newline at end of file
diff --git a/module/template/tools/urlexporter.html b/module/template/tools/urlexporter.html
new file mode 100644
index 0000000000000000000000000000000000000000..8219c05115135bb301def37dcd88452878d5a06b
--- /dev/null
+++ b/module/template/tools/urlexporter.html
@@ -0,0 +1,11 @@
+<!--UrlExporter-->
+<div class="row margin-sides-0 margin-10">
+    <div class="col-md-3" ng-show="ctrl.properties.allow_public_connection">
+        <input type="checkbox" ng-model="ctrl.usePublicToken" id="publicAccountCheckbox">
+        <label for="publicAccountCheckbox" class="control-label">Public</label>
+    </div>          
+    <div class="" ng-class="{'col-md-9' : ctrl.properties.allow_public_connection, 'col-md-12': !ctrl.properties.allow_public_connection}">
+        <label for="urlExporterField" class="control-label">URL</label>
+        <input type="text" class="form-control" ng-model="ctrl.urlToExport" id="urlExporterField">
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/tools/user.html b/module/template/tools/user.html
new file mode 100755
index 0000000000000000000000000000000000000000..61b0a7440dbf988fb5bc76df3846b95d9cbc8005
--- /dev/null
+++ b/module/template/tools/user.html
@@ -0,0 +1,33 @@
+
+<i class="basic-tools-dropdown-title">{{sUserLoginText}}</i>
+
+<ul class="basic-tools-dropdown-menu">
+    <li role="separator" class="divider"></li>
+    <li>
+        <a data-toggle="tooltip" data-placement="left" data-translate="USER_INFOS" ng-click="ctrl.displayUserInfos()"></a>
+    </li>
+    <li>
+        <a data-toggle="tooltip" data-placement="left" data-translate="DISCONNECT" ng-click="ctrl.disconnect()"></a>
+    </li>
+</ul>
+
+<!--Modale contenant le formulaire utilisateur-->
+<div class="modal fade" id="basictools-user-form-reader-modal" role="dialog">
+    <div class="modal-dialog">
+        <!--Modal content-->
+        <div class="modal-content" style="">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">×</button>
+                <h4 class="modal-title">{{sUserLoginText}}</h4>
+            </div>
+            <div class="modal-body">
+
+                <!--Form reader-->
+                <div id="basictools-user-form-reader"
+                     app-form-reader 
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/tools/user_mobile.html b/module/template/tools/user_mobile.html
new file mode 100755
index 0000000000000000000000000000000000000000..947aa7d18d97f3c3912d6c61b5347a1dfab7e655
--- /dev/null
+++ b/module/template/tools/user_mobile.html
@@ -0,0 +1,26 @@
+<a class="list-group-item sublist-group-item" ng-click="ctrl.displayUserInfos()"><span class="icon-format_list_bulleted mobile_menu_logo"></span> Infos utilisateur</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.disconnect()"><span class="icon-block mobile_menu_logo"></span> Déconnexion</a>
+
+<!--Modale contenant le formulaire utilisateur-->
+<div class="modal fade" id="basictools-user-form-reader-modal" role="dialog">
+    <div class="modal-dialog">
+        <!--Modal content-->
+        <div class="modal-content" style="">
+            <div class="modal-header">                
+                <!-- Bouton retour -->
+                <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal">
+                    <span class="icon-caret-left"></span> Retour
+                </div>
+                <h4 class="modal-title">{{sUserLoginText}}</h4>
+            </div>
+            <div class="modal-body">
+
+                <!--Form reader-->
+                <div id="basictools-user-form-reader"
+                     app-form-reader 
+                     app-properties="ctrl.properties"
+                     app-token="ctrl.token"></div>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/vitis/documentationHelpTpl.html b/module/template/vitis/documentationHelpTpl.html
new file mode 100755
index 0000000000000000000000000000000000000000..ca4d9d4403567318f9218292d9c3b17731dd1cd0
--- /dev/null
+++ b/module/template/vitis/documentationHelpTpl.html
@@ -0,0 +1,9 @@
+
+<div class="documentation-help">
+    <div>
+        <div data-app-documentation-help="" class="documentation-help-title simple-form-title">
+            La documentation de vMap est hébergée en ligne sur <a href="{{sUrlDocumentationHelp}}" target="_bank">{{sUrlDocumentationHelp}}</a>
+        </div>
+        <iframe data-app-documentation-help="" src="{{sUrlDocumentationHelp}}" class="documentation-help-iframe"></iframe>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/vitis/exportVex.html b/module/template/vitis/exportVex.html
new file mode 100755
index 0000000000000000000000000000000000000000..91cd30c3716d84f3f81914f9207dc99739068896
--- /dev/null
+++ b/module/template/vitis/exportVex.html
@@ -0,0 +1,97 @@
+<div class="modal-body-with-footer">
+    <div class="stepwizard">
+        <div class="stepwizard-row setup-panel">
+            <div ng-repeat="step in steps" class="stepwizard-step" ng-style="{'width': (100 / steps.length) + '%'}">
+                <a href="#" 
+                   type="button" 
+                   class="btn btn-default btn-circle" 
+                   ng-class="{'btn-primary' : displayedStep === step, 'btn-inverse': selectedSteps[step] === false}" 
+                   disabled>{{$index + 1}}</a>
+                <p data-translate="CTRL_EXPORT_VEX_STEP_{{step}}"></p>
+            </div>
+        </div>
+    </div>
+    <!--select_vmap_objects-->
+    <div ng-show="displayedStep === 'select_vmap_objects'">
+        <div class="">
+            <div class="col-md-12">
+                <div class="text-center">
+                    <h3 data-translate="CTRL_EXPORT_VEX_SELECT_VMAP_OBJETS"></h3>
+                </div>
+                <br>
+                <div class="">
+                    <div class="treeview-container">
+                        <div id="export-vex-vmap-objects-treeview"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--select_web_services-->
+    <div ng-show="displayedStep === 'select_web_services'">
+        <div class="">
+            <div class="col-md-12">
+                <div class="text-center">
+                    <h3 data-translate="CTRL_EXPORT_VEX_SELECT_WEB_SERVICES"></h3>
+                </div>
+                <br>
+                <div class="">
+                    <div class="treeview-container">
+                        <div id="export-vex-web-services-treeview"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--select_sql_objects-->
+    <div ng-show="displayedStep === 'select_sql_objects'">
+        <div class="">
+            <div class="col-md-12">
+                <div class="text-center">
+                    <h3 data-translate="CTRL_EXPORT_VEX_SELECT_SQL"></h3>
+                </div>
+                <br>
+                <div class="">
+                    <div class="form-group">
+                        <label class="control-label" data-translate="CTRL_EXPORT_VEX_SELECT_DB"></label>
+                        <select class="form-control" 
+                                ng-model="sSelectedDatabase" 
+                                ng-options="database for database in aAvaliableDatabases">
+                            <option value=""></option>
+                        </select>
+                    </div>
+                    <div class="treeview-container">
+                        <div id="export-vex-sql-objects-treeview"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--execute_export-->
+    <div ng-show="displayedStep === 'execute_export'" class="export-vex-execute-step">
+        <div class="col-md-12 height-100">
+            <div class="text-center">
+                <h3 data-translate="CTRL_EXPORT_VEX_EXPORT_EXECUTION"></h3>
+            </div>
+            <br>
+            <div class="export-vex-execute-step-button-container col-xs-6 col-xs-offset-3">
+                <div class="export-vex-execute-step-button">
+                    <button class="btn btn-primary btn-block btn-lg" data-translate="CTRL_EXPORT_VEX_GENERATE_VEX" ng-click="ctrl.executeExport()"></button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="modal-footer">
+    <!--Bouton terminer-->
+    <a class="btn btn-primary btn pull-right margin-left-10" type="button" 
+       ng-click="ctrl.closeExportModal()" 
+       ng-show="displayedStep === 'execute_export' && bExportOk === true" data-translate="CTRL_EXPORT_VEX_FINISH"></a>
+    <!--Bouton suivant-->
+    <a class="btn btn-primary btn pull-right margin-left-10" type="button" 
+       ng-click="ctrl.submitStep(displayedStep)" 
+       ng-show="displayedStep !== 'execute_export'" data-translate="CTRL_EXPORT_VEX_NEXT"></a>
+    <!--Bouton précédent-->
+    <a class="btn btn-default btn pull-right margin-left-10" type="button" 
+       ng-click="ctrl.prevStep()" data-translate="CTRL_EXPORT_VEX_PREVIOUS"></a>
+</div>
diff --git a/module/template/vitis/importVex.html b/module/template/vitis/importVex.html
new file mode 100755
index 0000000000000000000000000000000000000000..aaa1348504526b51343645ec382cebc100e6a9a8
--- /dev/null
+++ b/module/template/vitis/importVex.html
@@ -0,0 +1,297 @@
+<div class="modal-body-with-footer">
+    <div class="stepwizard">
+        <div class="stepwizard-row setup-panel">
+            <div ng-repeat="step in steps" class="stepwizard-step" ng-style="{'width': (100 / steps.length) + '%'}">
+                <a href="#"
+                   type="button"
+                   class="btn btn-default btn-circle"
+                   ng-class="{'btn-primary' : displayedStep === step, 'btn-inverse': selectedSteps[step] === false}"
+                   disabled>{{$index + 1}}</a>
+                <p data-translate="CTRL_IMPORT_VEX_STEP_{{step}}"></p>
+            </div>
+        </div>
+    </div>
+    <!--import_vex_file-->
+    <div ng-show="displayedStep === 'import_vex_file'">
+        <div class="col-md-6 col-md-offset-3">
+            <div class="col-md-12">
+                <h3 data-translate="CTRL_IMPORT_VEX_IMPORT_VEX_FILE"></h3>
+                <br>
+                <div class="form-group form-group-sm">
+                    <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_FILE"></label>
+                    <input id="import-vex-file-input" type="file" class="file">
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--config-->
+    <div ng-show="displayedStep === 'config'">
+        <div class="col-md-8 col-md-offset-2">
+            <h3 data-translate="CTRL_IMPORT_VEX_CONFIGURATION"></h3>
+            <br>
+            <form class="form-group form-group-sm">
+                <!--Database-->
+                <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_DB"></label>
+                <select class="form-control"
+                        ng-model="usedDatabase"
+                        ng-options="database as database for database in aDatabases">
+                    <option value=""></option>
+                </select>
+                <br>
+                <!--Schema-->
+                <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_SCHEMA"></label>
+                <div class="row">
+                    <div class="col-xs-5" style="width: 46%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_EXISTING_SCHEMA"></label>
+                        <select class="form-control"
+                                ng-model="selectedExistingSchema"
+                                ng-change="ctrl.setUsedSchema(false)"
+                                ng-options="schema as schema for schema in aSchemas">
+                            <option value=""></option>
+                        </select>
+                    </div>
+                    <div class="col-xs-2" style="text-align: center;padding-top: 30px;width: 8%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_OR"></label>
+                    </div>
+                    <div class="col-xs-5" style="width: 46%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_CREATE_SCHEMA"></label>
+                        <input ng-model="createdNewSchema"
+                               ng-change="ctrl.setUsedSchema(true)"
+                               type="text"
+                               class="form-control"/>
+                    </div>
+                </div>
+                <br>
+                <!--Roles-->
+                <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_ROLE"></label>
+                <div class="row">
+                    <div class="col-xs-5" style="width: 46%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_USER_ROLE"></label>
+                        <select class="form-control"
+                                ng-model="usedUserRole"
+                                ng-options="role as role for role in aRoleGroups">
+                            <option value=""></option>
+                        </select>
+                    </div>
+                    <div class="col-xs-2" style="text-align: center;padding-top: 30px;width: 8%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_AND"></label>
+                    </div>
+                    <div class="col-xs-5" style="width: 46%;">
+                        <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_ADMIN_ROLE"></label>
+                        <select class="form-control"
+                                ng-model="usedAdminRole"
+                                ng-options="role as role for role in aRoleGroups">
+                            <option value=""></option>
+                        </select>
+                    </div>
+                </div>
+                <br>
+                <!--Coordsys-->
+                <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_COORDSYS"></label>
+                <select class="form-control"
+                        ng-model="usedSRID"
+                        ng-options="coordsys.coordsys_id as coordsys.label for coordsys in aCoordsys">
+                    <option value=""></option>
+                </select>
+                <br>
+                <!--Objets à importer-->
+                <label class="control-label" data-translate="CTRL_IMPORT_VEX_SELECT_ELEMENTS"></label>
+                <div class="row margin-left-15">
+                    <div class="col-xs-4">
+                        <div class="checkbox checkbox-primary">
+                            <input id="import_bo_select_elem_sql" class="styled" type="checkbox" ng-model="selectedSteps.vmap_objects">
+                            <label for="import_bo_select_elem_sql" data-translate="CTRL_IMPORT_VEX_STEP_vmap_objects"></label>
+                        </div>
+                    </div>
+                    <div class="col-xs-4">
+                        <div class="checkbox checkbox-primary">
+                            <input id="import_bo_select_elem_layers" class="styled" type="checkbox" ng-model="selectedSteps.import_sql">
+                            <label for="import_bo_select_elem_layers" data-translate="CTRL_IMPORT_VEX_STEP_import_sql"></label>
+                        </div>
+                    </div>
+                    <div class="col-xs-4">
+                        <div class="checkbox checkbox-primary">
+                            <input id="import_bo_select_elem_business_object" class="styled" type="checkbox" ng-model="selectedSteps.web_services">
+                            <label for="import_bo_select_elem_business_object" data-translate="CTRL_IMPORT_VEX_STEP_web_services"></label>
+                        </div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+    <!--vmap_objects-->
+    <div ng-show="displayedStep === 'vmap_objects'">
+        <div class="col-md-12">
+            <div class="text-center">
+                <h3 data-translate="CTRL_IMPORT_VEX_SELECT_VMAP_OBJETS"></h3>
+            </div>
+            <br>
+            <div class="">
+                <div class="treeview-container">
+                    <div id="import-vex-vmap-objects-treeview"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--import_sql-->
+    <div ng-show="displayedStep === 'import_sql'">
+        <div class="col-md-12">
+            <ul class="nav nav-tabs">
+                <li class="active"><a data-toggle="tab" href="#import_vex_sql_model" data-translate="CTRL_IMPORT_VEX_SELECT_SQL_MODEL"></a></li>
+                <li ng-if="oSql.export_data_sql" ng-click="refreshCodeMirror()"><a data-toggle="tab" href="#import_vex_sql_data" data-translate="CTRL_IMPORT_VEX_SELECT_SQL_DATA"></a></li>
+            </ul>
+            <div class="tab-content">
+                <div id="import_vex_sql_model" class="tab-pane fade in active">
+                    <ui-codemirror ui-codemirror-opts="codemirrorSQLModelOptions" ui-refresh="sSQLModel" ng-model="sSQLModel"></ui-codemirror>
+                </div>
+                <div id="import_vex_sql_data" class="tab-pane fade" ng-if="oSql.export_data_sql">
+                    <ui-codemirror ui-codemirror-opts="codemirrorSQLDataOptions" ui-refresh="sSQLData" ng-model="sSQLData"></ui-codemirror>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--web_services-->
+    <div ng-show="displayedStep === 'web_services'">
+        <div class="col-md-12">
+            <div class="text-center">
+                <h3 data-translate="CTRL_IMPORT_VEX_WEB_SERVICES"></h3>
+            </div>
+            <br>
+            <div class="">
+                <div class="treeview-container">
+                    <div id="import-vex-web-services-treeview"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--execute_import-->
+    <div ng-show="displayedStep === 'execute_import'">
+        <div class="col-md-12">
+            <div class="text-center">
+                <h3 data-translate="CTRL_IMPORT_VEX_IMPORT_EXECUTION"></h3>
+            </div>
+            <br>
+            <div class="col-xs-6 col-md-offset-4">
+                <ol>
+                    <!--Objets vMap-->
+                    <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects !== null}" ng-show="selectedSteps['vmap_objects'] !== false && oVMapObjects != null">
+                        <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS"></span>
+                        <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects === true"></span>
+                        <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects === false"></span>
+                        <ol>
+                            <!--Carte-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_maps !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_MAPS"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_maps === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_maps === false"></span>
+                            </li>
+                            <!--Services-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_services !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_SERVICES"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_services === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_services === false"></span>
+                            </li>
+                            <!--Calques-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_calques !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUES"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_calques === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_calques === false"></span>
+                            </li>
+                            <!--Thèmes des calques-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_calque_themes !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_CALQUE_THEMES"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_calque_themes === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_calque_themes === false"></span>
+                            </li>
+                            <!--Couches Mapser-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_vm4ms_layers !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_VM4MS_LAYERS"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_vm4ms_layers === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_vm4ms_layers === false"></span>
+                            </li>
+                            <!--Objets métier-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_business_objects !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_BUSINESS_OBJECTS"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_business_objects === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_business_objects === false"></span>
+                            </li>
+                            <!--Événements-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_events !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_EVENTS"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_events === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_events === false"></span>
+                            </li>
+                            <!--Rapports-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.vmap_objects_reports !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_VMAP_OBJECTS_REPORTS"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.vmap_objects_reports === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.vmap_objects_reports === false"></span>
+                            </li>
+                        </ol>
+                    </li>
+
+                    <!--Web Services-->
+                    <li class="normal" ng-class="{'bold':oImportSteps.web_services !== null}" ng-show="selectedSteps['web_services'] !== false && aWebServices != null">
+                        <span data-translate="CTRL_IMPORT_VEX_IMPORT_WEB_SERVICES"></span>
+                        <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.web_services === true"></span>
+                        <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.web_services === false"></span>
+                    </li>
+
+                    <!--SQL-->
+                    <li class="normal" ng-class="{'bold':oImportSteps.sql !== null}" ng-show="selectedSteps['import_sql'] !== false && oSql != null">
+                        <span data-translate="CTRL_IMPORT_VEX_IMPORT_SQL"></span>
+                        <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.sql === true"></span>
+                        <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.sql === false"></span>
+                        <ol>
+                            <!--Modèle de données-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.sql_model !== null}">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_SQL_MODEL"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.sql_model === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.sql_model === false"></span>
+                            </li>
+                            <!--Données-->
+                            <li class="normal" ng-class="{'bold':oImportSteps.sql_data !== null}" ng-show="sSQLData.length > 0">
+                                <span data-translate="CTRL_IMPORT_VEX_IMPORT_SQL_DATA"></span>
+                                <span class="glyphicon glyphicon-ok color-green" ng-show="oImportSteps.sql_data === true"></span>
+                                <span class="glyphicon glyphicon-remove color-red" ng-show="oImportSteps.sql_data === false"></span>
+                            </li>
+                        </ol>
+                    </li>
+                </ol>
+            </div>
+        </div>
+    </div>
+    <!--finalize-->
+    <div ng-show="displayedStep === 'finalize'">
+        <div class="col-md-12">
+            <div class="text-center">
+                <h3 data-translate="CTRL_IMPORT_VEX_TO_DO">: </h3>
+            </div>
+            <br>
+            <div class="col-md-offset-2">
+                <ul>
+                    <li class="bold">
+                        <span data-translate="CTRL_IMPORT_VEX_TO_DO_MAP"></span>
+                    </li>
+                    <li class="bold">
+                        <span data-translate="CTRL_IMPORT_VEX_TO_DO_PGADMIN"></span>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="modal-footer">
+    <a class="btn btn-primary btn pull-right margin-left-10" type="button"
+       ng-click="ctrl.closeImportModal()"
+       ng-show="displayedStep === 'finalize'" data-translate="CTRL_IMPORT_VEX_FINISH"></a>
+    <a class="btn btn-primary btn pull-right margin-left-10" type="button"
+       ng-click="ctrl.submitStep(displayedStep)"
+       ng-show="(displayedStep !== 'execute_import' || bImportDone === true) && displayedStep !== 'finalize'" data-translate="CTRL_IMPORT_VEX_NEXT"></a>
+    <a class="btn btn-primary btn pull-right margin-left-10" type="button"
+       ng-click="ctrl.executeImport()"
+       ng-show="displayedStep === 'execute_import' && bImportDone !== true" data-translate="CTRL_IMPORT_VEX_EXECUTE"></a>
+    <a class="btn btn-default btn pull-right margin-left-10" type="button"
+       ng-click="ctrl.prevStep()"
+       ng-show="displayedStep !== 'import_vex_file' && displayedStep !== 'finalize'" data-translate="CTRL_IMPORT_VEX_PREVIOUS"></a>
+</div>
diff --git a/module/template/vitis/serviceLayers.html b/module/template/vitis/serviceLayers.html
new file mode 100755
index 0000000000000000000000000000000000000000..2fc965a3cfcd97ffd44383ca4d5cfa2d3d9d59b2
--- /dev/null
+++ b/module/template/vitis/serviceLayers.html
@@ -0,0 +1,29 @@
+<div class="row layer-tests">
+    <div data-app-service-layers="" class="col-xs-12">
+        <!-- Menu -->
+        <ul class="nav nav-tabs" role="tablist">
+            <li role="presentation" class="active">
+                <a href="#service_layers_layers_list" aria-controls="service_layers_layers_list" role="tab" data-toggle="tab">{{ 'TITLE_GRID_VMAP_MAP_LAYER_WMS_LAYERS' | translate }}</a>
+            </li>
+            <li role="presentation">
+                <a href="#service_layers_capabilities" aria-controls="service_layers_capabilities" role="tab" data-toggle="tab" ng-click="refresh = !refresh">GetCapabilities</a>
+            </li>
+            <li role="presentation">
+                <a href="#service_layers_layers_ol" aria-controls="service_layers_layers_ol" role="tab" data-toggle="tab" ng-click="showOlMap()">OpenLayers 3</a>
+            </li>
+        </ul>
+        <!-- Onglets -->
+        <div class="tab-content" style="height: calc(100% - 46px);">
+            <div role="tabpanel" class="tab-pane active" id="service_layers_layers_list"></div>
+            <div role="tabpanel" class="tab-pane" id="service_layers_capabilities">                
+                <ui-codemirror id="service_layers_capabilities_codemirror" ui-codemirror-opts="codemirror_options" ui-refresh="refresh" ng-model="xml" style="height: 50%"></ui-codemirror>
+            </div>
+            <div role="tabpanel" class="tab-pane" id="service_layers_layers_ol">
+                <div id="service_layers_layers_ol_formreader"
+                     app-form-reader 
+                     app-properties="ctrl.oProperties"
+                     app-token="ctrl.sToken"></div>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/module/template/vmap.html b/module/template/vmap.html
new file mode 100755
index 0000000000000000000000000000000000000000..358cdd8b6ca49e2c506b886d9a79c2683830b5cb
--- /dev/null
+++ b/module/template/vmap.html
@@ -0,0 +1,69 @@
+<div id="container">
+
+    <!-- Bandeau de gauche -->
+    <div ng-if="!$root.is_mobile" id="left-sidebar" ng-class="vmapCtrl.left_open ? 'open' : ''">
+        <div id="maplistlitle-container" class="dropdown">
+            <!--voir dans maplistlitle.js pour l'evenement de fermeture de la dropdown-->
+            <button id="maplistlitle-button" class="btn btn-success dropdown-toggle btn-map-manager" 
+                    type="button"
+                    onclick="$('#maplistlitle-container').toggleClass('open')">
+                <span class="icon-map left" style="font-size: 30px"></span>
+                <span class="left" style="margin: 6px 14px">CARTES</span>
+                <span class="right" style="margin: 6px 4px">
+                    <span class="caret"></span>
+                </span>
+            </button>
+            
+            
+            <div id="dropdownMenuMaps" class="dropdown-menu map-list-litle-panel">
+
+                <app-maplistlitle app-lang="ctrl.lang" app-maplistlitle-map="ctrl.map"></app-maplistlitle>
+
+                <div id="map-manager-button-container" style="text-align: center">
+                    <button id="map-manager-button" 
+                            type="button" 
+                            class="btn btn-success btn-sm btn-modal margin-10"
+                            onclick="oVmap.simuleClick('btn-reload-myMap'); $('#mapModalManager').modal('show'); $('#dropdownMenuMaps').dropdown('toggle')">
+                        GESTION DES CARTES
+                    </button> 
+                </div>
+            </div>
+        </div>
+
+        <div app-layertree app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" app-lang="vmapCtrl.lang" id="app-layertree"></div>
+        <div app-layersorder app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" app-lang="vmapCtrl.lang" id="app-layersorder"></div>
+        <div app-maplegend app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" app-lang="vmapCtrl.lang" id="app-maplegend"></div>
+        <div id="LayersDiv"></div> 
+
+        <!-- Map Modal -->
+        <div class="modal fade" id="mapModalManager" role="dialog">
+            <app-mapmodal app-lang="vmapCtrl.lang" app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" id="app-mapmodal"></app-mapmodal>
+        </div>
+    </div>
+
+    <!-- Outils Vmap -->
+    <app-vmaptools id="vmap-tools" app-lang="vmapCtrl.lang" app-map="vmapCtrl.map" app-proj="vmapCtrl.proj" app-infos="vmapCtrl.infos" app-action="vmapCtrl.currentAction"></app-vmaptools>
+
+    <!-- Ouvre le bandeau de gauche -->
+    <div ng-if="!$root.is_mobile" id="opener-sidebar" ng-click="vmapCtrl.left_open = !vmapCtrl.left_open" onclick="oVmap.resizeLayerTools(false); oVmap.getToolsManager().getBasicTools().toggleOutTools();">
+        <div class="layer-tools-btn shadow-hover icon-tree" ng-class="vmapCtrl.left_open ? 'open' : ''" data-original-title="Couches et cartes"></div>
+    </div>
+    
+    <!-- Carte -->
+    <div id="map-container" ng-class="ctrl.bottom_open ? 'open' : ''">
+        <app-map app-map="vmapCtrl.map" app-action="vmapCtrl.currentAction"></app-map>
+    </div>
+
+    <!-- Bandeau de selection -->
+    <div id="opener-bottombar" class="list-group-item active">
+        <div id="opener-bottombar-1" class="open-selection-info" ng-click="ctrl.bottom_open = !ctrl.bottom_open" onclick="oVmap.minResizeBottomBar()"></div>
+        <div id="opener-bottombar-2" class="open-more-selection-info" ng-click="ctrl.bottom_open = !ctrl.bottom_open" onclick="oVmap.maxResizeBottomBar()"><button class="btn-open-more-selection-info">^</button></div>
+    </div>
+    <div id="bottombar" ng-class="{'open': ctrl.bottom_open, 'bottombar_right_open': vmapCtrl.right_open, 'bottombar_left_open': vmapCtrl.left_open, 'bottombar_sides_open': vmapCtrl.right_open && vmapCtrl.left_open}">
+        <div id="info-container" app-infocontainer app-infocontainer-lang="vmapCtrl.lang" app-infos="vmapCtrl.infos"></div>
+    </div>
+</div>
+
+
+
+
diff --git a/storage/veremes_demo_dessin/forms/custom.json b/storage/veremes_demo_dessin/forms/custom.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/custom.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/storage/veremes_demo_dessin/forms/default.json b/storage/veremes_demo_dessin/forms/default.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/default.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/storage/veremes_demo_dessin/forms/published.json b/storage/veremes_demo_dessin/forms/published.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/published.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/storage/veremes_demo_dessin/forms/ressources/custom.js b/storage/veremes_demo_dessin/forms/ressources/custom.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/ressources/custom.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/storage/veremes_demo_dessin/forms/ressources/default.js b/storage/veremes_demo_dessin/forms/ressources/default.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/ressources/default.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/storage/veremes_demo_dessin/forms/ressources/published.js b/storage/veremes_demo_dessin/forms/ressources/published.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/storage/veremes_demo_dessin/forms/ressources/published.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/storage/veremes_demo_dessin/json/business_object.json b/storage/veremes_demo_dessin/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..6e193dafff5fdf77677c0e477528edd0f98d7b6d
--- /dev/null
+++ b/storage/veremes_demo_dessin/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+   "business_object_id":"vmap_dessin",
+   "title":"Dessin",
+   "id_field":"draw_id",
+   "database":"vmap_angular",
+   "schema":"[TABLE_SCHEMA]",
+   "table":"v_draw",
+   "sql_summary":"select draw_id, description, text_label from [TABLE_SCHEMA].v_draw",
+   "sql_list":"select draw_id as \"Id\", text_label as \"Nom\" , area,  perimeter from [TABLE_SCHEMA].v_draw",
+   "sorted_by":"draw_id",
+   "geom_column":"geom",
+   "search_field":"draw_id",
+   "result_field":"draw_id",
+   "search_use_strict":"left",
+   "event_id":null,
+   "index":0,
+   "add_form_size":1,
+   "edit_form_size":1,
+   "display_form_size":1
+}
diff --git a/storage/veremes_demo_dessin/json/event.json b/storage/veremes_demo_dessin/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..b1cc925ba0806aea91147e0d6f24138d16dc8fed
--- /dev/null
+++ b/storage/veremes_demo_dessin/json/event.json
@@ -0,0 +1,4 @@
+{
+	"event_id":"veremes_demo_dessin_event",
+	"description":"Événement appelé lorsque veremes_demo_dessin change"
+}
diff --git a/storage/veremes_demo_dessin/json/mapserver_layers.json b/storage/veremes_demo_dessin/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..5155634a2c2295191865d567b50548d370d1af44
--- /dev/null
+++ b/storage/veremes_demo_dessin/json/mapserver_layers.json
@@ -0,0 +1,65 @@
+[{  
+   "ms_layer_id":30,
+   "name":"Dessin_Point",
+   "title":"Dessin Point",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_point",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tSYMBOL \"circle\"\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tSIZE [geom_size]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tSYMBOL \"circle\"\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tSIZE [geom_size]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\tEND\r\n\tEND\r\nEND\r\n\r\n",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"POINT",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "definitiontmp":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}, {  
+   "ms_layer_id":31,
+   "name":"Dessin_Ligne",
+   "title":"Dessin Ligne",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_line",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\nEND",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"LINE",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}, {  
+   "ms_layer_id":32,
+   "name":"Dessin_Polygone",
+   "title":"Dessin Polygone",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_poly",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\t\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.1.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\t\tCOLOR [background_color]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION CC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\t\tCOLOR [background_color]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION CC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\nEND",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"POLYGON",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/storage/veremes_demo_dessin/package.json b/storage/veremes_demo_dessin/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..9bf4d6f5d5352f715d621d0dc0e242a4cea01bec
--- /dev/null
+++ b/storage/veremes_demo_dessin/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Armand",
+	"mame": "veremes_demo_dessin",
+	"description": "Objet métier permettant la visualisation des dessins"
+}
diff --git a/storage/veremes_demo_dessin/sql/structure.json b/storage/veremes_demo_dessin/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..f475b4532a7340d10f1fe9f7f55dd927be466c29
--- /dev/null
+++ b/storage/veremes_demo_dessin/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "s_draw",
+	"srid": "2154",
+	"tables": ["draw, v_draw, v_draw_line, v_draw_poly, v_draw_point"],
+	"sequences": ["seq_draw"]
+}
\ No newline at end of file
diff --git a/storage/veremes_demo_dessin/sql/table.sql b/storage/veremes_demo_dessin/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..1b037df8a4c2628c91e09dddd04cb350d8664a56
--- /dev/null
+++ b/storage/veremes_demo_dessin/sql/table.sql
@@ -0,0 +1,282 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.14
+-- Dumped by pg_dump version 9.5.6
+
+-- Started on 2017-06-07 09:12:15 CEST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+-- SET row_security = off;
+
+SET search_path = [TABLE_SCHEMA], pg_catalog;
+
+--
+-- TOC entry 452 (class 1259 OID 67429)
+-- Name: seq_draw; Type: SEQUENCE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE SEQUENCE seq_draw
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = true;
+
+--
+-- TOC entry 453 (class 1259 OID 67620)
+-- Name: draw; Type: TABLE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE TABLE draw (
+    draw_id integer DEFAULT nextval('seq_draw'::regclass) NOT NULL,
+    theme character varying(50),
+    comments text,
+    description character varying(255),
+    text_size integer,
+    geom_size integer,
+    user_id integer,
+    label boolean DEFAULT true,
+    graph boolean DEFAULT true,
+    contour_color character varying(50),
+    background_color character varying(50),
+    color_label character varying(50),
+    area character varying(30),
+    area_label boolean,
+    perimeter character varying(30),
+    perimeter_label boolean,
+    text_label character varying(255),
+    geom public.geometry(Geometry,[SRID]),
+    CONSTRAINT enforce_dims_geom CHECK ((public.st_ndims(geom) = 2)),
+    CONSTRAINT enforce_srid_geom CHECK ((public.st_srid(geom) = [SRID]))
+);
+
+
+--
+-- TOC entry 490 (class 1259 OID 68425)
+-- Name: v_draw; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE (("user".login)::name = "current_user"())
+  ORDER BY draw.draw_id DESC;
+
+
+--
+-- TOC entry 454 (class 1259 OID 67686)
+-- Name: v_draw_line; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_line AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Line%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 455 (class 1259 OID 67691)
+-- Name: v_draw_point; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_point AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Point%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 456 (class 1259 OID 67696)
+-- Name: v_draw_poly; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_poly AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Polygon%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 3985 (class 2606 OID 67632)
+-- Name: pk_draw; Type: CONSTRAINT; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+ALTER TABLE ONLY draw
+    ADD CONSTRAINT pk_draw PRIMARY KEY (draw_id);
+
+
+--
+-- TOC entry 3983 (class 1259 OID 67677)
+-- Name: dessin_geom; Type: INDEX; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE INDEX dessin_geom ON draw USING gist (geom);
+
+
+--
+-- TOC entry 4211 (class 2618 OID 68430)
+-- Name: delete_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE delete_v_draw AS
+    ON DELETE TO v_draw DO INSTEAD  DELETE FROM draw
+  WHERE (draw.draw_id = old.draw_id);
+
+
+--
+-- TOC entry 4212 (class 2618 OID 68431)
+-- Name: insert_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE insert_v_draw AS
+    ON INSERT TO v_draw DO INSTEAD  INSERT INTO draw (theme, comments, description, text_size, user_id, label, contour_color, background_color, color_label, geom, graph, geom_size, area, area_label, perimeter, perimeter_label, text_label)
+  VALUES (new.theme, new.comments, new.description, new.text_size, ( SELECT "user".user_id
+           FROM s_vitis."user"
+          WHERE (("user".login)::name = "current_user"())), new.label, new.contour_color, new.background_color, new.color_label, new.geom, new.graph, new.geom_size, new.area, new.area_label, new.perimeter, new.perimeter_label, new.text_label)
+  RETURNING draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    ''::character varying AS "varchar";
+
+
+--
+-- TOC entry 4213 (class 2618 OID 68433)
+-- Name: update_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE update_v_draw AS
+    ON UPDATE TO v_draw DO INSTEAD  UPDATE draw SET draw_id = new.draw_id, theme = new.theme, comments = new.comments, description = new.description, text_size = new.text_size, user_id = new.user_id, label = new.label, contour_color = new.contour_color, background_color = new.background_color, color_label = new.color_label, geom = new.geom, graph = new.graph, geom_size = new.geom_size, area = new.area, area_label = new.area_label, perimeter = new.perimeter, perimeter_label = new.perimeter_label, text_label = new.text_label
+  WHERE (draw.draw_id = new.draw_id);
+
+
+--
+-- TOC entry 3986 (class 2606 OID 67633)
+-- Name: fk_user_login; Type: FK CONSTRAINT; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+ALTER TABLE ONLY draw
+    ADD CONSTRAINT fk_user_login FOREIGN KEY (user_id) REFERENCES s_vitis."user"(user_id) ON DELETE CASCADE;
+
+
+GRANT USAGE ON SCHEMA [TABLE_SCHEMA] TO vmap_user;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].v_draw TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_point TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_line TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_poly TO vmap_user;
+GRANT SELECT, UPDATE ON SEQUENCE [TABLE_SCHEMA].seq_draw TO vmap_user;
+
+
+-- Completed on 2017-06-07 09:12:21 CEST
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/storage/veremes_oads_dossier/forms/custom.json b/storage/veremes_oads_dossier/forms/custom.json
new file mode 100755
index 0000000000000000000000000000000000000000..ae1448e7e7194b560893a1745c9c07af253b30a8
--- /dev/null
+++ b/storage/veremes_oads_dossier/forms/custom.json
@@ -0,0 +1,175 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,	
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num",
+            "author",
+            "create_date",
+            "modifier",
+            "update_date"
+          ]
+        }
+      ]
+    }
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": []
+        }
+      ]
+    }
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "datasources": {}
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/forms/default.json b/storage/veremes_oads_dossier/forms/default.json
new file mode 100755
index 0000000000000000000000000000000000000000..6c38ec4625b9209da63c12cde01665c990a9dabf
--- /dev/null
+++ b/storage/veremes_oads_dossier/forms/default.json
@@ -0,0 +1,259 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      }
+    ]
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": []
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "integer",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      }
+    ]
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "integer",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/forms/published.json b/storage/veremes_oads_dossier/forms/published.json
new file mode 100755
index 0000000000000000000000000000000000000000..7dd25b34d74901abb86a2b664e61b8e1473a4f14
--- /dev/null
+++ b/storage/veremes_oads_dossier/forms/published.json
@@ -0,0 +1,175 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num",
+            "author",
+            "create_date",
+            "modifier",
+            "update_date"
+          ]
+        }
+      ]
+    }
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": []
+        }
+      ]
+    }
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "datasources": {}
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/json/business_object.json b/storage/veremes_oads_dossier/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..77975551b01082b308ecb63c546e4f9c10e9dbca
--- /dev/null
+++ b/storage/veremes_oads_dossier/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+	"business_object_id":"veremes_oads_dossier",
+	"title":"veremes_oads_dossier",
+	"id_field":"dossier_num",
+	"database":"vmap",
+	"schema":"[TABLE_SCHEMA]",
+	"table":"dossier",
+	"sql_summary":"SELECT commune as \"Commune\", code_insee as \"Code INSEE\", type_dossier as \"Type du dossier\", dossier_num as \"Numéro du dossier\", author as \"Créateur\", create_date as \"Date de création\", modifier as \"Mise à jour\", update_date as \"Date de màj\"  FROM veremes_oads.v_dossier",
+	"sql_list":"SELECT dossier_num, code_insee, commune, division, annee_dossier, type_dossier, creation_automatique,author, create_date, modifier, update_date  FROM [TABLE_SCHEMA].v_dossier",
+	"sorted_by":"dossier_num",
+	"geom_column":"geom",
+	"search_field":"dossier_num",
+	"result_field":"dossier_num",
+	"search_use_strict":"left",
+	"event_id":null,
+	"index":2,
+	"add_form_size":1,
+	"edit_form_size":1,
+	"display_form_size":1
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/json/event.json b/storage/veremes_oads_dossier/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/storage/veremes_oads_dossier/json/event.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/json/mapserver_layers.json b/storage/veremes_oads_dossier/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..aeae16f8a4579be2be0e52b787524fa99918b2a1
--- /dev/null
+++ b/storage/veremes_oads_dossier/json/mapserver_layers.json
@@ -0,0 +1,45 @@
+[{  
+	"ms_layer_id":80,
+	"name":"Oads_dossier",
+	"title":"Oads_dossier",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"v_dossier",
+	"tableidfield":"dossier_num",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tCLASS\r\n\t\tNAME \"Dossier\"\r\n\t\tSTYLE\r\n\t\t\tCOLOR \"#FF9896\"\r\n\t\t\tOUTLINECOLOR \"#A553A5\"\r\n\t\t\tSIZE 1\r\n\t\tEND\r\n\tEND\r\nEND",
+	"active":true,
+	"opacity":70,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":null,
+	"database":"vmap",
+	"wmsservices":"",
+   "wmsservices_label":""
+},{  
+	"ms_layer_id":90,
+	"name":"Oads_dossier_type",
+	"title":"Oads_dossier_type",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"v_dossier",
+	"tableidfield":"dossier_num",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\tMAXSCALEDENOM 10000\r\n\t{COORDSYS}\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image/png\"\r\n\tEND\r\n\tFILTER ([type_dossier] = ''%type_dossier%'' or ''%type_dossier%'' = ''-1000000'')\r\n\tVALIDATION\r\n\t\t''type_dossier'' ''^[a-zA-Z0-9_|]*$''\r\n\t\t''default_type_dossier'' ''-1000000''\r\n\tEND\r\n\r\n\tCLASS\r\n\t\tNAME \"PC\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PC\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#FFC240\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"AT\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"AT\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#4E7887\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"CU\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"CU\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#129E18\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"DIA\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"DIA\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#BDB300\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"DP\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"DP\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#2E9BE8\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"PA\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PA\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#F200FF\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"PD\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PD\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#FA2525\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tEND",
+	"active":true,
+	"opacity":100,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":null,
+	"database":"vmap",
+	"wmsservices":"",
+   "wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/package.json b/storage/veremes_oads_dossier/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..e509782f3ec924bdc7d9501d8ad05c99e65b08b4
--- /dev/null
+++ b/storage/veremes_oads_dossier/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Laurent",
+	"mame": "veremes_oads_dossier",
+	"description": "Objet métier permettant la visualisation des dossiers OpenAds"
+}
diff --git a/storage/veremes_oads_dossier/sql/structure.json b/storage/veremes_oads_dossier/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..7dcd23b6b249f98b8af4beac1abedc13c7ad508d
--- /dev/null
+++ b/storage/veremes_oads_dossier/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "veremes_oads",
+	"srid": "2154",
+	"tables": ["dossier, parcelle_dossier, parcelle_oads, v_dossier, v_parcelle_dossier"],
+	"sequences": [""]
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_dossier/sql/table.sql b/storage/veremes_oads_dossier/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..463a9356cf78bfd56d30b7465e51786c7990f0b4
--- /dev/null
+++ b/storage/veremes_oads_dossier/sql/table.sql
@@ -0,0 +1,194 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.14
+-- Dumped by pg_dump version 9.5.6
+
+-- Started on 2017-06-07 09:12:15 CEST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+-- SET row_security = off;
+
+SET search_path = [TABLE_SCHEMA], public, pg_catalog;
+
+--
+-- TOC entry 452 (class 1259 OID 67429)
+-- Name: seq_draw; Type: SEQUENCE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = true;
+  
+select s_vitis.create_role_if_not_exists('oads_user', 'NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION'); 
+INSERT INTO s_vitis.privileges(rolname, description) VALUES ('oads_user', 'rôle utilisateur du module Open Ads de vMap"');
+
+CREATE TABLE [TABLE_SCHEMA].dossier
+(
+  dossier_num character varying(30) NOT NULL,
+  author character varying(50),
+  create_date date,
+  modifier character varying(50),
+  update_date date,
+  geom geometry(MultiPolygon,2154),
+  CONSTRAINT pk_dossier_num PRIMARY KEY (dossier_num),
+  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
+  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 2154)
+)
+WITH (
+  OIDS=FALSE
+);
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.author  IS 'Auteur de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.create_date  IS 'Date de création de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.modifier  IS 'Dernier modificateur de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.update_date  IS 'Date de la dernière mise à jour de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.geom  IS 'Emprise globale du dossier';
+
+
+CREATE TABLE [TABLE_SCHEMA].parcelle_dossier
+(
+  dossier_num character varying(30) NOT NULL,
+  id_par character(14) NOT NULL,
+  CONSTRAINT pk_dossier_num_id_par PRIMARY KEY (dossier_num, id_par)
+)
+WITH (
+  OIDS=FALSE
+);
+  
+   
+CREATE TABLE [TABLE_SCHEMA].parcelle_oads
+(
+  id_par character(14) NOT NULL,
+  geom geometry(MultiPolygon,2154),
+  CONSTRAINT pk_id_par PRIMARY KEY (id_par),
+  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
+  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 2154)
+)
+WITH (
+  OIDS=FALSE
+);
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.geom  IS 'geométrie de la parcelle ';
+
+CREATE TRIGGER insert_author_date_dossier
+  BEFORE INSERT
+  ON [TABLE_SCHEMA].dossier
+  FOR EACH ROW
+  EXECUTE PROCEDURE s_vitis.insert_author_date();
+
+CREATE TRIGGER update_modifier_date_dossier
+  BEFORE UPDATE
+  ON [TABLE_SCHEMA].dossier
+  FOR EACH ROW
+  EXECUTE PROCEDURE s_vitis.update_modifier_date();
+
+-- Index: [TABLE_SCHEMA].dossier_geom
+-- DROP INDEX [TABLE_SCHEMA].dossier_geom;
+
+CREATE INDEX dossier_geom
+  ON [TABLE_SCHEMA].dossier
+  USING gist
+  (geom);
+
+-- Index: [TABLE_SCHEMA].dossier_geom
+-- DROP INDEX [TABLE_SCHEMA].dossier_geom;
+
+CREATE INDEX parcelle_oads_geom
+  ON [TABLE_SCHEMA].parcelle_oads
+  USING gist
+  (geom);
+
+CREATE OR REPLACE VIEW [TABLE_SCHEMA].v_dossier AS   
+ SELECT dossier.dossier_num, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+            ELSE '50'::text
+        END AS code_insee, 
+    v_vmap_commune.nom AS commune, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 11, 1)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 12, 1)
+            ELSE NULL::text
+        END AS division, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 9, 2)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 10, 2)
+            ELSE NULL::text
+        END AS annee_dossier, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 1, 2)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 1, 3)
+            ELSE NULL::text
+        END AS type_dossier, 
+        CASE
+            WHEN dossier.author::text IS NULL THEN 'Oui'::text
+            ELSE 'Non'::text
+        END AS creation_automatique, 
+    dossier.author, dossier.create_date, dossier.modifier, dossier.update_date, 
+    dossier.geom
+   FROM [TABLE_SCHEMA].dossier
+   LEFT JOIN s_cadastre.v_vmap_commune ON 
+   CASE
+       WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+       WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+       ELSE NULL::text
+   END = v_vmap_commune.id_com::text
+  WHERE 
+   CASE
+       WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+       WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+       ELSE NULL::text
+   END ~ similar_escape(( SELECT "user".restriction
+      FROM s_vitis."user"
+     WHERE "user".login::name = "current_user"()), NULL::text)
+  ORDER BY dossier.dossier_num DESC;
+
+-- Rule: delete_v_dossier ON [TABLE_SCHEMA].v_dossier
+
+-- DROP RULE delete_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE delete_v_dossier AS
+    ON DELETE TO [TABLE_SCHEMA].v_dossier DO INSTEAD  DELETE FROM [TABLE_SCHEMA].dossier
+  WHERE dossier.dossier_num = old.dossier_num;
+
+-- Rule: insert_v_dossier ON [TABLE_SCHEMA].v_dossier
+
+-- DROP RULE insert_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE insert_v_dossier AS
+    ON INSERT TO [TABLE_SCHEMA].v_dossier DO INSTEAD  INSERT INTO [TABLE_SCHEMA].dossier ( dossier_num, author, create_date, geom)
+  VALUES (new.dossier_num, "current_user"()::text, 'now'::text::date, new.geom);
+
+-- Rule: update_v_dossier ON [TABLE_SCHEMA].v_dossier
+-- DROP RULE update_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE update_v_dossier AS
+    ON UPDATE TO [TABLE_SCHEMA].v_dossier DO INSTEAD  UPDATE [TABLE_SCHEMA].dossier SET geom = new.geom
+  WHERE dossier.dossier_num = new.dossier_num;
+  
+
+ALTER TABLE [TABLE_SCHEMA].dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].dossier TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].parcelle_dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].parcelle_dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].parcelle_dossier TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].parcelle_oads OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].parcelle_oads TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].parcelle_oads TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].v_dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].v_dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].v_dossier TO oads_user;
+	
+	
+	
diff --git a/storage/veremes_oads_parcelle/json/business_object.json b/storage/veremes_oads_parcelle/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..0b13c041db3596b2abd17c3ad5991a9410baa822
--- /dev/null
+++ b/storage/veremes_oads_parcelle/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+	"business_object_id":"veremes_oads_parcelle",
+	"title":"veremes_oads_parcelle",
+	"id_field":"id_par",
+	"database":"vitis_angular_vmap",
+	"schema":"veremes_oads",
+	"table":"v_parcelle_dossier",
+	"sql_summary":"select id_par as \"Parcelle\", dossier as \"Dossier\", '[bo_link href=\"{{getPropertie(''serveur_oads'')}}'||lien_dossier||'\" target=\"_blank\"]Lien vers OpenAds[/bo_link]' as \"OpenAds\" from veremes_oads.v_parcelle_dossier",
+	"sql_list":"select id_par from veremes_oads.v_parcelle_dossier",
+	"sorted_by":"id_par",
+	"geom_column":"geom",
+	"search_field":"id_par",
+	"result_field":"id_par",
+	"search_use_strict":"false",
+	"event_id":"",
+	"index":1,
+	"add_form_size":1,
+	"edit_form_size":1,
+	"display_form_size":1
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_parcelle/json/event.json b/storage/veremes_oads_parcelle/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/storage/veremes_oads_parcelle/json/event.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/storage/veremes_oads_parcelle/json/mapserver_layers.json b/storage/veremes_oads_parcelle/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..3fcc08f190c6bb79528b1cbca39d63b357b763cd
--- /dev/null
+++ b/storage/veremes_oads_parcelle/json/mapserver_layers.json
@@ -0,0 +1,23 @@
+[{  
+	"ms_layer_id":91,
+	"name":"Oads_parcelle",
+	"title":"Oads_parcelle",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"parcelle_oads",
+	"tableidfield":"id_par",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image/png\"\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dossier\"\r\n\t\tSTYLE\r\n\t\t\tCOLOR \"#FED4FE\"\r\n\tOPACITY 50\r\n\t\tEND\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tWIDTH 5\r\n\t\tEND\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR \"#FF0000\"\r\n\t\t\tWIDTH 4\r\n\t\t\tLINECAP butt #[butt|round|square|triangle]\r\n\t\t\tLINEJOIN miter #[round|miter|bevel]\r\n\t\t\tLINEJOINMAXSIZE 2\r\n\t\t\tPATTERN 10 10 END\r\n\t\tEND\r\n\tEND\r\nEND",
+	"active":true,
+	"opacity":100,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":"",
+	"database":"vmap",
+	"wmsservices":"",
+	"wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/storage/veremes_oads_parcelle/package.json b/storage/veremes_oads_parcelle/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..461fcecdd13e7a4fb59d955713e58c571d7e39d1
--- /dev/null
+++ b/storage/veremes_oads_parcelle/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Laurent",
+	"mame": "veremes_oads_parcelle",
+	"description": "Objet métier permettant la visualisation des parcelles d'un dossier OpenAds"
+}
diff --git a/storage/veremes_oads_parcelle/sql/structure.json b/storage/veremes_oads_parcelle/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..5eb29353e070d15f766bc882dc5d45efbcf6e55f
--- /dev/null
+++ b/storage/veremes_oads_parcelle/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "",
+	"srid": "",
+	"tables": [""],
+	"sequences": [""]
+}
\ No newline at end of file
diff --git a/storage/veremes_oads_parcelle/sql/table.sql b/storage/veremes_oads_parcelle/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/web_service/class/majic_lib/CHANGE_LOG.txt b/web_service/class/majic_lib/CHANGE_LOG.txt
deleted file mode 100755
index 39048bfeabdf4b48d273be99b7e2596b028b4617..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/CHANGE_LOG.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
-              +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-              +                                                                                   +
-              +                   VEREMES - changelog de Majic_lib		                  +
-              +                                                                                   +
-              +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-__________________________________________________________________________________________________________________
-|b4379|NOUVEAUTE   |RELEASE| VERSION 2011.1 Rajout du champ TAXE AD qui correspond aux taxes additionnelles sur les parcelles. Cette mise à jour s'applique sur la version 2011 applicable sur les données 2012 
-|
diff --git a/web_service/class/majic_lib/Mj.class.inc b/web_service/class/majic_lib/Mj.class.inc
deleted file mode 100755
index 3d3138d68fb4512845b4024127d4f1016acb7daf..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj.class.inc
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-
-/**
- * \file Mj.class.inc
- * \brief Mj.class.inc \n \n Ce fichier contient la classe php Mj.
- * 
- * Cette classe est une classe virtuelle qui peut �tre appel� par les autres classes de la librairie majic_lib par h�ritage.
- *
- * \author Damien Bedel <damien.bedel@veremes.com>
- * \author Olivier Gayte <olivier.gayte@veremes.com>
- */
-/**
- * \class Mj
- * \brief Mj Class \n \n Mj est une classe PHP.
- * 
- * Cette classe permet de retourner un objet de s�lection dans une table sous la forme d'un tableau HTML.
- *
- * \author Damien Bedel
- * \author Olivier Gayte <olivier.gayte@veremes.com>
- */
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/class/vitis_lib/XmlAbstract.class.inc";
-
-class Mj extends XmlAbstract {
-
-    /**
-     * Requ�te SQL de s�lection dans la table.
-     */
-    var $sSql;
-
-    /**
-     * Statut de l'objet cr�e lors de la requ�te. 1 si erreur; 0 si l'objet a pu �tre instanci�.
-     */
-    var $sStatus = 0;
-
-    /**
-     * Message d'erreur.
-     */
-    var $sMessage;
-
-    /**
-     * Nom du fichier SQL.
-     */
-    var $sRessourcesFile = 'Mj.sql.inc';
-
-    /**
-     * Clef de cryptage
-     */
-    var $sEncryptKey = '';
-
-    /**
-     * Clef de cryptage
-     */
-    var $bAllSuf = false;
-
-    /**
-     * Cette m�thode permet de retourner un code d'erreur en fonction du statut de l'objet r�sultant de la s�lection.
-     * \return Retourne 1 s'il y a une erreur, 0 si ok.
-     */
-    function isError() {
-        if ($this->sStatus == 1) {
-            return 1;
-        } else {
-            return 0;
-        }
-    }
-
-    /**
-     * Cette m�thode permet de renvoyer un message d'erreur.
-     * \return Retourne une cha�ne de caract�res.
-     */
-    function getMessage() {
-        return $this->sMessage;
-    }
-
-    function encrypt($cleartext) {
-        if ($this->sEncryptKey != '') {
-            if (empty($cleartext) || USE_ENCRYPTION == false) {
-                return $cleartext;
-            }
-            $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
-            $key = substr($this->sEncryptKey, 0, mcrypt_enc_get_key_size($cipher));
-            $iv = '00000000';
-
-            // add the padding.
-            $cleartext_length = strlen($cleartext) % 8;
-            for ($i = $cleartext_length; $i < 8; $i++) {
-                $cleartext .= chr(8 - $cleartext_length);
-            }
-
-            $ciphertext = '';
-            // 128-bit Blowfish encryption:
-            if (mcrypt_generic_init($cipher, $key, $iv) != - 1) {
-                // PHP pads with NULL bytes if $cleartext IS NOT a multiple of the block size ..
-                if (empty($cleartext)) {
-                    return '';
-                }
-                $ciphertext = mcrypt_generic($cipher, $cleartext);
-                mcrypt_generic_deinit($cipher);
-            }
-
-            return base64_encode($ciphertext);
-        } else {
-            return $cleartext;
-        }
-    }
-
-    function getObjects($sClasse) {
-        $aObjClass = array();
-        foreach ($this->aObjects as $oObj) {
-            if (get_class($oObj) == $sClasse) {
-                array_push($aObjClass, $oObj);
-            }
-        }
-        return $aObjClass;
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj.sql.inc b/web_service/class/majic_lib/Mj.sql.inc
deleted file mode 100755
index 2038a07fe68af9e0da67e66cc4b6ed3a8324afad..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj.sql.inc
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-$aSql['pgsql']['proprietaire']= 'SELECT "ID_DNUPRO" as id_dnupro, "DNUPRO" as "dnupro", "ID_PRO" as id_pro, "L_CCODRO" as l_ccodro, "L_CCODEM" as l_ccodem, "DNUPER" as dnuper, "DQUALP" as dqualp, "DDENOM" as ddenom, "DNOMLP" as dnomlp, "DPRNLP" as dprnlp, "EPXNEE" as epxnee, "DNOMCP" as dnomcp, "DPRNCP" as dprncp, "JDATNSS" as jdatnss, "DLDNSS" as dldnss, "DLIGN3" as dlign3, "DLIGN4" as dlign4, "DLIGN5" as dlign5, "DLIGN6" as dlign6, "GTOPER" as gtoper FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."tc_CCODRO_code_droit" ON "PROPRIETAIRE_COURANT"."CCODRO"="tc_CCODRO_code_droit"."CCODRO" LEFT JOIN majic."tc_CCODEM_Nature_demembrement" ON "PROPRIETAIRE_COURANT"."CCODEM"="tc_CCODEM_Nature_demembrement"."CCODEM" WHERE "ID_DNUPRO"=\'$sIdDnupro\' AND "ID_PRO"=\'$sIdPro\'';
-$aSql['pgsql']['bati'] = 'SELECT "FANTOIR_COMMUNE"."LIBCOM" as libcom, "BATI_A00_IDENT_LOCAL"."DNBNIV" as dnbniv,"BATI_A00_IDENT_LOCAL"."JDATAT" as jdatat, "BATI_A00_IDENT_LOCAL"."JANNAT" as jannat,"BATI_A00_IDENT_LOCAL"."DNATLC" as dnatlc, "BATI_A00_IDENT_LOCAL"."ID_DNUPRO" as b_iddnupro, "BATI_A00_IDENT_LOCAL"."DNUPRO" as b_dnupro, "BATI_A00_IDENT_LOCAL"."ID_BAT" as id_bat, "BATI_A00_IDENT_LOCAL"."DTELOC" as dteloc, "tc_DTELOC_Type_local"."L_DTELOC" as dteloc, "BATI_A00_IDENT_LOCAL"."DVLTRT" as dvltrt, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "CCOPLC" as ccoplc, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DNUBAT" as dnubat, "DESC" as desc, "DNIV" as dniv, "DPOR" as dpor, "BATI_A00_IDENT_LOCAL"."INVAR" as invar, "CCOEVA" as ccoeva, "BATI_A00_IDENT_LOCAL"."CCONLC" as cconlc, "L_CCONLC" AS lib_cconlc, "DVLPERA" as dvlpera, "GTAUOM" as gtauom, "CCONAD" as cconad, "LOT_LOCAL"."ID_BAT" as Local_id_bat,	"LOT_LOCAL"."DNUMQL" as dnumql,	"LOT_LOCAL"."DDENQL" as ddenql FROM majic."BATI_A00_IDENT_LOCAL" LEFT JOIN majic."BATI_A60_DESCR_DEPEND" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A60_DESCR_DEPEND"."ID_BAT" LEFT JOIN majic."BATI_A21_DESCR_PEV" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A21_DESCR_PEV"."ID_BAT"  LEFT JOIN majic."tc_DTELOC_Type_local" ON "BATI_A00_IDENT_LOCAL"."DTELOC"="tc_DTELOC_Type_local"."DTELOC" LEFT JOIN majic."LOT_LOCAL" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="LOT_LOCAL"."ID_BAT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "BATI_A00_IDENT_LOCAL"."CCOCOM"="FANTOIR_COMMUNE"."CCOCOM" LEFT JOIN majic."tc_CCONLC_Nature_local" ON "BATI_A00_IDENT_LOCAL"."CCONLC"="tc_CCONLC_Nature_local"."CCONLC" WHERE "BATI_A00_IDENT_LOCAL"."ID_BAT"=\'$sIdBat\' ORDER BY "CCOSEC","DNUPLA","BATI_A00_IDENT_LOCAL"."INVAR"';
-$aSql['pgsql']['habit_descr'] = 'SELECT "DNUPEV" as dnupev, "INVAR" as invar, "CCONAD1" as cconad1, "CCONAD2" as cconad2, "CCONAD3" as cconad3, "CCONAD4" as cconad4,"DSUEIC1" as dsueic1, "DSUEIC2" as dsueic2, "DSUEIC3" as dsueic3, "DSUEIC4" as dsueic4, "GEAULC" as geaulc, "GELELC" as gelelc, "GESCLC" as gesclc, "GGAZLC" as ggazlc, "GASCLC" as gasclc, "GCHCLC" as gchclc, "GVORLC" as gvorlc, "GTEGLC" as gteglc, "DNBBAI" as dnbbai, "DNBDOU" as dnbdou, "DNBLAV" as dnblav, "DNBWC" as dnbwc, "DNBPPR" as dnbppr, "DNBSAM" as dnbsam, "DNBCHA" as dnbcha, "DNBCU8" as dnbcu8, "DNBCU9" as dnbcu9, "DNBSEA" as dnbsea, "DNBANN" as dnbann, "DNBPDC" as dnbpdc, "DSUPDC" as dsupdc, "DMATGM" as dmatgm, "DMATTO" as dmatto, "JANNAT" as jannat, "DETENT" as detent, "DNBNIV" as dnbniv FROM majic."BATI_A40_DESCR_HABIT" WHERE "ID_PEV"=\'$sIdPev\' AND "DNUDES"=\'$sDnudes\'';
-$aSql['pgsql']['depend_descr'] = 'SELECT "DNUDES" as dnudes, "DNUPEV" as dnupev, "INVAR" as invar, "BATI_A60_DESCR_DEPEND"."CCONAD" as cconad, "tc_CCONAD_Nature_dependance"."L_CCONAD" AS l_cconad, "DSUDEP" as dsudep, "DCIMLC" as dcimlc, "GEAULC" as geaulc, "GEAULC" as geaulc, "GELELC" as gelelc, "GCHCLC" as gchclc, "DNBBAI" as dnbbai, "DNBDOU" as dnbdou, "DNBLAV" as dnblav, "DNBWC" as dnbwc, "DMATGM" as dmatgm, "DMATTO" as dmatto, "DETENT" as detent FROM majic."BATI_A60_DESCR_DEPEND" INNER JOIN majic."tc_CCONAD_Nature_dependance" ON "BATI_A60_DESCR_DEPEND"."CCONAD"="tc_CCONAD_Nature_dependance"."CCONAD" WHERE "ID_DEP"=\'$sIdDep\'';
-$aSql['pgsql']['prof_descr'] = 'SELECT "DNUDES" as dnudes, "DNUPEV" as dnupev, "INVAR" as invar, "VSURZT" as vsurzt  FROM majic."BATI_A50_DESCR_PROF" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['pgsql']['pev'] = 'SELECT "BATI_A21_DESCR_PEV"."ID_PEV" as id_pev, "CCOSTB" as ccostb, "CCOAFF" as ccoaff, "DCAPEC" as dcapec, "DCSGLC" as dcsglc, "BIPEVLA1" as bipevla1, "GNEXPL" as gnexpl, "DVLPERA" as dvlpera, "BATI_A21_DESCR_PEV"."DNUPEV" as dnupev, "BATI_A21_DESCR_PEV"."DVLPER" as dvlper, "BATI_A21_DESCR_PEV"."DNUREF" as dnuref FROM majic."BATI_A21_DESCR_PEV" LEFT JOIN majic."BATI_A36_TAXATION_PEV" ON "BATI_A21_DESCR_PEV"."ID_PEV"="BATI_A36_TAXATION_PEV"."ID_PEV" WHERE "BATI_A21_DESCR_PEV"."ID_PEV"=\'$sIdPev\'';
-$aSql['pgsql']['parcelle']='SELECT "ID_PAR" as id_par, "JDATAT" as jdatat,"CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib,"TYPEVOIE" as typevoie,"CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf, "DCNTPA" as dcntpa, "DNUPRO" as dnupro , "GPARBAT" as gparbat FROM majic."NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN majic."FANTOIR_VOIE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_RIVOLI"="FANTOIR_VOIE"."ID_RIVOLI" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['suf']='SELECT "DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"ID_SUF" as id_suf,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub,"NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub FROM majic."NON_BATI_A21_DESCR_SUF" LEFT JOIN majic."tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['pgsql']['suf_bnd']='SELECT DISTINCT "ID_SUF" as id_suf,"DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub,"NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub, "NON_BATI_A21_DESCR_SUF"."DNUPDL" AS dnupdl, "NON_BATI_A21_DESCR_SUF"."DNULOT" AS dnulot, "DNUMQL" AS dnumql, "DDENQL" AS ddenql FROM (majic."NON_BATI_A21_DESCR_SUF" LEFT JOIN majic."tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF") LEFT JOIN majic."LOT_A30_DESCR_LOT" ON "LOT_A30_DESCR_LOT"."KLOT"="NON_BATI_A21_DESCR_SUF"."KLOT_" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['pgsql']['suf_dnupro']='SELECT "NON_BATI_A21_DESCR_SUF"."DNUPRO" as dnupro FROM majic."NON_BATI_A10_DESCR_PARCELLE" RIGHT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['pgsql']['compte_communal']='SELECT "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "PROPRIETAIRE_COURANT"."CCOCOM" as ccocom, "LIBCOM" as libcom, "DNUPRO" as dnupro, "ID_DNUPRO" as id_dnupro FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['pgsql']['bati_parcelle']='SELECT "ID_PAR" as id_par, "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "PROPRIETAIRE_COURANT"."CCOCOM" as ccocom, "LIBCOM" as libcom, "PROPRIETAIRE_COURANT"."DNUPRO" as dnupro, "PROPRIETAIRE_COURANT"."ID_DNUPRO" as id_dnupro, "NON_BATI_A10_DESCR_PARCELLE"."DNVOIRI" as dnvoiri, "NON_BATI_A10_DESCR_PARCELLE"."DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib, "DCNTPA" AS dcntpa FROM majic."NON_BATI_A10_DESCR_PARCELLE" INNER JOIN majic."PROPRIETAIRE_COURANT" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_DNUPRO"="PROPRIETAIRE_COURANT"."ID_DNUPRO" LEFT JOIN majic."FANTOIR_COMMUNE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_PAR"=\'sIdPar\'';
-$aSql['pgsql']['exone_pev']='SELECT "ID_EX" as id_ex, "CCOLLOC" as ccolloc, "GNEXTL" as gnextl, "JANIMP" as janimp, "JANDEB" as jandeb, "RCEXBA2" as rcexba2, "PEXB" as pexb FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_EX"=\'$sIdEx\'';
-$aSql['pgsql']['exon_suf']='SELECT "ID_SUF" as id_suf, "RNUEXN" as rnuexn, "CCOLLOC" as ccolloc, "GNEXTS" as gnexts, "JFINEX" as jfinex, "PEXN" as pexn,"RCEXNBA" as rcexnba FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' and "RNUEXN"=\'$sRnuexn\'';
-$aSql['pgsql']['lot_local']='SELECT "ID_BAT" as id_bat, "KLOT" as klot, "DNUPDL" as dnupdl, "DNULOT" as dnulot, "DNUMQL" as dnumql, "DDENQL" as ddenql FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' and "KLOT"=\'$sKlot\'';
-$aSql['pgsql']['get_id_pev']='SELECT "ID_PEV" as id_pev FROM majic."BATI_A21_DESCR_PEV" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "ID_PEV"';
-$aSql['pgsql']['get_id_ex_pev']='SELECT "ID_EX" as id_ex FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_PEV"=\'$sIdPev\' ORDER BY "ID_EX"';
-$aSql['pgsql']['get_id_descr_hab']='SELECT "DNUDES" as dnudes, "ID_PEV" as id_pev FROM majic."BATI_A40_DESCR_HABIT" WHERE "ID_PEV"=\'$sIdPev\' ORDER BY "DNUDES"';
-$aSql['pgsql']['get_id_descr_depend']='SELECT "ID_DEP" as id_dep FROM majic."BATI_A60_DESCR_DEPEND" WHERE "ID_PEV"=\'$sIdPev\' ORDER BY "ID_DEP"';
-$aSql['pgsql']['get_klot']='SELECT "KLOT" as klot FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "KLOT"';
-$aSql['pgsql']['get_id_suf']='SELECT "ID_SUF" as id_suf FROM majic."NON_BATI_A10_DESCR_PARCELLE" RIGHT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE ("NON_BATI_A10_DESCR_PARCELLE"."DNUPRO"=\'sDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\') AND "NON_BATI_A21_DESCR_SUF"."ID_PAR"=\'sIdPar\' AND ("NON_BATI_A10_DESCR_PARCELLE"."ID_DNUPRO"=\'sIdDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\')';
-$aSql['pgsql']['get_rnuexn']='SELECT DISTINCT "RNUEXN" as rnuexn FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' ORDER BY "RNUEXN"';
-$aSql['pgsql']['get_id_pro']='SELECT DISTINCT "ID_PRO" as id_pro FROM majic."PROPRIETAIRE_COURANT" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "ID_PRO"';
-$aSql['pgsql']['get_id_bat']='SELECT "ID_BAT" as id_bat FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "ID_BAT"';
-$aSql['pgsql']['get_id_par']='SELECT DISTINCT "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR" as id_par FROM majic."NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE ("NON_BATI_A10_DESCR_PARCELLE"."DNUPRO"=\'sDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\') AND "NON_BATI_A21_DESCR_SUF"."ID_COM"=\'sIdCom\' ORDER BY "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"';
-$aSql['pgsql']['get_id_par_bnd']='SELECT "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR" as "id_par" FROM majic."NON_BATI_A21_DESCR_SUF" INNER JOIN majic."NON_BATI_A10_DESCR_PARCELLE" ON "NON_BATI_A21_DESCR_SUF"."ID_PAR" = "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR" WHERE "NON_BATI_A21_DESCR_SUF"."DNUPRO" = \'sDnupro\' AND "NON_BATI_A10_DESCR_PARCELLE"."ID_DNUPRO" != \'sIdDnupro\' AND "NON_BATI_A10_DESCR_PARCELLE"."ID_COM"=\'sIdCom\'';
-$aSql['pgsql']['get_par_id_bat']='SELECT "ID_BAT" as id_bat FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_PAR"=\'sIdPar\' ORDER BY "ID_BAT"';
-$aSql['pgsql']['annee_reference']='SELECT "ANNEE" FROM majic."ANNEE_REFERENCE"';
-$aSql['pgsql']['get_id_dnupro']='SELECT "ID_DNUPRO" as iddnupro, "DNUPRO" as dnupro FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'idparpro\'';
-$aSql['pgsql']['compte_communal_parcelle']='SELECT "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "LIBDEP" as libdep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "PROPRIETAIRE_COURANT"."CCOCOM" as ccocom, "LIBCOM" as libcom, "PROPRIETAIRE_COURANT". "DNUPRO" as dnupro,"PROPRIETAIRE_COURANT"."ID_DNUPRO" as id_dnupro, "ID_PAR" as id_par FROM majic."NON_BATI_A10_DESCR_PARCELLE", majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" LEFT JOIN majic."FANTOIR_DIRECTION" ON "FANTOIR_COMMUNE"."CCODEP"= "FANTOIR_DIRECTION"."CCODEP" WHERE "PROPRIETAIRE_COURANT"."ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['get_id_bat_parcelle']='SELECT "ID_BAT" as id_bat FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\' ORDER BY "ID_BAT"';
-/*$aSql['pgsql']['emprise']['bati']='SELECT "ID_PAR" as id_par, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf, "DCNTPA" as dcntpa, "DNUPRO" as dnupro FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['emprise']['pos']='SELECT "ID_PAR" as id_par, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf, "DCNTPA" as dcntpa, "DNUPRO" as dnupro FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['emprise']['plu']='SELECT "ID_PAR" as id_par, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf, "DCNTPA" as dcntpa, "DNUPRO" as dnupro FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'$sIdPar\'';
-*/
-
-
-
-
-
-
-
-
-
-$aSql['oci']['proprietaire']= 'SELECT "ID_DNUPRO" as "id_dnupro", "DNUPRO" as "dnupro", "ID_PRO" as "id_pro", "L_CCODRO" as "l_ccodro", "L_CCODEM" as "l_ccodem", "DNUPER" as "dnuper", "DQUALP" as "dqualp", "DDENOM" as "ddenom", "DNOMLP" as "dnomlp", "DPRNLP" as "dprnlp", "EPXNEE" as "epxnee", "DNOMCP" as "dnomcp", "DPRNCP" as "dprncp", TO_CHAR("JDATNSS" , \'DD/MM/YYYY\') as "jdatnss", "DLDNSS" as "dldnss", "DLIGN3" as "dlign3", "DLIGN4" as "dlign4", "DLIGN5" as "dlign5", "DLIGN6" as "dlign6", "GTOPER" as "gtoper" FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."tc_CCODRO_code_droit" ON "PROPRIETAIRE_COURANT"."CCODRO"="tc_CCODRO_code_droit"."CCODRO" LEFT JOIN majic."tc_CCODEM_Nature_demembrement" ON "PROPRIETAIRE_COURANT"."CCODEM"="tc_CCODEM_Nature_demembrement"."CCODEM" WHERE "ID_DNUPRO"=\'$sIdDnupro\' AND "ID_PRO"=\'$sIdPro\'';
-$aSql['oci']['bati'] = 'SELECT "FANTOIR_COMMUNE"."LIBCOM" as "libcom", "BATI_A00_IDENT_LOCAL"."DNBNIV" as "dnbniv", TO_CHAR("BATI_A00_IDENT_LOCAL"."JDATAT" , \'DD/MM/YYYY\') as "jdatat", "BATI_A00_IDENT_LOCAL"."JANNAT" as "jannat","BATI_A00_IDENT_LOCAL"."DNATLC" as "dnatlc", "BATI_A00_IDENT_LOCAL"."ID_DNUPRO" as "b_iddnupro", "BATI_A00_IDENT_LOCAL"."DNUPRO" as "b_dnupro", "BATI_A00_IDENT_LOCAL"."ID_BAT" as "id_bat", "BATI_A00_IDENT_LOCAL"."DTELOC" as "dteloc", "tc_DTELOC_Type_local"."L_DTELOC" as "dteloc", "BATI_A00_IDENT_LOCAL"."DVLTRT" as "dvltrt", "CCOSEC" as "ccosec", "DNUPLA" as "dnupla", "CCOPLC" as "ccoplc", "DNVOIRI" as "dnvoiri", "DINDIC" as "dindic", "DVOILIB" as "dvoilib", "CCORIV" as "ccoriv", "DNUBAT" as "dnubat", "DESC" as "desc", "DNIV" as "dniv", "DPOR" as "dpor", "BATI_A00_IDENT_LOCAL"."INVAR" as "invar", "CCOEVA" as "ccoeva", "tc_CCONLC_Nature_local"."CCONLC" as "cconlc","DVLPERA" as "dvlpera", "GTAUOM" as "gtauom", "CCONAD" as "cconad", "LOT_LOCAL"."ID_BAT" as "Local_id_bat","LOT_LOCAL"."DNUMQL" as "dnumql","LOT_LOCAL"."DDENQL" as "ddenql", "L_CCONLC" AS "lib_cconlc" FROM majic."BATI_A00_IDENT_LOCAL" LEFT JOIN majic."BATI_A60_DESCR_DEPEND" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A60_DESCR_DEPEND"."ID_BAT" LEFT JOIN majic."BATI_A21_DESCR_PEV" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A21_DESCR_PEV"."ID_BAT"  LEFT JOIN majic."tc_DTELOC_Type_local" ON "BATI_A00_IDENT_LOCAL"."DTELOC"="tc_DTELOC_Type_local"."DTELOC" left join majic."LOT_LOCAL" on "BATI_A00_IDENT_LOCAL"."ID_BAT" ="LOT_LOCAL"."ID_BAT" left join majic."FANTOIR_COMMUNE" on "BATI_A00_IDENT_LOCAL"."ID_COM" ="FANTOIR_COMMUNE"."ID_COM" LEFT JOIN majic."tc_CCONLC_Nature_local" ON "BATI_A00_IDENT_LOCAL"."CCONLC"="tc_CCONLC_Nature_local"."CCONLC"  WHERE "BATI_A00_IDENT_LOCAL"."ID_BAT"=\'$sIdBat\' ORDER BY "CCOSEC","DNUPLA","BATI_A00_IDENT_LOCAL"."INVAR"';
-$aSql['oci']['habit_descr'] = 'SELECT "DNUPEV" as "dnupev", "INVAR" as "invar", "CCONAD1" as "cconad1", "CCONAD2" as "cconad2", "CCONAD3" as "cconad3", "CCONAD4" as "cconad4","DSUEIC1" as "dsueic1", "DSUEIC2" as "dsueic2", "DSUEIC3" as "dsueic3", "DSUEIC4" as "dsueic4", "GEAULC" as "geaulc", "GELELC" as "gelelc", "GESCLC" as "gesclc", "GGAZLC" as "ggazlc", "GASCLC" as "gasclc", "GCHCLC" as "gchclc", "GVORLC" as "gvorlc", "GTEGLC" as "gteglc", "DNBBAI" as "dnbbai", "DNBDOU" as "dnbdou", "DNBLAV" as "dnblav", "DNBWC" as "dnbwc", "DNBPPR" as "dnbppr", "DNBSAM" as "dnbsam", "DNBCHA" as "dnbcha", "DNBCU8" as "dnbcu8", "DNBCU9" as "dnbcu9", "DNBSEA" as "dnbsea", "DNBANN" as "dnbann", "DNBPDC" as "dnbpdc", "DSUPDC" as "dsupdc", "tc_DMATGM_materiaux_gros_murs"."DMATGM" as "dmatgm", "tc_DMATTO_materiaux_toitures"."DMATTO" as "dmatto", "JANNAT" as "jannat", "BATI_A40_DESCR_HABIT"."DETENT" as "detent", "L_DETENT" as "l_detent", "DNBNIV" as "dnbniv", "tc_DMATGM_materiaux_gros_murs"."L_DMATGM" as "lib_dmatgm", "tc_DMATTO_materiaux_toitures"."L_DMATTO" as "lib_dmatto" FROM majic."BATI_A40_DESCR_HABIT" LEFT JOIN majic."tc_DETENT_Etat_entretien" ON "BATI_A40_DESCR_HABIT"."DETENT"="tc_DETENT_Etat_entretien"."DETENT" LEFT JOIN majic."tc_DMATGM_materiaux_gros_murs" ON "BATI_A40_DESCR_HABIT"."DMATGM"="tc_DMATGM_materiaux_gros_murs"."DMATGM" LEFT JOIN majic."tc_DMATTO_materiaux_toitures" ON "BATI_A40_DESCR_HABIT"."DMATTO"="tc_DMATTO_materiaux_toitures"."DMATTO" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['oci']['depend_descr'] = 'SELECT "DNUDES" as "dnudes", "DNUPEV" as "dnupev", "INVAR" as "invar", "CCONAD" as "cconad", "DSUDEP" as "dsudep", "DCIMLC" as "dcimlc", "GEAULC" as "geaulc", "GEAULC" as "geaulc", "GELELC" as "gelelc", "GCHCLC" as "gchclc", "DNBBAI" as "dnbbai", "DNBDOU" as "dnbdou", "DNBLAV" as "dnblav", "DNBWC" as "dnbwc", "tc_DMATGM_materiaux_gros_murs"."DMATGM" as "dmatgm", "tc_DMATTO_materiaux_toitures"."DMATTO" as "dmatto", "BATI_A60_DESCR_DEPEND"."DETENT" as "detent", "L_DETENT" as "l_detent", "tc_DMATGM_materiaux_gros_murs"."L_DMATGM" as "lib_dmatgm", "tc_DMATTO_materiaux_toitures"."L_DMATTO" as "lib_dmatto"  FROM majic."BATI_A60_DESCR_DEPEND" LEFT JOIN majic."tc_DETENT_Etat_entretien" ON "BATI_A60_DESCR_DEPEND"."DETENT"="tc_DETENT_Etat_entretien"."DETENT" LEFT JOIN majic."tc_DMATGM_materiaux_gros_murs" ON "BATI_A60_DESCR_DEPEND"."DMATGM"="tc_DMATGM_materiaux_gros_murs"."DMATGM" LEFT JOIN majic."tc_DMATTO_materiaux_toitures" ON "BATI_A60_DESCR_DEPEND"."DMATTO"="tc_DMATTO_materiaux_toitures"."DMATTO" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['oci']['prof_descr'] = 'SELECT "DNUDES" as "dnudes", "DNUPEV" as "dnupev", "INVAR" as "invar", "VSURZT" as "vsurzt"  FROM majic."BATI_A50_DESCR_PROF" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['oci']['pev'] = 'SELECT  "BATI_A21_DESCR_PEV"."ID_PEV" as "id_pev", "CCOSTB" as "ccostb", "BATI_A21_DESCR_PEV"."CCOAFF" as "ccoaff", "L_CCOAFF" as "l_ccoaff", "DCAPEC" as "dcapec", "DCSGLC" as "dcsglc", "BIPEVLA1" as "bipevla1", "BATI_A21_DESCR_PEV"."GNEXPL" as "gnexpl", "L_GNEXPL" as "l_gnexpl", "DVLPERA" as "dvlpera", "BATI_A21_DESCR_PEV"."DNUPEV" as "dnupev", "BATI_A21_DESCR_PEV"."DVLPER" as "dvlper", "BATI_A21_DESCR_PEV"."DNUREF" as "dnuref" FROM majic."BATI_A21_DESCR_PEV" LEFT JOIN majic."tc_CCOAFF_Affectation_pev" ON "BATI_A21_DESCR_PEV"."CCOAFF"="tc_CCOAFF_Affectation_pev"."CCOAFF" LEFT JOIN majic."tc_GNEXPL_Exone_permanente" ON "BATI_A21_DESCR_PEV"."GNEXPL"="tc_GNEXPL_Exone_permanente"."GNEXPL" LEFT JOIN majic."BATI_A36_TAXATION_PEV" ON "BATI_A21_DESCR_PEV"."ID_PEV"="BATI_A36_TAXATION_PEV"."ID_PEV" WHERE "BATI_A21_DESCR_PEV"."ID_PEV"=\'$sIdPev\'';
-$aSql['oci']['parcelle']='SELECT "ID_PAR" as "id_par", "JDATAT" as "jdatat","CCOSEC" as "ccosec", "DNUPLA" as "dnupla", "DNVOIRI" as "dnvoiri", "DINDIC" as "dindic", "CODEVOIE" as "codevoie", "LIBVOIE" as "libvoie","TYPEVOIE" as "typevoie","CCORIV" as "ccoriv", "DPARPI" as "dparpi", "GPARNF" as "gparnf", Ltrim(TO_CHAR(DCNTPA, \'000000000\')) as "dcntpa", "DNUPRO" as "dnupro" , "GPARBAT" as "gparbat", "GURBPA" as "gurbpa" FROM majic."NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN majic."FANTOIR_VOIE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_RIVOLI"="FANTOIR_VOIE"."ID_RIVOLI" WHERE "ID_PAR"=\'$sIdPar\' ORDER BY "CCOSEC","DNUPLA"';
-$aSql['oci']['suf']='SELECT "DNUPRO" as "dnupro","NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"ID_SUF" as "id_suf","GNEXPS" as "gnexps","CCOSTN" as "ccostn","CCOSUB" as "ccosub","NON_BATI_A21_DESCR_SUF"."DSGRPF" as "dsgrpf","L_DSGRPF" as "l_dsgrpf", "DCLSSF" as "dclssf", "CNATSP" as "cnatsp", Ltrim(TO_CHAR(DCNTSF, \'000000000\')) as "dcntsf","DRCSUBA" as "drcsuba", "DRCSUB" as "drcsub","NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM majic."NON_BATI_A21_DESCR_SUF" LEFT JOIN majic."tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" LEFT JOIN majic."tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['oci']['suf_bnd']='SELECT DISTINCT "ID_SUF" as "id_suf","NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"DNUPRO" as "dnupro","GNEXPS" as "gnexps","CCOSTN" as "ccostn","CCOSUB" as "ccosub","NON_BATI_A21_DESCR_SUF"."DSGRPF" as "dsgrpf","L_DSGRPF" as "l_dsgrpf", "DCLSSF" as "dclssf", "CNATSP" as "cnatsp", Ltrim(TO_CHAR(DCNTSF, \'000000000\')) as "dcntsf","DRCSUBA" as "drcsuba", "DRCSUB" as "drcsub", "NON_BATI_A21_DESCR_SUF"."DNUPDL" AS "dnupdl", "NON_BATI_A21_DESCR_SUF"."DNULOT" AS "dnulot", "DNUMQL" AS "dnumql", "DDENQL" AS "ddenql","NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM (majic."NON_BATI_A21_DESCR_SUF" LEFT JOIN majic."tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF") LEFT JOIN majic."tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" LEFT JOIN majic."LOT_A30_DESCR_LOT" ON "LOT_A30_DESCR_LOT"."KLOT"="NON_BATI_A21_DESCR_SUF"."KLOT_" WHERE "ID_SUF"=\'$sIdSuf\' AND "DNUPRO" = \'sIdDnupro\'';
-$aSql['oci']['suf_bnd_all']='SELECT DISTINCT "ID_SUF" as id_suf,"DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub, "NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub, "DNUPDL" AS dnupdl, "DNULOT" AS dnulot, "DNUMQL" AS dnumql, "DDENQL" AS ddenql, "NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" LEFT JOIN "tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['oci']['suf_dnupro']='SELECT "NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "dnupro" FROM majic."NON_BATI_A10_DESCR_PARCELLE" RIGHT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['oci']['compte_communal']='SELECT "PROPRIETAIRE_COURANT"."CCODEP" as "ccodep", "PROPRIETAIRE_COURANT"."CCODIR" as "ccodir", "PROPRIETAIRE_COURANT"."CCOCOM" as "ccocom", "LIBCOM" as "libcom", "DNUPRO" as "dnupro", "ID_DNUPRO" as "id_dnupro" FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['oci']['exone_pev']='SELECT "ID_EX" as "id_ex", "CCOLLOC" as "ccolloc", "GNEXTL" as "gnextl", "JANIMP" as "janimp", "JANDEB" as "jandeb", "RCEXBA2" as "rcexba2", "PEXB" as "pexb" FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_EX"=\'$sIdEx\'';
-$aSql['oci']['exon_suf']='SELECT "ID_SUF" as "id_suf", "RNUEXN" as "rnuexn", "CCOLLOC" as "ccolloc", "GNEXTS" as "gnexts", "JFINEX" as "jfinex", "PEXN" as "pexn","RCEXNBA" as "rcexnba" FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_PAR"=(substr(\'$sIdSuf\',0,15)) AND CCOSUB=(substr(\'$sIdSuf\',16)) and "RNUEXN"=\'$sRnuexn\'';
-$aSql['oci']['lot_local']='SELECT "ID_BAT" as "id_bat", "KLOT" as "klot", "DNUPDL" as "dnupdl", "DNULOT" as "dnulot", "DNUMQL" as "dnumql", "DDENQL" as "ddenql" FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' and "KLOT"=\'$sKlot\'';
-$aSql['oci']['get_id_pev']='SELECT "ID_PEV" as "id_pev" FROM majic."BATI_A21_DESCR_PEV" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "ID_PEV"';
-$aSql['oci']['get_id_ex_pev']='SELECT "ID_EX" as "id_ex" FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_PEV"=\'$sIdPev\' ORDER BY "ID_EX"';
-$aSql['oci']['get_klot']='SELECT "KLOT" as "klot" FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "KLOT"';
-$aSql['oci']['get_id_suf']='SELECT "ID_SUF" as "id_suf" FROM majic."WS_NON_BATI_A10_DESCR_PARCELLE" RIGHT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "WS_NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE ("WS_NON_BATI_A10_DESCR_PARCELLE"."DNUPRO"=\'sIdDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\') AND "NON_BATI_A21_DESCR_SUF"."ID_PAR"=\'sIdPar\' AND ("NON_BATI_A10_DESCR_PARCELLE"."ID_DNUPRO"=\'sIdDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\')';
-$aSql['oci']['get_rnuexn']='SELECT DISTINCT "RNUEXN" as "rnuexn" FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_PAR"=(substr(\'$sIdSuf\',0,15)) AND CCOSUB=(substr(\'$sIdSuf\',16)) ORDER BY "RNUEXN"';
-$aSql['oci']['get_id_pro']='SELECT DISTINCT "ID_PRO" as "id_pro", "DNUPER" FROM majic."PROPRIETAIRE_COURANT" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "DNUPER"';
-$aSql['oci']['get_id_bat']='SELECT "ID_BAT" as "id_bat" FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "ID_BAT"';
-$aSql['oci']['get_id_par']='SELECT DISTINCT "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR" as "id_par" FROM majic."NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN majic."NON_BATI_A21_DESCR_SUF" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE ("NON_BATI_A10_DESCR_PARCELLE"."DNUPRO"=\'sDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\') AND "NON_BATI_A21_DESCR_SUF"."ID_COM"=\'sIdCom\' ORDER BY "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"';
-$aSql['oci']['get_id_par_bnd']='SELECT NON_BATI_A10_DESCR_PARCELLE.ID_PAR as "id_par" FROM NON_BATI_A21_DESCR_SUF INNER JOIN NON_BATI_A10_DESCR_PARCELLE ON NON_BATI_A21_DESCR_SUF.ID_PAR = NON_BATI_A10_DESCR_PARCELLE.ID_PAR where NON_BATI_A21_DESCR_SUF.DNUPRO = \'sDnupro\' AND NON_BATI_A10_DESCR_PARCELLE.ID_DNUPRO != \'sIdDnupro\' AND NON_BATI_A10_DESCR_PARCELLE."ID_COM"=\'sIdCom\'';
-$aSql['oci']['annee_reference']='SELECT "ANNEE" FROM majic."ANNEE_REFERENCE"';
-$aSql['oci']['get_id_dnupro']='SELECT "ID_DNUPRO" as "iddnupro", "DNUPRO" as "dnupro" FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'idparpro\'';
-$aSql['oci']['compte_communal_parcelle']='SELECT "FANTOIR_COMMUNE"."CODE_INSEE" as "codeinsee","PROPRIETAIRE_COURANT"."CCODEP" as "ccodep", "LIBDEP" as "libdep", "PROPRIETAIRE_COURANT"."CCODIR" as "ccodir", "FANTOIR_COMMUNE"."CCOCOM" as "ccocom", "LIBCOM" as "libcom", "PROPRIETAIRE_COURANT"."DNUPRO" as "dnupro","PROPRIETAIRE_COURANT"."ID_DNUPRO" as "id_dnupro", "ID_PAR" as "id_par" FROM majic."NON_BATI_A10_DESCR_PARCELLE", majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" LEFT JOIN majic."FANTOIR_DIRECTION" ON "FANTOIR_COMMUNE"."CCODEP"= "FANTOIR_DIRECTION"."CCODEP" WHERE "PROPRIETAIRE_COURANT"."ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\'';
-$aSql['oci']['get_id_bat_parcelle']='SELECT "ID_BAT" as "id_bat" FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\' ORDER BY "ID_BAT"';
-$aSql['oci']['get_par_id_bat']='SELECT "ID_BAT" as "id_bat" FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_PAR"=\'sIdPar\' ORDER BY "ID_BAT"';
-$aSql['oci']['pos_plu']='SELECT p.GGCODEIDENT, cos, ces, type, hauteur, libelle, SDO_GEOM.SDO_AREA (SDO_GEOM.SDO_INTERSECTION(z.GEOM, p.GEOM, 0.005),0.005) surface  FROM exp_pos.zpos_simpl z RIGHT join cadastre.parcelle_cadastrale_mixee p  ON SDO_RELATE (z.geom,p.geom, \'mask=CONTAINS+INSIDE+OVERLAPBDYINTERSECT+COVERS+COVEREDBY+EQUAL querytype=WINDOW\') = \'TRUE\'  AND z.codcom =p.codcom WHERE z.OBJECTID = \'$sObjectId\' AND p.PAR_ID = \'$sIdPar\' AND p.codcom = \'$sCodCom\' and SDO_GEOM.SDO_AREA (SDO_GEOM.SDO_INTERSECTION(z.GEOM, p.GEOM, 0.005),0.005) >2';
-$aSql['oci']['get_id_pos_plu']='SELECT z.OBJECTID  FROM exp_pos.zpos_simpl z, cadastre.parcelle_cadastrale_mixee p  WHERE SDO_RELATE (z.geom,p.geom, \'mask=CONTAINS+INSIDE+OVERLAPBDYINTERSECT+COVERS+COVEREDBY+EQUAL querytype=WINDOW`\') = \'TRUE\'  AND z.codcom=p.codcom AND p.PAR_ID = \'$sIdPar\' AND p.codcom = \'$sCodCom\'';
-$aSql['oci']['get_codcom']='SELECT NON_BATI_A10_DESCR_PARCELLE.CODE_INSEE FROM MAJIC.NON_BATI_A10_DESCR_PARCELLE WHERE (NON_BATI_A10_DESCR_PARCELLE.ID_PAR =\'$sIdPar\')';
-
-
-
-
-
-
-
-
-
-$aSql['sqlite']['proprietaire']= 'SELECT "ID_DNUPRO" as id_dnupro, "DNUPRO" as "dnupro", "ID_PRO" as id_pro, "L_CCODRO" as l_ccodro, "L_CCODEM" as l_ccodem, "DNUPER" as dnuper, "DQUALP" as dqualp, "DDENOM" as ddenom, "DNOMLP" as dnomlp, "DPRNLP" as dprnlp, "EPXNEE" as epxnee, "DNOMCP" as dnomcp, "DPRNCP" as dprncp, "JDATNSS" as jdatnss, "DLDNSS" as dldnss, "DLIGN3" as dlign3, "DLIGN4" as dlign4, "DLIGN5" as dlign5, "DLIGN6" as dlign6, "GTOPER" as gtoper FROM "PROPRIETAIRE_COURANT" LEFT JOIN "tc_CCODRO_code_droit" ON "PROPRIETAIRE_COURANT"."CCODRO"="tc_CCODRO_code_droit"."CCODRO" LEFT JOIN "tc_CCODEM_Nature_demembrement" ON "PROPRIETAIRE_COURANT"."CCODEM"="tc_CCODEM_Nature_demembrement"."CCODEM" WHERE "ID_DNUPRO"=\'$sIdDnupro\' AND "ID_PRO"=\'$sIdPro\'';
-//modif pas faites sur autre database
-$aSql['sqlite']['bati'] = 'SELECT "FANTOIR_COMMUNE"."LIBCOM" as libcom, "BATI_A00_IDENT_LOCAL"."DNBNIV" as dnbniv,"BATI_A00_IDENT_LOCAL"."JDATAT" as jdatat, "BATI_A00_IDENT_LOCAL"."JANNAT" as jannat,"BATI_A00_IDENT_LOCAL"."DNATLC" as dnatlc, "BATI_A00_IDENT_LOCAL"."ID_DNUPRO" as b_iddnupro, "BATI_A00_IDENT_LOCAL"."DNUPRO" as b_dnupro, "BATI_A00_IDENT_LOCAL"."ID_BAT" as id_bat, "BATI_A00_IDENT_LOCAL"."DTELOC" as dteloc, "tc_DTELOC_Type_local"."L_DTELOC" as dteloc, "BATI_A00_IDENT_LOCAL"."DVLTRT" as dvltrt, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "CCOPLC" as ccoplc, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DNUBAT" as dnubat, "DESC" as desc, "DNIV" as dniv, "DPOR" as dpor, "BATI_A00_IDENT_LOCAL"."INVAR" as invar, "CCOEVA" as ccoeva, "tc_CCONLC_Nature_local"."CCONLC" as cconlc,"DVLPERA" as dvlpera, "GTAUOM" as gtauom, "CCONAD" as cconad, "LOT_LOCAL"."ID_BAT" as Local_id_bat,"LOT_LOCAL"."DNUMQL" as dnumql,"LOT_LOCAL"."DDENQL" as ddenql, "L_CCONLC" AS lib_cconlc FROM "BATI_A00_IDENT_LOCAL" LEFT JOIN "BATI_A60_DESCR_DEPEND" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A60_DESCR_DEPEND"."ID_BAT" LEFT JOIN "BATI_A21_DESCR_PEV" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A21_DESCR_PEV"."ID_BAT"  LEFT JOIN "tc_DTELOC_Type_local" ON "BATI_A00_IDENT_LOCAL"."DTELOC"="tc_DTELOC_Type_local"."DTELOC" left join "LOT_LOCAL" on "BATI_A00_IDENT_LOCAL"."ID_BAT" ="LOT_LOCAL"."ID_BAT" left join "FANTOIR_COMMUNE" on "BATI_A00_IDENT_LOCAL"."CCOCOM" ="FANTOIR_COMMUNE"."CCOCOM" LEFT JOIN "tc_CCONLC_Nature_local" ON "BATI_A00_IDENT_LOCAL"."CCONLC"="tc_CCONLC_Nature_local"."CCONLC"  WHERE "BATI_A00_IDENT_LOCAL"."ID_BAT"=\'$sIdBat\' ORDER BY "CCOSEC","DNUPLA","BATI_A00_IDENT_LOCAL"."INVAR"';
-$aSql['sqlite']['habit_descr'] = 'SELECT "DNUPEV" as dnupev, "INVAR" as invar, "CCONAD1" as cconad1, "CCONAD2" as cconad2, "CCONAD3" as cconad3, "CCONAD4" as cconad4,"DSUEIC1" as dsueic1, "DSUEIC2" as dsueic2, "DSUEIC3" as dsueic3, "DSUEIC4" as dsueic4, "GEAULC" as geaulc, "GELELC" as gelelc, "GESCLC" as gesclc, "GGAZLC" as ggazlc, "GASCLC" as gasclc, "GCHCLC" as gchclc, "GVORLC" as gvorlc, "GTEGLC" as gteglc, "DNBBAI" as dnbbai, "DNBDOU" as dnbdou, "DNBLAV" as dnblav, "DNBWC" as dnbwc, "DNBPPR" as dnbppr, "DNBSAM" as dnbsam, "DNBCHA" as dnbcha, "DNBCU8" as dnbcu8, "DNBCU9" as dnbcu9, "DNBSEA" as dnbsea, "DNBANN" as dnbann, "DNBPDC" as dnbpdc, "DSUPDC" as dsupdc, "tc_DMATGM_materiaux_gros_murs"."DMATGM" as "dmatgm", "tc_DMATTO_materiaux_toitures"."DMATTO" as "dmatto", "JANNAT" as jannat, "BATI_A40_DESCR_HABIT"."DETENT" as detent, "L_DETENT" as l_detent, "DNBNIV" as dnbniv, "tc_DMATGM_materiaux_gros_murs"."L_DMATGM" as "lib_dmatgm", "tc_DMATTO_materiaux_toitures"."L_DMATTO" FROM "BATI_A40_DESCR_HABIT" LEFT JOIN "tc_DETENT_Etat_entretien" ON "BATI_A40_DESCR_HABIT"."DETENT"="tc_DETENT_Etat_entretien"."DETENT" LEFT JOIN "tc_DMATGM_materiaux_gros_murs" ON "BATI_A40_DESCR_HABIT"."DMATGM"="tc_DMATGM_materiaux_gros_murs"."DMATGM" LEFT JOIN "tc_DMATTO_materiaux_toitures" ON "BATI_A40_DESCR_HABIT"."DMATTO"="tc_DMATTO_materiaux_toitures"."DMATTO" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['sqlite']['depend_descr'] = 'SELECT "DNUDES" as dnudes, "DNUPEV" as dnupev, "INVAR" as invar, "CCONAD" as cconad, "DSUDEP" as dsudep, "DCIMLC" as dcimlc, "GEAULC" as geaulc, "GEAULC" as geaulc, "GELELC" as gelelc, "GCHCLC" as gchclc, "DNBBAI" as dnbbai, "DNBDOU" as dnbdou, "DNBLAV" as dnblav, "DNBWC" as dnbwc, "tc_DMATGM_materiaux_gros_murs"."DMATGM" as "dmatgm", "tc_DMATTO_materiaux_toitures"."DMATTO" as "dmatto", "BATI_A60_DESCR_DEPEND"."DETENT" as detent, "L_DETENT" as l_detent, "tc_DMATGM_materiaux_gros_murs"."L_DMATGM" as "lib_dmatgm", "tc_DMATTO_materiaux_toitures"."L_DMATTO" as "lib_dmatto" FROM "BATI_A60_DESCR_DEPEND" LEFT JOIN "tc_DETENT_Etat_entretien" ON "BATI_A60_DESCR_DEPEND"."DETENT"="tc_DETENT_Etat_entretien"."DETENT" LEFT JOIN "tc_DMATGM_materiaux_gros_murs" ON "BATI_A60_DESCR_DEPEND"."DMATGM"="tc_DMATGM_materiaux_gros_murs"."DMATGM" LEFT JOIN "tc_DMATTO_materiaux_toitures" ON "BATI_A60_DESCR_DEPEND"."DMATTO"="tc_DMATTO_materiaux_toitures"."DMATTO" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['sqlite']['prof_descr'] = 'SELECT "DNUDES" as dnudes, "DNUPEV" as dnupev, "INVAR" as invar, "VSURZT" as vsurzt  FROM "BATI_A50_DESCR_PROF" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['sqlite']['pev'] = 'SELECT  "BATI_A21_DESCR_PEV"."ID_PEV" as id_pev, "CCOSTB" as ccostb, "BATI_A21_DESCR_PEV"."CCOAFF" as ccoaff, "L_CCOAFF" as "l_ccoaff", "DCAPEC" as dcapec, "DCSGLC" as dcsglc, "BIPEVLA1" as bipevla1, "BATI_A21_DESCR_PEV"."GNEXPL" as gnexpl, "L_GNEXPL" as "l_gnexpl", "DVLPERA" as dvlpera, "BATI_A21_DESCR_PEV"."DNUPEV" as dnupev, "BATI_A21_DESCR_PEV"."DVLPER" as dvlper, "BATI_A21_DESCR_PEV"."DNUREF" as dnuref FROM "BATI_A21_DESCR_PEV" LEFT JOIN "tc_CCOAFF_Affectation_pev" ON "BATI_A21_DESCR_PEV"."CCOAFF"="tc_CCOAFF_Affectation_pev"."CCOAFF" LEFT JOIN "tc_GNEXPL_Exone_permanente" ON "BATI_A21_DESCR_PEV"."GNEXPL"="tc_GNEXPL_Exone_permanente"."GNEXPL" LEFT JOIN "BATI_A36_TAXATION_PEV" ON "BATI_A21_DESCR_PEV"."ID_PEV"="BATI_A36_TAXATION_PEV"."ID_PEV"  WHERE "BATI_A21_DESCR_PEV"."ID_PEV"=\'$sIdPev\'';
-//fin modif
-$aSql['sqlite']['parcelle']='SELECT "ID_PAR" as id_par, "JDATAT" as jdatat,"CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CODEVOIE" as codevoie, "LIBVOIE" as libvoie,"TYPEVOIE" as typevoie,"CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf, "DCNTPA" as dcntpa, "DNUPRO" as dnupro , "GPARBAT" as gparbat FROM "NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN "FANTOIR_VOIE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_RIVOLI"="FANTOIR_VOIE"."ID_RIVOLI" WHERE "ID_PAR"=\'$sIdPar\' ORDER BY "CCOSEC","DNUPLA"';
-//modif
-$aSql['sqlite']['suf']='SELECT DISTINCT "DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"ID_SUF" as id_suf,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub,"NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub, "NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" LEFT JOIN "tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['sqlite']['suf_bnd']='SELECT DISTINCT "ID_SUF" as id_suf,"DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub, "NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub, "DNUPDL" AS dnupdl, "DNULOT" AS dnulot, "DNUMQL" AS dnumql, "DDENQL" AS ddenql, "NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" LEFT JOIN "tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" WHERE "ID_SUF"=\'$sIdSuf\' AND "DNUPRO" = \'sIdDnupro\'';
-$aSql['sqlite']['suf_bnd_all']='SELECT DISTINCT "ID_SUF" as id_suf,"DNUPRO" as dnupro,"NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as "id_dnupro" ,"GNEXPS" as gnexps,"CCOSTN" as ccostn,"CCOSUB" as ccosub, "NON_BATI_A21_DESCR_SUF"."DSGRPF" as dsgrpf,"L_DSGRPF" as l_dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf,"DRCSUBA" as drcsuba, "DRCSUB" as drcsub, "DNUPDL" AS dnupdl, "DNULOT" AS dnulot, "DNUMQL" AS dnumql, "DDENQL" AS ddenql, "NON_BATI_A21_DESCR_SUF"."CGRNUM" as "cgrnum", "L_CGRNUM" as "l_cgrnum" FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "tc_DSGRPF_SousGroupe_suf" ON "NON_BATI_A21_DESCR_SUF"."DSGRPF" = "tc_DSGRPF_SousGroupe_suf"."DSGRPF" LEFT JOIN "tc_CGRNUM_Groupe_numerique" ON "NON_BATI_A21_DESCR_SUF"."CGRNUM" = "tc_CGRNUM_Groupe_numerique"."CGRNUM" WHERE "ID_SUF"=\'$sIdSuf\'';
-//fin modif
-$aSql['sqlite']['compte_communal']='SELECT "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "PROPRIETAIRE_COURANT"."CCOCOM" as ccocom, "LIBCOM" as libcom, "DNUPRO" as dnupro, "ID_DNUPRO" as id_dnupro FROM "PROPRIETAIRE_COURANT" LEFT JOIN "FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['sqlite']['exone_pev']='SELECT "ID_EX" as id_ex, "CCOLLOC" as ccolloc, "GNEXTL" as gnextl, "JANIMP" as janimp, "JANDEB" as jandeb, "RCEXBA2" as rcexba2, "PEXB" as pexb FROM "BATI_A30_EXONE_PEV" WHERE "ID_EX"=\'$sIdEx\'';
-$aSql['sqlite']['exon_suf']='SELECT "ID_SUF" as id_suf, "RNUEXN" as rnuexn, "CCOLLOC" as ccolloc, "GNEXTS" as gnexts, "JFINEX" as jfinex, "PEXN" as pexn,"RCEXNBA" as rcexnba FROM "NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' and "RNUEXN"=\'$sRnuexn\'';
-$aSql['sqlite']['lot_local']='SELECT "ID_BAT" as id_bat, "KLOT" as klot, "DNUPDL" as dnupdl, "DNULOT" as dnulot, "DNUMQL" as dnumql, "DDENQL" as ddenql FROM "LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' and "KLOT"=\'$sKlot\'';
-$aSql['sqlite']['get_id_pev']='SELECT "ID_PEV" as id_pev FROM "BATI_A21_DESCR_PEV" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "ID_PEV"';
-$aSql['sqlite']['get_id_ex_pev']='SELECT "ID_EX" as id_ex FROM "BATI_A30_EXONE_PEV" WHERE "ID_PEV"=\'$sIdPev\' ORDER BY "ID_EX"';
-$aSql['sqlite']['get_klot']='SELECT "KLOT" as klot FROM "LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' ORDER BY "KLOT"';
-//modif
-$aSql['sqlite']['get_id_suf']='SELECT DISTINCT "ID_SUF" as id_suf FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "NON_BATI_A10_DESCR_PARCELLE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE "NON_BATI_A21_DESCR_SUF"."ID_PAR"=\'sIdPar\' AND ("NON_BATI_A10_DESCR_PARCELLE"."ID_DNUPRO"=\'sIdDnupro\' OR "NON_BATI_A21_DESCR_SUF"."DNUPRO"=\'sDnupro\')';
-$aSql['sqlite']['suf_dnupro']='SELECT "NON_BATI_A21_DESCR_SUF"."CCODEP" || "NON_BATI_A21_DESCR_SUF"."CCOCOM" || "NON_BATI_A21_DESCR_SUF"."DNUPRO" as dnupro FROM "NON_BATI_A21_DESCR_SUF" LEFT JOIN "NON_BATI_A10_DESCR_PARCELLE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"="NON_BATI_A21_DESCR_SUF"."ID_PAR" WHERE "ID_SUF"=\'$sIdSuf\'';
-//fin modif
-$aSql['sqlite']['get_rnuexn']='SELECT DISTINCT "RNUEXN" as rnuexn FROM "NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' ORDER BY "RNUEXN"';
-$aSql['sqlite']['get_id_pro']='SELECT DISTINCT "ID_PRO" as id_pro FROM "PROPRIETAIRE_COURANT" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "ID_PRO"';
-$aSql['sqlite']['get_id_bat']='SELECT "ID_BAT" as id_bat FROM "BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' ORDER BY "ID_BAT"';
-$aSql['sqlite']['get_id_par']='SELECT "ID_PAR" as id_par FROM "NON_BATI_A10_DESCR_PARCELLE" WHERE  "ID_COM"=\'sIdCom\' AND "ID_DNUPRO"=\'sDnupro\' ORDER BY "NON_BATI_A10_DESCR_PARCELLE"."ID_PAR"';
-$aSql['sqlite']['get_id_par_bnd']='SELECT NON_BATI_A10_DESCR_PARCELLE.ID_PAR as "id_par" FROM NON_BATI_A21_DESCR_SUF INNER JOIN NON_BATI_A10_DESCR_PARCELLE ON NON_BATI_A21_DESCR_SUF.ID_PAR = NON_BATI_A10_DESCR_PARCELLE.ID_PAR where NON_BATI_A21_DESCR_SUF.DNUPRO = \'sDnupro\' AND NON_BATI_A10_DESCR_PARCELLE.ID_DNUPRO != \'sIdDnupro\' AND NON_BATI_A10_DESCR_PARCELLE."ID_COM"=\'sIdCom\'';
-$aSql['sqlite']['annee_reference']='SELECT "ANNEE" FROM "ANNEE_REFERENCE"';
-$aSql['sqlite']['get_id_dnupro']='SELECT "ID_DNUPRO" as iddnupro, "DNUPRO" as dnupro FROM "NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'idparpro\'';
-$aSql['sqlite']['compte_communal_parcelle']='SELECT "FANTOIR_COMMUNE"."CODE_INSEE" as "codeinsee", "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "LIBDEP" as libdep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "FANTOIR_COMMUNE"."CCOCOM" as ccocom, "LIBCOM" as libcom, "PROPRIETAIRE_COURANT". "DNUPRO" as dnupro,"PROPRIETAIRE_COURANT"."ID_DNUPRO" as id_dnupro, "ID_PAR" as id_par FROM "NON_BATI_A10_DESCR_PARCELLE", "PROPRIETAIRE_COURANT" LEFT JOIN "FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" LEFT JOIN "FANTOIR_DIRECTION" ON "FANTOIR_COMMUNE"."CCODEP"= "FANTOIR_DIRECTION"."CCODEP" WHERE "PROPRIETAIRE_COURANT"."ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\'';
-$aSql['sqlite']['get_id_bat_parcelle']='SELECT "ID_BAT" as id_bat FROM "BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\' and "ID_PAR"=\'$sIdPar\' ORDER BY "ID_BAT"';
-$aSql['sqlite']['get_par_id_bat']='SELECT "ID_BAT" as id_bat FROM "BATI_A00_IDENT_LOCAL" WHERE "ID_PAR"=\'sIdPar\' ORDER BY "ID_BAT"';
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj.sql_all.inc b/web_service/class/majic_lib/Mj.sql_all.inc
deleted file mode 100755
index 1f63bdf05a4596e8e4e00c493efe95fa12b9758d..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj.sql_all.inc
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-$aSql['pgsql']['proprietaire']= 'SELECT *, "ID_DNUPRO" as id_dnupro, "ID_PRO" as id_pro, "L_CCODRO" as l_ccodro, "L_CCODEM" as l_ccodem, "DNUPER" as dnuper, "DQUALP" as dqualp, "DDENOM" as ddenom, "DNOMLP" as dnomlp, "DPRNLP" as dprnlp, "EPXNEE" as epxnee, "DNOMCP" as dnomcp, "DPRNCP" as dprncp, "JDATNSS" as jdatnss, "DLDNSS" as dldnss, "DLIGN3" as dlign3, "DLIGN4" as dlign4, "DLIGN5" as dlign5, "DLIGN6" as dlign6 FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."tc_CCODRO_code_droit" ON "PROPRIETAIRE_COURANT"."CCODRO"="tc_CCODRO_code_droit"."CCODRO" LEFT JOIN majic."tc_CCODEM_Nature_demembrement" ON "PROPRIETAIRE_COURANT"."CCODEM"="tc_CCODEM_Nature_demembrement"."CCODEM" WHERE "ID_DNUPRO"=\'$sIdDnupro\' AND "ID_PRO"=\'$sIdPro\'';
-$aSql['pgsql']['bati'] = 'SELECT *, "BATI_A00_IDENT_LOCAL"."ID_BAT" as id_bat, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "CCOPLC" as ccoplc, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DNUBAT" as dnubat, "DESC" as desc, "DNIV" as dniv, "DPOR" as dpor, "BATI_A00_IDENT_LOCAL"."INVAR" as invar, "CCOEVA" as ccoeva, "CCONLC" as cconlc, "GTAUOM" as gtauom, "CCONAD" as cconad FROM majic."BATI_A00_IDENT_LOCAL" LEFT JOIN majic."BATI_A60_DESCR_DEPEND" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A60_DESCR_DEPEND"."ID_BAT" WHERE "BATI_A00_IDENT_LOCAL"."ID_BAT"=\'$sIdBat\'';
-$aSql['pgsql']['pev'] = 'SELECT  *, "BATI_A21_DESCR_PEV"."ID_PEV" as id_pev, "CCOSTB" as ccostb, "CCOAFF" as ccoaff, "DCAPEC" as dcapec, "DCSGLC" as dcsglc, "BIPEVLA1" as bipevla1,"GNEXPL" as gnexpl, "DVLPERA" as dvlpera, "BATI_A21_DESCR_PEV"."DNUPEV" as dnupev FROM majic."BATI_A21_DESCR_PEV" LEFT JOIN majic."BATI_A36_TAXATION_PEV" ON "BATI_A21_DESCR_PEV"."ID_PEV"="BATI_A36_TAXATION_PEV"."ID_PEV" WHERE "BATI_A21_DESCR_PEV"."ID_PEV"=\'$sIdPev\'';
-$aSql['pgsql']['parcelle']='SELECT *, "ID_PAR" as id_par, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CCONVO" as cconvo, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['suf']='SELECT *, "ID_SUF" as id_suf, "CCOSTN" as ccostn, "CCOSUB" as ccosub, "DSGRPF" as dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf, "DRCSUBA" as drcsuba FROM majic."NON_BATI_A21_DESCR_SUF" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['pgsql']['compte_communal']='SELECT *, "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "FANTOIR_COMMUNE"."CCOCOM" as ccocom, "LIBCOM" as libcom, "DNUPRO" as dnupro, "ID_DNUPRO" as id_dnupro FROM majic."PROPRIETAIRE_COURANT" LEFT JOIN majic."FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['pgsql']['exone_pev']='SELECT *, "ID_EX" as id_ex, "CCOLLOC" as ccolloc, "GNEXTL" as gnextl, "JANIMP" as janimp, "JANDEB" as jandeb, "RCEXBA2" as rcexba2 FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_EX"=\'$sIdEx\'';
-$aSql['pgsql']['exon_suf']='SELECT *, "ID_SUF" as id_suf, "RNUEXN" as rnuexn, "CCOLLOC" as ccolloc, "GNEXTS" as gnexts, "JFINEX" as jfinex, "PEXN" as pexn FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' and "RNUEXN"=\'$sRnuexn\'';
-$aSql['pgsql']['lot_local']='SELECT *, "ID_BAT" as id_bat, "KLOT" as klot, "DNUPDL" as dnupdl, "DNULOT" as dnulot, "DNUMQL" as dnumql, "DDENQL" as ddenql FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' and "KLOT"=\'$sKlot\'';
-$aSql['pgsql']['get_id_pev']='SELECT "ID_PEV" as id_pev FROM majic."BATI_A21_DESCR_PEV" WHERE "ID_BAT"=\'$sIdBat\'';
-$aSql['pgsql']['get_id_ex_pev']='SELECT "ID_EX" as id_ex FROM majic."BATI_A30_EXONE_PEV" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['pgsql']['get_klot']='SELECT "KLOT" as klot FROM majic."LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\'';
-$aSql['pgsql']['get_id_suf']='SELECT "ID_SUF" as id_suf FROM majic."NON_BATI_A21_DESCR_SUF" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['pgsql']['get_rnuexn']='SELECT "RNUEXN" as rnuexn FROM majic."NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['pgsql']['get_id_pro']='SELECT "ID_PRO" as id_pro FROM majic."PROPRIETAIRE_COURANT" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['pgsql']['get_id_bat']='SELECT "ID_BAT" as id_bat FROM majic."BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['pgsql']['get_id_par']='SELECT "ID_PAR" as id_par FROM majic."NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-
-$aSql['sqlite']['proprietaire']= 'SELECT *, "ID_DNUPRO" as id_dnupro, "ID_PRO" as id_pro, "L_CCODRO" as l_ccodro, "L_CCODEM" as l_ccodem, "DNUPER" as dnuper, "DQUALP" as dqualp, "DDENOM" as ddenom, "DNOMLP" as dnomlp, "DPRNLP" as dprnlp, "EPXNEE" as epxnee, "DNOMCP" as dnomcp, "DPRNCP" as dprncp, "JDATNSS" as jdatnss, "DLDNSS" as dldnss, "DLIGN3" as dlign3, "DLIGN4" as dlign4, "DLIGN5" as dlign5, "DLIGN6" as dlign6 FROM "PROPRIETAIRE_COURANT" LEFT JOIN "tc_CCODRO_code_droit" ON "PROPRIETAIRE_COURANT"."CCODRO"="tc_CCODRO_code_droit"."CCODRO" LEFT JOIN "tc_CCODEM_Nature_demembrement" ON "PROPRIETAIRE_COURANT"."CCODEM"="tc_CCODEM_Nature_demembrement"."CCODEM" WHERE "ID_DNUPRO"=\'$sIdDnupro\' AND "ID_PRO"=\'$sIdPro\'';
-$aSql['sqlite']['bati'] = 'SELECT *, "BATI_A00_IDENT_LOCAL"."ID_BAT" as id_bat, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "CCOPLC" as ccoplc, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "DVOILIB" as dvoilib, "CCORIV" as ccoriv, "DNUBAT" as dnubat, "DESC" as desc, "DNIV" as dniv, "DPOR" as dpor, "BATI_A00_IDENT_LOCAL"."INVAR" as invar, "CCOEVA" as ccoeva, "CCONLC" as cconlc, "GTAUOM" as gtauom, "CCONAD" as cconad FROM "BATI_A00_IDENT_LOCAL" LEFT JOIN "BATI_A60_DESCR_DEPEND" ON "BATI_A00_IDENT_LOCAL"."ID_BAT"="BATI_A60_DESCR_DEPEND"."ID_BAT" WHERE "BATI_A00_IDENT_LOCAL"."ID_BAT"=\'$sIdBat\'';
-$aSql['sqlite']['pev'] = 'SELECT  *, "BATI_A21_DESCR_PEV"."ID_PEV" as id_pev, "CCOSTB" as ccostb, "CCOAFF" as ccoaff, "DCAPEC" as dcapec, "DCSGLC" as dcsglc, "BIPEVLA1" as bipevla1,"GNEXPL" as gnexpl, "DVLPERA" as dvlpera, "BATI_A21_DESCR_PEV"."DNUPEV" as dnupev FROM "BATI_A21_DESCR_PEV" LEFT JOIN "BATI_A36_TAXATION_PEV" ON "BATI_A21_DESCR_PEV"."ID_PEV"="BATI_A36_TAXATION_PEV"."ID_PEV" WHERE "BATI_A21_DESCR_PEV"."ID_PEV"=\'$sIdPev\'';
-$aSql['sqlite']['parcelle']='SELECT *, "ID_PAR" as id_par, "JDATAT" as jdatat, "CCOSEC" as ccosec, "DNUPLA" as dnupla, "DNVOIRI" as dnvoiri, "DINDIC" as dindic, "CODEVOIE" as codevoie, "LIBVOIE" as libvoie, "CCORIV" as ccoriv, "DPARPI" as dparpi, "GPARNF" as gparnf FROM "NON_BATI_A10_DESCR_PARCELLE" LEFT JOIN "FANTOIR_VOIE" ON "NON_BATI_A10_DESCR_PARCELLE"."ID_RIVOLI"="FANTOIR_VOIE"."ID_RIVOLI" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['sqlite']['suf']='SELECT *, "ID_SUF" as id_suf, "CCOSTN" as ccostn, "CCOSUB" as ccosub, "DSGRPF" as dsgrpf, "DCLSSF" as dclssf, "CNATSP" as cnatsp, "DCNTSF" as dcntsf, "DRCSUBA" as drcsuba FROM "NON_BATI_A21_DESCR_SUF" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['sqlite']['compte_communal']='SELECT *, "PROPRIETAIRE_COURANT"."CCODEP" as ccodep, "PROPRIETAIRE_COURANT"."CCODIR" as ccodir, "FANTOIR_COMMUNE"."CCOCOM" as ccocom, "LIBCOM" as libcom, "DNUPRO" as dnupro, "ID_DNUPRO" as id_dnupro FROM "PROPRIETAIRE_COURANT" LEFT JOIN "FANTOIR_COMMUNE" ON "PROPRIETAIRE_COURANT"."ID_COM"="FANTOIR_COMMUNE"."ID_COM" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['sqlite']['exone_pev']='SELECT *, "ID_EX" as id_ex, "CCOLLOC" as ccolloc, "GNEXTL" as gnextl, "JANIMP" as janimp, "JANDEB" as jandeb, "RCEXBA2" as rcexba2 FROM "BATI_A30_EXONE_PEV" WHERE "ID_EX"=\'$sIdEx\'';
-$aSql['sqlite']['exon_suf']='SELECT *, "ID_SUF" as id_suf, "RNUEXN" as rnuexn, "CCOLLOC" as ccolloc, "GNEXTS" as gnexts, "JFINEX" as jfinex, "PEXN" as pexn FROM "NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\' and "RNUEXN"=\'$sRnuexn\'';
-$aSql['sqlite']['lot_local']='SELECT *, "ID_BAT" as id_bat, "KLOT" as klot, "DNUPDL" as dnupdl, "DNULOT" as dnulot, "DNUMQL" as dnumql, "DDENQL" as ddenql FROM "LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\' and "KLOT"=\'$sKlot\'';
-$aSql['sqlite']['get_id_pev']='SELECT "ID_PEV" as id_pev FROM "BATI_A21_DESCR_PEV" WHERE "ID_BAT"=\'$sIdBat\'';
-$aSql['sqlite']['get_id_ex_pev']='SELECT "ID_EX" as id_ex FROM "BATI_A30_EXONE_PEV" WHERE "ID_PEV"=\'$sIdPev\'';
-$aSql['sqlite']['get_klot']='SELECT "KLOT" as klot FROM "LOT_LOCAL" WHERE "ID_BAT"=\'$sIdBat\'';
-$aSql['sqlite']['get_id_suf']='SELECT "ID_SUF" as id_suf FROM "NON_BATI_A21_DESCR_SUF" WHERE "ID_PAR"=\'$sIdPar\'';
-$aSql['sqlite']['get_rnuexn']='SELECT "RNUEXN" as rnuexn FROM "NON_BATI_A30_EXON_SUF" WHERE "ID_SUF"=\'$sIdSuf\'';
-$aSql['sqlite']['get_id_pro']='SELECT "ID_PRO" as id_pro FROM "PROPRIETAIRE_COURANT" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['sqlite']['get_id_bat']='SELECT "ID_BAT" as id_bat FROM "BATI_A00_IDENT_LOCAL" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-$aSql['sqlite']['get_id_par']='SELECT "ID_PAR" as id_par FROM "NON_BATI_A10_DESCR_PARCELLE" WHERE "ID_DNUPRO"=\'$sIdDnupro\'';
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Attribute.class.inc b/web_service/class/majic_lib/Mj_Attribute.class.inc
deleted file mode 100755
index bcc320a7305b0b9131e0e78324ade1ad32a50b68..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Attribute.class.inc
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
-* \file Mj_Attribute.class.inc
-* \brief Mj_Attribute.class.inc \n \n Ce fichier contient la classe php Mj_Attribute
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Attribute. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Attribute
-* \brief Mj_Attribute Class \n \n Mj_Attributes est une classe PHP qui hérite de la classe Mj_Attribute.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Attribute. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-
-class Mj_Attribute extends Mj {
-	/**
-	* Cette méthode métier permet de récupérer l'attribut parmi les attributs d'une emprise calculée sur la parcelle d'un compte communal.
-	* \param $aAttributes Tableau.
-	* \param $aField Tableau des libellés issue des properties.
-	* \private
-	*/
-	function __construct($aAttributes,$aField=Array()){
-		$aAttribute=array();
-		$aAttribute["label"]=$aAttributes["label"];
-		$aAttribute["title"]=$aField[$aAttributes["label"]];
-		$aAttribute["value"]=$aAttributes["value"];
-		$this->aFields=$aAttribute;
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['label']=$this->aFields["label"];
-			$aExportFields['title']=$this->aFields["title"];
-			$aExportFields['value']=$this->aFields["value"];
-		}
-		return $aExportFields;
-	}
-
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Attributes.class.inc b/web_service/class/majic_lib/Mj_Attributes.class.inc
deleted file mode 100755
index 515604605946549905d8e69833364f377cb83676..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Attributes.class.inc
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
-* \file Mj_Attributes.class.inc
-* \brief Mj_Attributes.class.inc \n \n Ce fichier contient la classe php Mj_Attributes
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Attributes d'une Emprise. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Attributes
-* \brief Mj_Attributes Class \n \n Mj_Attributes est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Attributes d'une Emprise. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Attribute.class.inc");
-
-class Mj_Attributes extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Attribut d'une Emprise.
-	*/
-	var $aAttributes =array();
-
-	/**
-	* Cette méthode métier permet de récupérer les attributs d'une emprise calculée sur la parcelle d'un compte communal.
-	* \param $aAttributesEmprise Tableau des attributs.
-	* \param $aField Tableau des libellés issue des properties.
-	* \private
-	* \return Un tableau HTML sous la forme d'une chaîne de caractères.
-	*/
-	function __construct($aAttributesEmprise,$aField=Array()){
-		foreach ($aAttributesEmprise as $sAttributeEmprise => $aValue){
-			if (is_array($aValue)){
-				foreach ($aValue as $sLabel => $sValue){
-					$aAttribute["label"]=$sLabel;
-					$aAttribute["value"]=$sValue;
-					array_push($this->aAttributes,new Mj_Attribute($aAttribute,$aField));
-				}
-			}
-		}
-		$aTest["test"]="test";
-		$this->aFields=$aTest;
-		$this->aObjects=$this->aAttributes;
-	}
-
-	/**
-	* Cette méthode permet de construire un tableau.
-	* \return Retourne un tableau associatif.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}
-		return $aExportFields;
-	}
-
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Bati.class.inc b/web_service/class/majic_lib/Mj_Bati.class.inc
deleted file mode 100755
index c0efa18e4780a55af3c557c5e2ec29ff8000cc3e..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Bati.class.inc
+++ /dev/null
@@ -1,605 +0,0 @@
-<?php
-/**
-* \file Mj_Bati.class.inc
-* \brief Mj_Bati.class.inc \n \n Ce fichier contient la classe php Mj_Bati
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie bati. 
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Bati
-* \brief Mj_Bati Class \n \n Mj_Bati est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie bâti. 
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Pev.class.inc");
-require_once ("Mj_Lot_Local.class.inc");
-
-class Mj_Bati extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Pev du bâti
-	*/
-	var $aPev=array();
-	/**
-	* Tableau associatif comportant la liste des objets Lot_Local du bâti
-	*/
-	var $aLotLocal=array();
-
-	/**
-	* \param $sIdBat Identifiant de bâti
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdBat,$oBD, $sEncryptedKey=''){
-		$this->sEncryptKey = $sEncryptedKey;
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['bati'];
-		$this->sSql=str_replace('$sIdBat', $sIdBat, $this->sSql);
-		$oPDOresult= $oBD->execute($this->sSql);
-		if ($oBD->enErreur()) {
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->aFields=$oBD->ligneSuivante($oPDOresult);
-			$this->sStatus=0;
-		}
-		$this->aPev=$this->get_aPev($oBD);
-		$this->aPro=$this->get_aPro($oBD);
-		$this->aLotLocal=$this->get_aLot_Local($oBD);
-		$this->aObjects=array_merge ($this->aPev, $this->aLotLocal, $this->aPro);
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_PRO en fonction d'un ID_DNUPRO donné.
-	* \return Retourne un tableau de ID_PRO.
-	*/
-	function get_aId_Pro($oBD){
-		if($this->isEmpty()){
-			$aIdPro="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdPro=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_pro'];
-			$this->sSql=str_replace('$sIdDnupro', $this->encrypt($this->aFields['b_iddnupro']), $this->sSql);
-			$oPDOresult= $oBD->execute($this->sSql);
-			if ( $oBD->enErreur()) {
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPro,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdPro;
-		$oPDOresult=$oBD->fermeResultat();
-	}	
-	/**
-	* Cette méthode permet de récupérer la liste des objets Proprietaire
-	* \return Retourne un tableau d'objets Proprietaire
-	*/
-	function get_aPro($oBD){
-		$aPro=array();
-		if($this->isEmpty()){
-			$aPro="";
-		}else{
-			$aIdPro=$this->get_aId_Pro($oBD);
-			foreach($aIdPro as $sIdPro){
-				array_push($aPro,new Mj_Proprietaire($this->aFields['b_iddnupro'],$sIdPro,$oBD, $this->sEncryptKey));
-			}
-		}
-		return $aPro;
-	}
-	/**
-	* Cette méthode permet de récupérer les Id_Pev en fonction d'un Id_Bat donné.
-	* \return Retourne un tableau de chaînes de caractères.
-	*/
-	function get_aId_Pev($oBD){
-		if($this->isEmpty()){
-			$aIdPev="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdPev=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_pev'];
-			$this->sSql=str_replace('$sIdBat', $this->aFields['id_bat'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if ($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPev,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdPev;
-	}	
-	/**
-	* Cette méthode permet de récupérer la liste des objets Pev du bâti
-	* \return Retourne un tableau d'objets Pev
-	*/
-	function get_aPev($oBD){
-		$aPev=array();
-		if($this->isEmpty()){
-			$aPev="";
-		}else{
-		  $aIdPev=$this->get_aId_Pev($oBD);
-			foreach($aIdPev as $sValue){
-				array_push($aPev,new Mj_Pev($sValue,$oBD));
-			}
-		}
-		return $aPev;
-	}
-	/**
-	* Cette méthode permet de récupérer les Klot en fonction d'un Id_Bat donné
-	* \return Retourne un tableau de chaînes de caractères
-	*/
-	function get_aKlot($oBD){
-		if($this->isEmpty()){
-			$aKlot="";
-		}else{
-			include $this->sRessourcesFile;
-			$aKlot=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_klot'];
-			$this->sSql=str_replace('$sIdBat', $this->aFields['id_bat'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if ( $oBD->enErreur()) {
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();   	
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aKlot,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aKlot;
-	}	
-	/**
-	* Cette méthode permet de récupérer la liste des objets Lot-Local du bâti
-	* \return Retourne un tableau d'objets Lot-Local
-	*/
-	function get_aLot_Local($oBD){
-		$aLotLocal=array();
-		if($this->isEmpty()){
-			$aLotLocal="";
-		}else{
-			$aKlot=$this->get_aKlot($oBD);
-			foreach($aKlot as $sKlot){
-				array_push($aLotLocal,new Mj_Lot_Local($this->aFields['id_bat'],$sKlot,$oBD));
-			}
-		}
-		return $aLotLocal;	
-	}
-	
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['date']=$this->getJdatat();
-			$aExportFields['section']=$this->aFields['ccosec'];
-			$aExportFields['num_plan']=$this->aFields['dnupla'];
-			$aExportFields['cp']=$this->aFields['ccoplc'];
-			$aExportFields['voirie']=$this->getVoirie();
-			$aExportFields['adresse']=$this->aFields['dvoilib'];
-			$aExportFields['code_rivoli']=$this->aFields['ccoriv'];
-			$aExportFields['bat']=$this->aFields['dnubat'];
-			$aExportFields['ent']=$this->aFields['desc'];
-			$aExportFields['niv']=$this->aFields['dniv'];
-			$aExportFields['num_de_porte']=$this->aFields['dpor'];
-			$aExportFields['num_invar']=$this->getNumeroInvar();
-			$aExportFields['m_eva']=$this->aFields['ccoeva'];
-			$aExportFields['nat_loc']=$this->getNatLoc();
-			$aExportFields['tx_om']=$this->aFields['gtauom'];
-			$aExportFields['s_tar']=$this->getSTar();
-			$aExportFields['af']=$this->getAf();
-			$aExportFields['cat']=$this->getCat();
-			$aExportFields['revenu_cadastral']=$this->getRevenuCadastral();
-			$aExportFields['revenu_cadastral_txt']=$this->setFloatToText($this->getRevenuCadastral());
-			$aExportFields['dvlpera']=$this->aFields['dvlpera'];
-			$aExportFields['b_dnupro']=$this->aFields['b_dnupro'];
-			$aExportFields['b_iddnupro']=$this->aFields['b_iddnupro'];
-			$aExportFields['dteloc']=$this->aFields['dteloc'];
-			$aExportFields['dvltrt']=$this->aFields['dvltrt'];
-			$aExportFields['dnumql']=$this->aFields['dnumql'];
-			$aExportFields['ddenql']=$this->aFields['ddenql'];
-			//$aExportFields['nat_exo']=$this->getNatExo();
-			//$aExportFields['exoneration']=$this->getExoneration();
-			//$aExportFields['revenu_cadastral_avec_exo']=$this->getRevenuCadastralAvecExo();
-			//$aExportFields['revenu_cadastral_avec_pp']=$this->getRevenuCadastralAvecPP();
-			$aExportFields['num_invar']=$this->aFields['invar'];
-			$aExportFields['ddenql']=$this->aFields['ddenql'];
-			$aExportFields['local_type']=$this->aFields['dteloc'];
-			$aExportFields['nature']=$this->aFields['cconlc'];
-			$aExportFields['lib_nature']=$this->aFields['lib_cconlc'];
-			$aExportFields['occupation']=$this->aFields['dnatlc'];
-			$aExportFields['lib_occupation']=$this->getOccupation();
-			$aExportFields['date_mut']=$this->getJdatat_full();
-			$aExportFields['annee_constr']=$this->aFields['jannat'];
-			$aExportFields['niveaux']=$this->aFields['dnbniv'];
-			$aExportFields['libcom']=$this->aFields['libcom'];
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de récupérer les deux derniers caractères de l'attribut Jdatat et d'y ajouter 1.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getJdatat_full(){
-		$sjdatat=$this->aFields['jdatat'];
-		if ($sjdatat != ""){
-			if (preg_match( '`^\d{1,2}/\d{1,2}/\d{4}$`' , $sjdatat ) ){
-				$sNewJdatat_full=$sjdatat;
-			}else if (preg_match( '`^\d{1,2}/\d{1,2}/\d{2}$`' , $sjdatat ) ){
-				$sNewJdatat_full=$sjdatat;
-			}else{
-				$sNewJdatat_full=substr($sjdatat,0,2)."/".substr($sjdatat,2,2)."/".substr($sjdatat,4,4);
-			}
-		}
-		return $sNewJdatat_full;
-	}
-	/**
-	* Cette méthode permet de récupérer les deux derniers caractères de l'attribut Jdatat et d'y ajouter 1.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getJdatat(){
-		$sNewJdatat=$this->aFields['jdatat'];
-		if (preg_match( '`^\d{1,2}/\d{1,2}/\d{4}$`' , $sNewJdatat ) ){			
-			$sNewJdatat=substr("$sNewJdatat", 6, 4)+1;
-			$sNewJdatat=(string)(substr("$sNewJdatat", 2, 2));
-		}else if (preg_match( '`^\d{1,2}/\d{1,2}/\d{2}$`' , $sNewJdatat ) ){
-			$sNewJdatat=(string) (substr("$sNewJdatat", 6, 2)+1);
-			if(strlen($sNewJdatat) == 1){
-				$sNewJdatat='0'.$sNewJdatat;
-			}
-			$sNewJdatat=(string) (substr("$sNewJdatat", -2, 2));
-		}else{
-			$sNewJdatat=substr("$sNewJdatat", 4, 4)+1;
-			$sNewJdatat=(string)(substr("$sNewJdatat", 2, 2));
-		}
-		return $sNewJdatat;
-	}
-	/**
-	* Cette méthode permet de supprimer le code commune de l'attribut invar.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNumeroInvar(){
-		$sNumeroInvar=$this->aFields['invar'];
-		$sNumeroInvar= substr("$sNumeroInvar", 3, 7);
-		return $sNumeroInvar;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs dnvoiri et indic.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getVoirie(){
-		$sVoirie=ltrim($this->aFields['dnvoiri'],'0').$this->aFields['dindic'];
-		return $sVoirie;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 's_tar' dans le tableau aPev.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getSTar(){
-		if(count($this->aPev)==1){
-			return $this->aPev[0]->aFields['ccostb'];
-		}else{
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'af' dans le tableau aPev.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getAf(){
-		if(count($this->aPev)==1){
-			return $this->aPev[0]->aFields['ccoaff'];
-		}else{
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'cat' dans le tableau aPev.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getCat(){
-		if(count($this->aPev)==1){
-			return $this->aPev[0]->aFields['dcapec'];
-		}else{
-			return '';
-		}
-	}
-	/**
-	* Cette métode permet de récupérer la somme du revenu cadastral pour un bâti avec exonération de type EP, CD, CR, DR ou NI.
-	* \return Retourne un entier.
-	*/
-	/*function getRevenuCadastralAvecExo(){
-		$iRevenuCadastralAvecExo=0;
-		foreach ($this->aPev as $oPev) {
-			if(ereg ("EP|CD|CR|DR|NI|ND", $oPev->aExportFields['nat_exo'])){
-				$iRevenuCadastralAvecExo=$iRevenuCadastralAvecExo + $oPev->aExportFields['revenu_cadastral'];
-			}
-		} 
-		return $iRevenuCadastralAvecExo;
-	}*/
-	/**
-	* Cette métode permet de récupérer la somme du revenu cadastral pour un bâti avec exonération de type PP.
-	* \return Retourne un entier.
-	*/
-	/*function getRevenuCadastralAvecPP(){
-		$iRevenuCadastralAvecPP=0;
-		foreach ($this->aPev as $oPev) {
-			if((ereg ("PP", $oPev->aExportFields['nat_exo'])) && ((int) ($this->aFields['dnupev']>1))){
-				$iRevenuCadastralAvecPP=$iRevenuCadastralAvecPP + $oPev->aExportFields['revenu_cadastral'];
-			}
-		} 
-		return $iRevenuCadastralAvecPP;
-	}
-	/**
-	* Cette métode permet de récupérer la somme du revenu cadastral pour un bâti.
-	* \return Retourne un entier.
-	*/
-	function getRevenuCadastral(){
-		$iRevenuCadastral=0;
-		foreach($this->aPev as $oPev){
-			$iRevenuCadastral=$iRevenuCadastral+ (int) $oPev->getRevenuCadastral();
-		}
-		return $iRevenuCadastral;
-	}
-	/**
-	* Cette métode permet de récupérer la somme du revenu cadastral pour un bâti.
-	* \return Retourne un float.
-	*/
-	function getRevenuCadastralfloat(){
-		$iRevenuCadastral=0;
-		foreach($this->aPev as $oPev){
-			$fRevenuCadastral=$fRevenuCadastral+ (float) $oPev->getRevenuCadastral();
-		}
-		return $fRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de récupérer la somme des exonérations pour un bâti.
-	* \return Retourne un entier.
-	*/
-	function getExoneration($sLccodem){
-		$iExoneration=0;
-		foreach ($this->aPev as $oPev){
-			if (($sLccodem!='') && (ereg ("PP", $oPev->getNatExo())) && ((int) ($this->aFields['dnupev']>1))){
-				$iExoneration=$iExoneration + $oPev->getRevenuCadastral();
-			}elseif($oPev->getNatExo()!=''){
-				$iExoneration=$iExoneration + $oPev->getRevenuCadastral();
-			}
-		} 
-		return $iExoneration;
-	}
-	/**
-	* Cette méthode permet de récupérer la somme des exonérations pour un bâti.
-	* \return Retourne un float.
-	*/
-	function getExonerationfloat($sLccodem){
-		$fExoneration=0;
-		foreach ($this->aPev as $oPev){
-			if (($sLccodem!='') && (ereg ("PP", $oPev->getNatExo())) && ((int) ($this->aFields['dnupev']>1))){
-				$fExoneration=$fExoneration + $oPev->getRevenuCadastralfloat();
-			}elseif($oPev->getNatExo()!=''){
-				$fExoneration=$fExoneration + $oPev->getRevenuCadastralfloat();
-			}
-		} 
-		return $fExoneration;
-	}
-	/**
-	* Cette méthode permet de retourner la nature du local.
-	* \return Retourne une chaîne de caractères qui peut être valide (la chaîne de caractères a été vérifiée d'après des exemples de relevés de propriété) ou non valide (la chaîne de caractères n'a pas pu être vérifiée).
-	*/
-	function getNatLoc(){
-		switch($this->aFields["cconlc"]){
-			case 'MA' :
-				$sNatLoc="MAIS"; // Cas validé
-			break;
-			case 'AP' :
-				$sNatLoc="APP"; // Cas validé
-			break;
-			case 'DE' :
-				$sNatLoc=$this->getNatureDep(); // Cf fonction getNatureDep()
-			break;
-			case 'DC' :
-				$sNatLoc="DLC"; // cas non validé
-			break;
-			case 'LC' :
-				$sNatLoc="L.COM"; // Cas validé
-			break;
-			case 'CM' :
-				$sNatLoc="CM"; // Cas validé
-			break;
-			case 'CA' :
-				$sNatLoc="CA"; // Cas validé
-			break;
-			case 'CD' :
-				$sNatLoc="DEP.C"; // Cas validé
-			break;
-			case 'CB' :
-				$sNatLoc="L.DIV"; // Cas validé
-			break;
-			case 'ME' :
-				$sNatLoc="M.EXC"; // Cas validé
-			break;
-			case 'MP' :
-				$sNatLoc="M.PAR"; // Cas validé
-			break;
-			case 'SM' :
-				$sNatLoc="SOLM"; // Cas non validé
-			break;
-			case 'AU' :
-				$sNatLoc="AU"; // Cas validé
-			break;
-			case 'CH' :
-				$sNatLoc="CHANT"; // Cas validé
-			break;
-			case 'U ' :
-				$sNatLoc="E.IND"; // Cas validé
-			break;
-			case 'US' :
-				$sNatLoc="US"; // Cas validé
-			break;
-			case 'UG' :
-				$sNatLoc="AGAZ"; // Cas non validé
-			break;
-			case 'UE' :
-				$sNatLoc="UE"; // Cas validé
-			break;
-			case 'U1' :
-				$sNatLoc="GARE"; // Cas non validé
-			break;
-			case 'U2' :
-				$sNatLoc="GTRI"; // Cas non validé
-			break;
-			case 'U3' :
-				$sNatLoc="GAMAT"; // Cas non validé
-			break;
-			case 'U4' :
-				$sNatLoc="GAMAG"; // Cas non validé
-			break;
-			case 'U5' :
-				$sNatLoc="GDETI"; // Cas non validé
-			break;
-			case 'U6' :
-				$sNatLoc="GDERE"; // Cas non validé
-			break;
-			case 'U7' :
-				$sNatLoc="GMATR"; // Cas non validé
-			break;
-			case 'U8' :
-				$sNatLoc="GEMR"; // Cas non validé
-			break;
-			case 'U9' :
-				$sNatLoc="GSTUS"; // Cas non validé
-			break;
-			case 'AT' :
-				$sNatLoc="AT"; // Cas validé
-			break;
-			default :
-				$sNatLoc=substr($this->aFields["cconlc"],0,4);
-			break;
-		}
-		return $sNatLoc;
-	}
-	/**
-	* Cette méthode permet de retourner la nature de dépendance.
-	* \return Retourne une chaîne de caractères qui peut être valide (la chaîne de caractères a été vérifiée d'après des exemples de relevés de propriété) ou non valide (la chaîne de caractères n'a pas pu être vérifiée).
-	*/
-	function getNatureDep(){
-		switch($this->aFields["cconad"]){
-			case 'GA' :
-				$sNatureDep="GAR"; // Cas validé
-			break;
-			case 'CV' :
-				$sNatureDep="CAVE"; // Cas validé
-			break;
-			case 'GR' :
-				$sNatureDep="GREN"; // Cas validé
-			break;
-			case 'TR' :
-				$sNatureDep="TERR"; // Cas non validé
-			break;
-			case 'GP' :
-				$sNatureDep="GPARK"; // Cas validé
-			break;
-			case 'GC' :
-				$sNatureDep="GRCA"; // Cas non validé
-			break;
-			case 'BX' :
-				$sNatureDep="BOX"; // Cas validé
-			break;
-			case 'PK' :
-				$sNatureDep="PARK"; // Cas validé
-			break;
-			case 'CL' :
-				$sNatureDep="CELL"; // Cas non validé
-			break;
-			case 'BD' :
-				$sNatureDep="BUAN"; // Cas non validé
-			break;
-			case 'BC' :
-				$sNatureDep="BUCH"; // Cas non validé
-			break;
-			case 'RS' :
-				$sNatureDep="REMI"; // Cas non validé
-			break;
-			case 'TT' :
-				$sNatureDep="TT"; // Cas validé
-			break;
-			case 'PI' :
-				$sNatureDep="P.IND"; // Cas validé
-			break;
-			case 'PA' :
-				$sNatureDep="AGREM"; // Cas validé
-			break;
-			case 'CD' :
-				$sNatureDep="CHDO"; // Cas non validé
-			break;
-			case 'DC' :
-				$sNatureDep="DEP.C"; // Cas validé
-			break;
-			case 'JH' :
-				$sNatureDep="J.HIV"; // Cas validé
-			break;
-			case 'PS' :
-				$sNatureDep="PISC"; // Cas validé
-			break;
-			case 'SR' :
-				$sNatureDep="SERR"; // Cas non validé
-			break;
-			default :
-				$sNatureDep=substr($this->aFields["cconad"],0,4);
-			break;
-		}
-		return $sNatureDep;
-	}
-	/**
-	* Cette méthode permet de formater un décimal pour l'affichage.
-	* \return Retourne une chaine
-	*/
-	function setFloatToText($fFloat){
-		return number_format($fFloat,2,'.','');
-	}
-	/**
-	* Cette méthode permet de retourner l'occupation du logement
-	* \return Retourne une chaîne de caractères qui peut être valide (la chaîne de caractères a été vérifiée d'après des exemples de relevés de propriété) ou non valide (la chaîne de caractères n'a pas pu être vérifiée).
-	*/
-	function getOccupation(){
-		switch($this->aFields["dnatlc"]){
-			case 'P' :
-				$sOccupation="Proprietaire ou  Usufruitier";
-			break;
-			case 'L' :
-				$sOccupation="Location autre que propriétaire ou usufruitier";
-			break;
-			case 'V' :
-				$sOccupation="Vacant";
-			break;
-			case 'T' :
-				$sOccupation="Location, non affectée à l’habitation, soumise à TVA";
-			break;
-			case 'D' :
-				$sOccupation="Habitation principale occupée par le propriétaire";
-			break;
-			default :
-				$sOccupation=substr($this->aFields["dnatlc"],0,1);
-			break;
-		}
-		return $sOccupation;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Bati_Parcelle.class.inc b/web_service/class/majic_lib/Mj_Bati_Parcelle.class.inc
deleted file mode 100755
index f499117c779f28e0337f42e9af3cc54cfd6945eb..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Bati_Parcelle.class.inc
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-/**
-* \file Mj_Bati_Parcelle.class.inc
-* \brief Mj_Bati_Parcelle.class.inc \n \n Ce fichier contient la classe php Mj_Bati_Parcelle
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter les batis associés à une parcelle.
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-* \author Fabien Marty <fabien.marty@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-require_once ("Mj_Bati.class.inc");
-require_once ("Mj_Proprietaire.class.inc");
-
-class Mj_Bati_Parcelle extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Bati de la parcelle.
-	*/
-	var $aBat=array();
-	/**
-	* Chaine qui stocke l'anneé de référence des données  casdatrales.
-	*/
-	var $sAnneeReference;
-
-	/**
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $oBD Objet de connexion
-	*/
-	function __construct($sIdPar,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['bati_parcelle'];
-		$this->sSql=str_replace('sIdPar',$sIdPar,$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->sStatus=0;
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-		}
-		$oPDOresult=$oBD->fermeResultat();
-		$this->aBat=$this->get_aBat($oBD,$sIdPar);
-		$this->sSql=$aSql[$oBD->sgbd]['annee_reference'];
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->erreurRencontree != 0){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$aAnneeReference=$oBD->ligneSuivante ($oPDOresult);
-			$this->sAnneeReference=$aAnneeReference['ANNEE'];
-		}
-  		$this->aObjects=$this->aBat;
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_BAT en fonction d'un ID_PAR donné
-	* \param $oBD Objet de connexion
-	* \param $sIdPar Chaine identifiant de la parcelle
-	* \return Retourne un tableau de ID_BAT
-	*/
-	function get_aId_Bat($oBD,$sIdPar){
-		if($this->isEmpty()){
-			$aIdBat="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdBat=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_par_id_bat'];
-			$this->sSql=str_replace('sIdPar',$sIdPar,$this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdBat,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdBat;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets BATI
-	* \param $oBD Objet de connexion
-	* \param $sIdPar Chaine identifiant de la parcelle
-	* \return Retourne un tableau d'objets BATI
-	*/
-	function get_aBat($oBD,$sIdPar){
-		$aBat=array();
-		if($this->isEmpty()){
-			$aBat="";
-		}else{
-			$aIdBat=$this->get_aId_Bat($oBD,$sIdPar);
-			foreach($aIdBat as $sIdBat){
-				array_push($aBat,new Mj_Bati($sIdBat,$oBD));
-			}
-		}
-		return $aBat;
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['id_par']=$this->aFields['id_par'];
-			$aExportFields['annee_de_maj']=$this->sAnneeReference;
-			$aExportFields['dep_dir']=$this->getDepdir();
-			$aExportFields['code_dep']=$this->aFields['ccodep'];
-			$aExportFields['code_com']=$this->aFields['ccocom'];
-			$aExportFields['lib_dep']=$this->aFields['libdep'];
-			$aExportFields['com']=$this->getCom();
-			$aExportFields['libcom']=$this->aFields['libcom'];
-			$aExportFields['role']="";
-			$aExportFields['vue']="";
-			$aExportFields['contenance']=$this->aFields['dcntpa'];
-			$aExportFields['adresse']=$this->getAdresseParcelle();
-			$aExportFields['total_valeur_locative']=$this->getValeurLocativeBati();
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs ccodep et ccodir.
-	* /return Retourne une chaîne de caractères correspondant au DEP DIR du RP.
-	*/
-	function getDepdir(){
-		$sDepdir=$this->aFields['ccodep']." ".$this->aFields['ccodir'];
-		return $sDepdir;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs ccocom et libcom.
-	* /return Retourne une chaîne de carcatères correspondant au COM du RP.
-	*/
-	function getCom(){
-		$sCom=$this->aFields['ccocom']." ".$this->aFields['libcom'];
-		return $sCom;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs cconvo et dvoilib.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getAdresseParcelle(){
-		$sAdresseParcelle=ltrim(rtrim($this->aFields['dnvoiri']),'0').rtrim($this->aFields['dindic'])." ".rtrim($this->aFields['cconvo'])." ".rtrim($this->aFields['dvoilib']);
-		return $sAdresseParcelle;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur locative totale du bâti.
-	* \return Retourne un double
-	*/
-	function getValeurLocativeBati(){
-		$iValeurLocativeBati=0;
-		foreach($this->aBat as $oBat){
-			$iValeurLocativeBati=$oBat->aFields['dvlpera']+$iValeurLocativeBati;
-		}
-		return $iValeurLocativeBati;
-	}
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Bati_Parcelles.class.inc b/web_service/class/majic_lib/Mj_Bati_Parcelles.class.inc
deleted file mode 100755
index 32b418b90305423dfcc51b6cde1eab1d70048da9..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Bati_Parcelles.class.inc
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
-* \file Mj_Bati_Parcelles.class.inc
-* \brief Mj_Bati_Parcelles.class.inc \n \n Ce fichier contient la classe php Mj_Bati_Parcelles
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter les batis associés à une parcelle.
-*
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-* \author Fabien Marty <fabien.marty@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-require_once ("Mj_Bati_Parcelle.class.inc");
-
-class Mj_Bati_Parcelles extends Mj {
-
-	/**
-	* \param $aIdPar Identifiant de la parcelle
-	* \param $oBD Objet de connexion
-	*/
-	function __construct($aIdPar,$oBD){
-		$i=0;
-		while ($aIdPar[$i]){
-			array_push ($this->aObjects, new Mj_Bati_Parcelle($aIdPar[$i],$oBD));
-			$i++;
-		}
-	}
-	/**
-	* \brief Cette méthode permet de construire un tableau.
-	* \return Retourne un tableau associatif.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		$aExportFields['sum_contenance_m2']=$this->getSurfaceCadastraleM2();
-		$aExportFields['sum_valeur_locative']=$this->getValeurLocative();
-		return $aExportFields;
-	}
-	/**
-	* \brief Récupération de la surface totale des parcelles en mettre carré.
-	*/
-	function getSurfaceCadastraleM2(){
-		$dSurfaceCadastraleM2=0;
-		foreach($this->getObjects('Mj_Bati_Parcelle') as $oBatiPar){
-			$aFields=$oBatiPar->getExportFields();
-			$dSurfaceCadastraleM2=((int) $aFields['contenance'])+$dSurfaceCadastraleM2;
-		}
-		return $dSurfaceCadastraleM2;
-	}
-	/**
-	* \brief Récupération des valeurs locatives
-	*/
-	function getValeurLocative(){
-		$dValeurLocative=0;
-		foreach($this->getObjects('Mj_Bati_Parcelle') as $oBatiPar) {
-			$aFields=$oBatiPar->getExportFields();
-			$dValeurLocative=$aFields['total_valeur_locative']+$dValeurLocative;
-		}
-		return $dValeurLocative;
-	}
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Compte_Communal.class.inc b/web_service/class/majic_lib/Mj_Compte_Communal.class.inc
deleted file mode 100755
index bb39be23bd1147ecd93facf2b672256b27414f9e..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Compte_Communal.class.inc
+++ /dev/null
@@ -1,727 +0,0 @@
-<?php
-/**
-* \file Mj_Compte_Communal.class.inc
-* \brief Mj_Compte_Communal.class.inc \n \n Ce fichier contient la classe php Mj_Compte_Communal
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie compte communal.
-*
-* \author Damien Bedel 
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-require_once ("Mj_Proprietaire.class.inc");
-require_once ("Mj_Bati.class.inc");
-require_once ("Mj_Parcelle.class.inc");
-
-class Mj_Compte_Communal extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Proprietaire d'un compte communal.
-	*/
-	var $aPro=array();
-	/**
-	* Tableau associatif comportant la liste des objets Bati d'un compte communal.
-	*/
-	var $aBat=array();
-	/**
-	* Tableau associatif comportant la liste des objets Non Bati d'un compte communal.
-	*/
-	var $aPar=array();
-	/**
-	* Chaine qui stocke l'anneé de référence des données  casdatrales.
-	*/
-	var $sAnneeReference;
-
-	/**
-	* \param $sIdDnupro Identifiant national de compte communal
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdDnupro,$oBD, $sEncryptKey = ''){
-		$this->sEncryptKey = $sEncryptKey;
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['compte_communal'];
-		$this->sSql=str_replace('$sIdDnupro',$this->encrypt($sIdDnupro),$this->sSql);
-		$oPDOresult=$oBD->execute ($this->sSql);
-		if($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->sStatus=0;
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->aFields['id_dnupro'] = $sIdDnupro;
-		}
-		$oPDOresult = $oBD->fermeResultat();
-		$this->aPro = $this->get_aPro($oBD);
-		$this->aBat = $this->get_aBat($oBD);
-		$this->aPar = $this->get_aPar($oBD);
-		$this->sSql = $aSql[$oBD->sgbd]['annee_reference'];
-		$oPDOresult = $oBD->execute ($this->sSql);
-		if ( $oBD->erreurRencontree != 0){
-			$this->sStatus=1;
-			$this->sMessage = $oBD->getBDMessage();
-		}else{
-			$aAnneeReference = $oBD->ligneSuivante ($oPDOresult);
-			$this->sAnneeReference=$aAnneeReference['ANNEE'];
-		}
-  		$this->aObjects = array_merge ($this->aPro, $this->aBat,$this->aPar);
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_PRO en fonction d'un ID_DNUPRO donné.
-	* \return Retourne un tableau de ID_PRO.
-	*/
-	function get_aId_Pro($oBD){
-		if($this->isEmpty()){
-			$aIdPro="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdPro=array();
-			$this->sSql = $aSql[$oBD->sgbd]['get_id_pro'];
-			$this->sSql = str_replace('$sIdDnupro', $this->encrypt($this->aFields['id_dnupro']), $this->sSql);
-			
-			$oPDOresult= $oBD->execute($this->sSql);
-			if ( $oBD->enErreur()) {
-				$this->sStatus=1;
-				$this->sMessage = $oBD->getBDMessage();
-			}else{
-				while($aResultFetch = $oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPro,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdPro;
-		$oPDOresult=$oBD->fermeResultat();
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Proprietaire
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau d'objets Proprietaire
-	*/
-	function get_aPro($oBD){
-		$aPro=array();
-		if($this->isEmpty()){
-			$aPro="";
-		}else{
-			$aIdPro = $this->get_aId_Pro($oBD);
-
-			foreach($aIdPro as $sIdPro){
-				array_push($aPro,new Mj_Proprietaire($this->aFields['id_dnupro'],$sIdPro,$oBD, $this->sEncryptKey));
-			}
-		}
-		return $aPro;
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_BAT en fonction d'un ID_DNUPRO donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau de ID_BAT
-	*/
-	function get_aId_Bat($oBD){
-		if($this->isEmpty()){
-			$aIdBat="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdBat=array();
-			$this->sSql = $aSql[$oBD->sgbd]['get_id_bat'];
-			$this->sSql = str_replace('$sIdDnupro', $this->aFields['id_dnupro'], $this->sSql);
-			$oPDOresult= $oBD->execute($this->sSql);
-			if ( $oBD->enErreur()) {
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch = $oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdBat,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdBat;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets BATI
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau d'objets BATI
-	*/
-	function get_aBat($oBD){
-		$aBat=array();
-		if($this->isEmpty()){
-			$aBat="";
-		}else{
-			$aIdBat = $this->get_aId_Bat($oBD);
-			foreach($aIdBat as $sIdBat){
-				array_push($aBat,new Mj_Bati($sIdBat,$oBD, $this->sEncryptKey));
-			}
-		}
-		return $aBat;
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_PAR en fonction d'un ID_DNUPRO donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau de ID_PAR
-	*/
-	function get_aId_Par($oBD){
-		if($this->isEmpty()){
-			$aIdPar="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdPar=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_par'];
-			$this->sSql=str_replace('sDnupro', $this->aFields['dnupro'], $this->sSql);
-			$this->sSql=str_replace('sIdCom', $this->aFields['ccodep'].$this->aFields['ccodir'].$this->aFields['ccocom'], $this->sSql);
-			//$this->sSql=str_replace('$sIdDnupro', $this->aFields['id_dnupro'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if ($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPar,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_par_bnd'];
-			$this->sSql=str_replace('sIdDnupro', $this->aFields['id_dnupro'], $this->sSql);
-			$this->sSql=str_replace('sDnupro', substr($this->aFields['id_dnupro'], 6), $this->sSql);
-			$this->sSql=str_replace('sIdCom', $this->aFields['ccodep'].$this->aFields['ccodir'].$this->aFields['ccocom'], $this->sSql);
-			//$this->sSql=str_replace('$sIdDnupro', $this->aFields['id_dnupro'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if ($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPar,$aResultFetch[0]);
-					
-					$this->sStatus=0;
-				}
-			}
-			$this->aExportFields=$this->getExportFields();
-		}
-		return $aIdPar;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets PARCELLE
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau d'objets PARCELLE
-	*/
-	function get_aPar($oBD){
-		$aPar=array();
-		if($this->isEmpty()){
-			$aPar="";
-		}else{
-			$aIdPar=$this->get_aId_Par($oBD);
-			foreach($aIdPar as $sIdPar){
-				array_push($aPar,new Mj_Parcelle($oBD,$sIdPar,$this->aFields['id_dnupro']));
-			}
-		}
-		return $aPar;
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['codeinsee']=$this->aFields['codeinsee'];
-			$aExportFields['annee_de_maj']=$this->sAnneeReference;
-			$aExportFields['dep_dir']=$this->getDepdir();
-			$aExportFields['code_dep']=$this->aFields['ccodep'];
-			$aExportFields['code_com']=$this->aFields['ccocom'];
-			$aExportFields['lib_dep']=$this->aFields['libdep'];
-			$aExportFields['com']=$this->getCom();
-			$aExportFields['libcom']=$this->aFields['libcom'];
-			$aExportFields['role']="";
-			$aExportFields['vue']="";
-			$aExportFields['numero_communal']=$this->aFields['dnupro'];
-			$aExportFields['rev_impo_bati']=$this->getRevImpoBati();
-			$aExportFields['rev_impo_par']=$this->getRevImpoPar();
-			$iContenance = 0;
-			foreach($this->aPar as $oPar){
-				$iContenance = $iContenance + $oPar->getContenance();
-			}
-			$aExportFields['total_contenance']=$this->getTotalContenance();
-			$aExportFields['total_contenance_m2']=$this->getTotalContenanceM2();
-			$aExportFields['total_revenu_cadastral']=$this->getRevenuCadastralTotal();
-			$aExportFields['total_valeur_locative']=$this->getValeurLocativeBati();
-			$aExportFields['emprise_totale_intersect']=$this->getTotalContenanceBati();
-			$aExportFields['ha']=intval($iContenance/10000);
-			if ($aExportFields['ha']==0) {
-				$aExportFields['ha']=' ';
-			}
-
-			$aExportFields['a']=intval(($iContenance%10000)/100);
-			$sContenanceA=$aExportFields['a'];
-			$sContenanceA= strval($sContenanceA);
-			$sTlenA=strlen($sContenanceA);
-			if ($aExportFields['ha']==' ' and $aExportFields['a']==0){
-				$aExportFields['a']=' ';
-			} else {
-				if ($aExportFields['ha'] == ' ' and $sTlenA == 2 and substr($aExportFields['a'],0,1)== 0) {
-					$sDeuxiemeValeur = substr($aExportFields['a'],1,1);
-					$aExportFields['a'] = ' '.$sDeuxiemeValeur;
-				} else {
-					if ($aExportFields['ha'] != ' ' and $sTlenA == 1) {
-						$aExportFields['a']= '0'.$aExportFields['a'];
-					}
-				}
-			}
-			$aExportFields['ca']=$iContenance%100;
-			$sContenanceCa=$aExportFields['ca'];
-			$sContenanceCa= strval($sContenanceCa);
-			$sTlen=strlen($sContenanceCa);
-			if ($aExportFields['a'] != 0)
-				if ($sTlen == 1) {
-					$aExportFields['ca']= '0'.$aExportFields['ca'];
-				}
-			$aExportFields['exo_com_bati']=$this->getExoComBati();
-			$aExportFields['rev_impo_com_bati']=$this->getRevImpoComBati();
-			$aExportFields['exo_dep_bati']=$this->getExoDepBati();
-			$aExportFields['rev_impo_dep_bati']=$this->getRevImpoDepBati();
-			$aExportFields['exo_reg_bati']=$this->getExoRegBati();
-			$aExportFields['rev_impo_reg_bati']=$this->getRevImpoRegBati();
-			$aExportFields['exo_com_par']=$this->getExoComPar();
-			$aExportFields['rev_impo_com_par']=$this->getRevImpoComPar();
-			//$aExportFields['exo_dep_reg_par']=$this->getExoDepRegPar();
-			//$aExportFields['rev_impo_dep_reg_par']=$this->getRevImpoDepRegPar();
-			$aExportFields['exo_dep_par']=$this->getExoDepPar();
-			$aExportFields['rev_impo_dep_par']=$this->getRevImpoDepPar();
-			$aExportFields['exo_reg_par']=$this->getExoRegPar();
-			$aExportFields['rev_impo_reg_par']=$this->getRevImpoRegPar();
-			//modif float
-			$aExportFields['rev_impo_bati_float']=$this->getRevImpoBatifloat();
-			$aExportFields['rev_impo_par_float']=$this->getRevImpoParfloat();
-			$aExportFields['exo_com_bati_float']=$this->getExoComBatifloat();
-			$aExportFields['rev_impo_com_bati_float']=$this->getRevImpoComBatifloat();
-			$aExportFields['exo_dep_bati_float']=$this->getExoDepBatifloat();
-			$aExportFields['rev_impo_dep_bati_float']=$this->getRevImpoDepBatifloat();
-			$aExportFields['exo_reg_bati_float']=$this->getExoRegBatifloat();
-			$aExportFields['rev_impo_reg_bati_float']=$this->getRevImpoRegBatifloat();
-			$aExportFields['exo_com_par_float']=$this->getExoComParfloat();
-			$aExportFields['rev_impo_com_par_float']=$this->getRevImpoComParfloat();
-			//$aExportFields['exo_dep_reg_par_float']=$this->getExoDepRegParfloat();
-			//$aExportFields['rev_impo_dep_reg_par_float']=$this->getRevImpoDepRegParfloat();
-			$aExportFields['exo_dep_par_float']=$this->getExoDepParfloat();
-			$aExportFields['rev_impo_dep_par_float']=$this->getRevImpoDepParfloat();
-			$aExportFields['exo_reg_par_float']=$this->getExoRegParfloat();
-			$aExportFields['rev_impo_reg_par_float']=$this->getRevImpoRegParfloat();
-			$aExportFields['exo_tax_ad_par_float']=$this->getExoTaxeADParfloat();
-			$aExportFields['rev_impo_tax_ad_par_float']=$this->getRevImpoTaxeADParfloat();
-			$aExportFields['exo_tax_ad_par']=$this->getExoTaxeADPar();
-			$aExportFields['rev_impo_tax_ad_par']=$this->getRevImpoTaxeADPar();
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs ccodep et ccodir.
-	* /return Retourne une chaîne de caractères correspondant au DEP DIR du RP.
-	*/
-	function getDepdir(){
-		$sDepdir = $this->aFields['ccodep']." ".$this->aFields['ccodir'];
-		return $sDepdir;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs ccocom et libcom.
-	* /return Retourne une chaîne de carcatères correspondant au COM du RP.
-	*/
-	function getCom(){
-		$sCom = $this->aFields['ccocom']." ".$this->aFields['libcom'];
-		return $sCom;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable total du bâti.
-	* \return Retourne un entier.
-	*/
-	function getRevImpoBati(){
-		$iRevImpoBati=0;
-		foreach($this->aBat as $oBat){
-			$iRevImpoBati=$iRevImpoBati+ (int) $oBat->getRevenuCadastral();;
-		}
-		return $iRevImpoBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable total du bâti.
-	* \return Retourne un float.
-	*/
-	function getRevImpoBatifloat(){
-		$fRevImpoBati=0;
-		foreach($this->aBat as $oBat){
-			$fRevImpoBati=$fRevImpoBati+ (float) $oBat->getRevenuCadastralfloat();;			
-		}
-		return $fRevImpoBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération communale totale du bâti.
-	* \return Retourne un entier
-	*/
-	function getExoComBati(){
-		$iExoComBati=0;
-		foreach($this->aBat as $oBat){
-			$iExoComBati=$iExoComBati + $oBat->getExoneration($oPro->aFields['l_ccodem']);
-		}
-		return $iExoComBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération communale totale du bâti.
-	* \return Retourne un float
-	*/
-	function getExoComBatifloat(){
-		$fExoComBati=0;
-		foreach($this->aBat as $oBat){
-			$fExoComBati=$fExoComBati + $oBat->getExonerationfloat($oPro->aFields['l_ccodem']);
-		}
-		return $fExoComBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable communal du bâti en fonction du revenu imposable total (bâti) et de l'exonération communale totale (bâti).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoComBati(){
-		$iRevImpoComBati=$this->getRevImpoBati()-$this->getExoComBati($oPro->aFields['l_ccodem']);
-		return $iRevImpoComBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable communal du bâti en fonction du revenu imposable total (bâti) et de l'exonération communale totale (bâti).
-	* \return Retourne un float.
-	*/
-	function getRevImpoComBatifloat(){
-		$fRevImpoComBati=$this->getRevImpoBatifloat()-$this->getExoComBatifloat($oPro->aFields['l_ccodem']);
-		return $fRevImpoComBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération départementale totale du bâti.
-	* \return Retourne un entier
-	*/
-	function getExoDepBati(){
-		$iExoDepBati=0;
-		foreach($this->aBat as $oBat){
-			$iExoDepBati=$iExoDepBati + $oBat->getExoneration($oPro->aFields['l_ccodem']);
-		}
-		return $iExoDepBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération départementale totale du bâti.
-	* \return Retourne un float
-	*/
-	function getExoDepBatifloat(){
-		$fExoDepBati=0;
-		foreach($this->aBat as $oBat){
-			$fExoDepBati=$fExoDepBati + $oBat->getExonerationfloat($oPro->aFields['l_ccodem']);
-		}
-		return $fExoDepBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable départemental du bâti en fonction du revenu imposable total (bâti) et de l'exonération départemantale totale (bâti).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoDepBati(){
-		$iRevImpoDepBati=$this->getRevImpoBati()-$this->getExoDepBati();
-		return $iRevImpoDepBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable départemental du bâti en fonction du revenu imposable total (bâti) et de l'exonération départemantale totale (bâti).
-	* \return Retourne un float.
-	*/
-	function getRevImpoDepBatifloat(){
-		$fRevImpoDepBati=$this->getRevImpoBatifloat()-$this->getExoDepBatifloat();
-		return $fRevImpoDepBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération régionale totale du bâti.
-	* \return Retourne un entier
-	*/
-	function getExoRegBati(){
-		$iExoRegBati=0;
-		foreach($this->aBat as $oBat){
-			$iExoRegBati=$iExoRegBati + $oBat->getExoneration($oPro->aFields['l_ccodem']);
-		}
-		return $iExoRegBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération régionale totale du bâti.
-	* \return Retourne un float
-	*/
-	function getExoRegBatifloat(){
-		$fExoRegBati=0;
-		foreach($this->aBat as $oBat){
-			$fExoRegBati=$fExoRegBati + $oBat->getExonerationfloat($oPro->aFields['l_ccodem']);
-		}
-		return $fExoRegBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable régional du bâti en fonction du revenu imposable total (bâti) et de l'exonération régionale totale (bâti).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoRegBati(){
-		$iRevImpoRegBati=$this->getRevImpoBati()-$this->getExoRegBati();
-		return $iRevImpoRegBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable régional du bâti en fonction du revenu imposable total (bâti) et de l'exonération régionale totale (bâti).
-	* \return Retourne un float.
-	*/
-	function getRevImpoRegBatifloat(){
-		$fRevImpoRegBati=$this->getRevImpoBatifloat()-$this->getExoRegBatifloat();
-		return $fRevImpoRegBati;
-	}
-	/**
-	* Cette méthode permet de calculer l'emprise bâtie totale des parcelles.
-	* \return Retourne un entier.
-	*/
-	function getTotalContenanceBati(){
-		$iContenance = 0;
-		foreach($this->aPar as $oPar){
-			foreach($oPar->aIntersect as $oIntersect){
-				$iContenanceBati = $iContenanceBati + $oIntersect->getEmpriseTotale();
-			}
-		}
-		return $iContenanceBati;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable total des parcelles.
-	* \return Retourne un entier.
-	*/
-	function getRevImpoPar(){
-		$fRevImpoPar=0;
-		foreach($this->aPar as $oPar){
-			$fRevImpoPar=$fRevImpoPar+ (float) $oPar->getRevenuCadastral();
-			$iRevImpoPar=round($fRevImpoPar);
-		}
-		return $iRevImpoPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable total des parcelles.
-	* \return Retourne un float.
-	*/
-	function getRevImpoParfloat(){
-		$fRevImpoPar=0;
-		foreach($this->aPar as $oPar){
-			$fRevImpoPar=$fRevImpoPar+ (float) $oPar->getRevenuCadastral();
-		}
-		return $fRevImpoPar;
-	}
-	/** DEPRECATED
-	/**
-	* Cette méthode permet de calculer l'exonération (départementale et régionale) totale des parcelles.
-	* \return Retourne un entier
-	*/
-	/*
-	function getExoDepRegPar(){
-		$fExoDepRegPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoDepRegPar=$fExoDepRegPar + $oPar->getRevenuCadastralAvecExo();
-		}
-		$iExoDepRegPar = round($fExoDepRegPar);
-		return $iExoDepRegPar;
-	}
-	*/
-	/**
-	* Cette méthode permet de calculer le revenu imposable (départemental et régional) des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération (départementale et régionale) totale (parcelles).
-	* \return Retourne un entier.
-	*/
-	/*
-	function getRevImpoDepRegPar(){
-		$iRevImpoDepRegPar=$this->getRevImpoPar()-$this->getExoDepRegPar();
-		return $iRevImpoDepRegPar;
-	}
-	*/
-	/**
-	* Cette méthode permet de calculer l'exonération départementale totale des parcelles.
-	* \return Retourne un entier
-	*/
-	function getExoDepPar(){
-		$fExoDepPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoDepPar=$fExoDepPar + $oPar->getRevenuCadastralDepAvecExo();
-		}
-		$iExoDepPar = round($fExoDepPar);
-		return $iExoDepPar;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération départementale totale des parcelles.
-	* \return Retourne un float
-	*/
-	function getExoDepParfloat(){
-		$fExoDepPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoDepPar=$fExoDepPar+$oPar->getRevenuCadastralDepAvecExo();
-		}
-		return $fExoDepPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable départemental des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération (départementale et régionale) totale (parcelles).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoDepPar(){
-		$iRevImpoDepPar=$this->getRevImpoPar()-$this->getExoDepPar();
-		return $iRevImpoDepPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable départemental des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération (départementale et régionale) totale (parcelles).
-	* \return Retourne un float.
-	*/
-	function getRevImpoDepParfloat(){
-		$fRevImpoDepPar=$this->getRevImpoParfloat()-$this->getExoDepParfloat();
-		return $fRevImpoDepPar;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération régionale totale des parcelles.
-	* \return Retourne un entier
-	*/
-	function getExoRegPar(){
-		$fExoRegPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoRegPar=$fExoRegPar + $oPar->getRevenuCadastralRegAvecExo();
-		}
-		$iExoRegPar = round($fExoRegPar);
-		return $iExoRegPar;
-	}
-	/**
-	* Cette méthode permet de calculer l'exonération régionale totale des parcelles.
-	* \return Retourne un float
-	*/
-	function getExoRegParfloat(){
-		$fExoRegPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoRegPar=$fExoRegPar + $oPar->getRevenuCadastralRegAvecExo();
-		}
-		return $fExoRegPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable régional des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération (départementale et régionale) totale (parcelles).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoRegPar(){
-		$iRevImpoRegPar=$this->getRevImpoPar()-$this->getExoRegPar();
-		return $iRevImpoRegPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable régional des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération (départementale et régionale) totale (parcelles).
-	* \return Retourne un float.
-	*/
-	function getRevImpoRegParfloat(){
-		$fRevImpoRegPar=$this->getRevImpoParfloat()-$this->getExoRegParfloat();
-		return $fRevImpoRegPar;
-	}
-	/**
-	* Cette méthode permet de calculer la contenance totale des parcelles.
-	* \return Retourne un entier.
-	*/
-	function getTotalContenance(){
-		$iContenance = 0;
-		foreach($this->aPar as $oPar){
-			$iContenance = $iContenance + $oPar->aFields['dcntpa'];
-		}
-		return $iContenance;
-	}
-	/**
-	* Cette méthode permet de calculer la contenance totale des parcelles en mettre carré. 
-	* \return Retourne un entier.
-	*/
-	function getTotalContenanceM2(){
-		$iContenanceM2=0;
-		foreach($this->aPar as $oPar){
-			$iContenanceM2 = $iContenanceM2 + $oPar->getContenance();
-		}
-		return $iContenanceM2;
-	}
-	/**
-	* Cette méthode permet de récupérer le revenu cadastral total des parcelles.
-	* \return Retourne un double
-	*/
-	function getRevenuCadastralTotal(){
-		$dRevCadastralTotal=0;
-		foreach($this->aPar as $oPar){
-			$dRevCadastralTotal=$dRevCadastralTotal + $oPar->getRevenuCadastral();
-		}
-		//$iRevCadastralTotal = round($dRevCadastralTotal);
-		return $dRevCadastralTotal;
-	}
-	/**
-	* Cette méthode permet de calculer l'éxonération communale totale des parcelles.
-	* \return Retourne 0;
-	*/
-	function getExoComPar(){
-		$iExoComPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoComPar=$fExoComPar + $oPar->getRevenuCadastralComAvecExo();
-		}
-		$iExoComPar = round($fExoComPar);
-		return $iExoComPar;
-	}
-	/**
-	* Cette méthode permet de calculer l'éxonération communale totale des parcelles.
-	* \return Retourne 0;
-	*/
-	function getExoComParfloat(){
-		$fExoComPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoComPar=$fExoComPar + $oPar->getRevenuCadastralComAvecExo();
-		}
-		return $fExoComPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable communal des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération communale totale (parcelles).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoComPar(){
-		$iRevImpoComPar=$this->getRevImpoPar()-$this->getExoComPar();
-		return $iRevImpoComPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable communal des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération communale totale (parcelles).
-	* \return Retourne un float.
-	*/
-	function getRevImpoComParfloat(){
-		$fRevImpoComPar=$this->getRevImpoParfloat()-$this->getExoComParfloat();
-		return $fRevImpoComPar;
-	}
-	function getExoTaxeADPar(){
-		$iExoTaxeAdPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoTaxeADPar=$fExoTaxeADPar + $oPar->getRevenuCadastralTaxeADAvecExo();
-		}
-		$iExoTaxeADPar = round($fExoTaxeADPar);
-		return $iExoTaxeADPar;
-	}
-	/**
-	* Cette méthode permet de calculer l'éxonération des taxes additionnelles totale des parcelles.
-	* \return Retourne 0;
-	*/
-	function getExoTaxeADParfloat(){
-		$fExoTaxeADPar=0;
-		foreach($this->aPar as $oPar){
-			$fExoTaxeADPar=$fExoTaxeADPar + $oPar->getRevenuCadastralTaxeADAvecExo();
-		}
-		return $fExoTaxeADPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable des taxes additionnelles des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération communale totale (parcelles).
-	* \return Retourne un entier.
-	*/
-	function getRevImpoTaxeAdPar(){
-		$iRevImpoTaxeADPar=$this->getRevImpoPar()-$this->getExoTaxeADPar();
-		return $iRevImpoTaxeADPar;
-	}
-	/**
-	* Cette méthode permet de calculer le revenu imposable des taxes additionnelles des parcelles en fonction du revenu imposable total (parcelles) et de l'exonération communale totale (parcelles).
-	* \return Retourne un float.
-	*/
-	function getRevImpoTaxeADParfloat(){
-		$fRevImpoTaxeADPar=$this->getRevImpoParfloat()-$this->getExoTaxeADParfloat();
-		return $fRevImpoTaxeADPar;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur locative totale du bâti.
-	* \return Retourne un double
-	*/
-	function getValeurLocativeBati(){
-		$iValeurLocativeBati=0;
-		foreach($this->aBat as $oBat){
-			$iValeurLocativeBati= $oBat->aFields['dvlpera'] + $iValeurLocativeBati;
-		}
-		return $iValeurLocativeBati;
-	}
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Compte_Communal_Parcelle.class.inc b/web_service/class/majic_lib/Mj_Compte_Communal_Parcelle.class.inc
deleted file mode 100755
index d78f88fe044ec4bbc9bba4bc9564d0b25390587e..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Compte_Communal_Parcelle.class.inc
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-/**
-* \file Mj_Compte_Communal_Parcelle.class.inc
-* \brief Mj_Compte_Communal_Parcelle.class.inc \n \n Ce fichier contient la classe php Mj_Compte_Communal_Parcelle
-*
-* Cette classe permet de s�lectionner les attributs n�cessaires afin de traiter un relev� de propri�t� en fonction d'un compte communal et d'un num�ro de parcelle.
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj_Compte_Communal.class.inc");
-
-class Mj_Compte_Communal_Parcelle extends Mj_Compte_Communal {
-	/**
-	* Identifiant national de la parcelle sur 15 caract�res.
-	*/
-	var $sIdPar;
-	/**
-	* Bool�en servant � savoir si on recherche une parcelle avec tout les batiments
-	*/
-	var $bFP=false;
-
-	/**
-	* \param $sIdDnupro peut etre vide, un identifiant sera d�fini par une requete sql sur l'identifiant parcelle
-	* \param $sIdPar Identifiant de la parcelle.
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdDnupro,$sIdPar,$oBD,$bFP=false,$sEncryptedKey='',$AllSuf=false){
-		$this->bAllSuf=$AllSuf;
-		$this->sEncryptKey=$sEncryptedKey;
-		include $this->sRessourcesFile;
-		if($sIdDnupro==""){
-			$sSql=$aSql[$oBD->sgbd]['get_id_dnupro'];
-			$sSql=str_replace('idparpro', $sIdPar, $sSql);
-			$oPDOresult=$oBD->execute($sSql);
-			$aIdDnuProSql=$oBD->ligneSuivante ($oPDOresult);
-			$sIdDnupro=$aIdDnuProSql['iddnupro'];
-			$sDnupro=$aIdDnuProSql['dnupro'];
-			$oPDOresult=$oBD->fermeResultat();
-		}
-		$this->sSql=$aSql[$oBD->sgbd]['compte_communal_parcelle'];
-		$this->sSql=str_replace('$sIdDnupro', $this->encrypt($sIdDnupro), $this->sSql);
-		$this->sSql=str_replace('$sIdPar', $sIdPar, $this->sSql);
-		$oPDOresult= $oBD->execute($this->sSql);
-		if($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			if($aCompteCom=$oBD->ligneSuivante($oPDOresult)){
-				$this->aFields=$aCompteCom;
-				$this->aFields['id_dnupro']=$sIdDnupro;
-				//$this->aFields['dnupro']=$sIdDnupro;
-				$this->sStatus=0;
-				$oPDOresult=$oBD->fermeResultat();
-				$this->aPro=$this->get_aPro($oBD);
-				$this->aBat=$this->get_aBat($oBD,$bFP);
-				$this->aPar=$this->get_aPar($oBD,$sIdPar,$sIdDnupro);
-				// r�cup�ration de l'ann�e de r�f�rence
-				$this->sSql=$aSql[$oBD->sgbd]['annee_reference'];
-				$oPDOresult=$oBD->execute($this->sSql);
-				if($oBD->enErreur()){
-					$this->sStatus=1;
-					$this->sMessage=$oBD->getBDMessage();
-				}else{
-					$aAnneeReference=$oBD->ligneSuivante ($oPDOresult);
-					$this->sAnneeReference=$aAnneeReference['ANNEE'];
-				}
-				$oPDOresult=$oBD->fermeResultat();
-				$this->aObjects=array_merge ($this->aPro,$this->aBat,$this->aPar);
-			}else{
-				$this->sStatus=1;
-				$this->sMessage="Aucun compte communal trouv� pour la parcelle : ".$sIdPar;
-				$oPDOresult=$oBD->fermeResultat();
-			}
-		}
-	}
-	/**
-	* Cette m�thode permet de r�cup�rer les ID_BAT en fonction d'un ID_DNUPRO donn�
-	* \return Retourne un tableau de ID_BAT
-	*/
-	function get_aId_Bat($sIdPar, $oBD, $bFP){
-		if($this->isEmpty()){
-			$aIdBat="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdBat=array();
-			if (!$bFP){
-				$this->sSql=$aSql[$oBD->sgbd]['get_id_bat_parcelle'];
-				$this->sSql=str_replace('$sIdDnupro', $this->aFields['id_dnupro'], $this->sSql);
-				$this->sSql=str_replace('$sIdPar', $this->aFields['id_par'], $this->sSql);
-			}else{
-				$this->sSql=$aSql[$oBD->sgbd]['get_par_id_bat'];
-				$this->sSql=str_replace('sIdPar', $this->aFields['id_par'], $this->sSql);
-			}
-			$oPDOresult= $oBD->execute($this->sSql);
-			if($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch = $oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdBat,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdBat;
-	}
-	/**
-	* Cette m�thode permet de r�cup�rer la liste des objets BATI
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau d'objets BATI
-	*/
-	function get_aBat($oBD,$bFP){
-		$aBat=array();
-		if($this->isEmpty()){
-			$aBat="";
-		}else{
-			$aIdBat=$this->get_aId_Bat($sIdPar,$oBD,$bFP);
-			foreach($aIdBat as $sIdBat){
-				array_push($aBat,new Mj_Bati($sIdBat,$oBD, $this->sEncryptKey));
-			}
-		}
-		return $aBat;
-	}
-	/**
-	* Cette m�thode permet de r�cup�rer la liste des objets PARCELLE
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $sIdDnupro Identifiant du propri�taire
-	* \return Retourne un tableau d'objets PARCELLE
-	*/
-	function get_aPar($oBD,$sIdPar,$sIdDnupro){
-		$aPar=array();
-		if($this->isEmpty()){
-			$aPar="";
-		}else{
-			$aIdPar=Array($sIdPar);
-			foreach($aIdPar as $sIdPar){
-				array_push($aPar,new Mj_Parcelle($oBD,$sIdPar,$sIdDnupro,$this->sEncryptKey,$this->bAllSuf));
-			}
-		}
-		return $aPar;
-	}
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Compte_Communal_Parcelles.class.inc b/web_service/class/majic_lib/Mj_Compte_Communal_Parcelles.class.inc
deleted file mode 100755
index 8b938de3a2067a6e92066c58cb2d8adec15aa4a6..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Compte_Communal_Parcelles.class.inc
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
-* \file Mj_Bati_Parcelles.class.inc
-* \brief Mj_Bati_Parcelles.class.inc \n \n Ce fichier contient la classe php Mj_Bati_Parcelles
-*
-* Cette classe permet de s�lectionner les attributs n�cessaires afin de traiter les batis associ�s � une parcelle.
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-require_once ("Mj_Compte_Communal_Parcelle.class.inc");
-
-class Mj_Compte_Communal_Parcelles extends Mj {
-
-	/**
-	* \param $aIdPar Tableau Identifiants des parcelles
-	* \param $oBD Objet de connexion
-	* \param $properties Tableau des propri�t�s
-	* \param $sLayerTypeParcelle Chaine Type de g�om�trie des parcelles
-	*/
-	function __construct($aIdPar,$oBD,$properties,$sLayerTypeParcelle){
-		$i=0;
-		while ($aIdPar[$i]){
-			array_push ($this->aObjects, new Mj_Compte_Communal_Parcelle("",$aIdPar[$i],$oBD));
-			$i++;
-		}
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptParcelle){
-			foreach($oCptParcelle->getObjects('Mj_Parcelle') as $oParcelle){
-				$oParcelle->getEmprises($properties,$oBD,$sLayerTypeParcelle);
-				foreach($oParcelle->getObjects('Mj_Emprises') as $oEmprises){
-					if($oEmprises->isError()){
-						$this->sStatus=1;
-						$this->sMessage="Erreur lors des r�cup�rations des emprises, consulter le error.log";
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	* \brief R�cup�ration de la surface totale des parcelles
-	*/
-	function getSurfaceCadastrale() {
-		$dSurfaceCadastrale = 0;
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptCom) {
-			$aFields=$oCptCom->getExportFields();
-			$dSurfaceCadastrale = $aFields['total_contenance'] + $dSurfaceCadastrale;
-		}
-		return $dSurfaceCadastrale;
-	}
-	/**
-	* \brief R�cup�ration de la surface totale des parcelles en mettre carr�
-	*/
-	function getSurfaceCadastraleM2() {
-		$dSurfaceCadastraleM2 = 0;
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptCom) {
-			$aFields=$oCptCom->getExportFields();
-			$dSurfaceCadastraleM2 = $aFields['total_contenance_m2'] + $dSurfaceCadastraleM2;
-		}
-		return $dSurfaceCadastraleM2;
-	}
-	/**
-	* \brief R�cup�ration des revenus de la subdivision fiscale des parcelles
-	*/
-	function getRevenuCadastral() {
-		$dRevenuCadastral=0;
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptCom) {
-			$aFields=$oCptCom->getExportFields();
-			$dRevenuCadastral = $aFields['total_revenu_cadastral'] + $dRevenuCadastral;
-		}
-		return $dRevenuCadastral;
-	}
-
-	/**
-	* \brief R�cup�ration des valeurs locatives
-	*/
-	function getValeurLocative() {
-		$dValeurLocative=0;
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptCom) {
-			$aFields=$oCptCom->getExportFields();
-			$dValeurLocative=$aFields['total_valeur_locative'] + $dValeurLocative;
-		}
-		return $dValeurLocative;
-	}
-	/**
-	* \brief R�cup�ration de la emprises b�ties totale des parcelles
-	*/
-	function getSurfaceCadastraleBati() {
-		$dSurfaceCadastraleBati = 0;
-		foreach($this->getObjects('Mj_Compte_Communal_Parcelle') as $oCptCom) {
-			foreach($oCptCom->getObjects('Mj_Parcelle') as $oParcelle){
-		  		foreach($oParcelle->getObjects('Mj_Emprises') as $oEmprises){
-					$aFields=$oEmprises->getExportFields();
-		  			if($aFields['titre']=="Emprise Bati"){
-						$dSurfaceCadastraleBati = $aFields['emprise_totale_intersect'] + $dSurfaceCadastraleBati;
-		  			}
-		  		}
-			}
-		}
-		return $dSurfaceCadastraleBati;
-	}
-	/**
-	* \brief Cette m�thode permet de construire un tableau correspondant au relev� de propri�t�.
-	* \return Retourne un tableau associatif correspondant au relev� de propri�t�.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if(!empty($this->aObjects)){
-			//partie des sommes (surfaces,revenus,valeurs locatives)
-			$aExportFields['Sum_revenu']=$this->getRevenuCadastral();
-			$aExportFields['Sum_contenance']=$this->getSurfaceCadastrale();
-			$aExportFields['Sum_contenance_m2']=$this->getSurfaceCadastraleM2();
-			$aExportFields['Sum_valeur_locative']=$this->getValeurLocative();
-			$aExportFields['Sum_contenance_bati']=$this->getSurfaceCadastraleBati();
-		}
-		return $aExportFields;
-	}
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Depend_Descr.class.inc b/web_service/class/majic_lib/Mj_Depend_Descr.class.inc
deleted file mode 100755
index e525d7bbea0fd8e5f9937d5287cc658181ab74db..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Depend_Descr.class.inc
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/**
-* \file Mj_Depend_Descr.class.inc
-* \brief Mj_Depend_Descr.class.inc \n \n Ce fichier contient la classe php Mj_Depend_Descr
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Description Dépendance.
-*
-* \author John Bosch
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-
-class Mj_Depend_Descr extends Mj {
-	/**
-	* \param $sIdDep Identifiant de la dépendance
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdDep,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['depend_descr'];
-		$this->sSql=str_replace('$sIdDep',$sIdDep,$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->aFields=$oBD->ligneSuivante($oPDOresult);
-			$this->sStatus=0;
-		}
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété/Fiche Parcelle.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété/Fiche Parcelle.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['num_invar']=$this->aFields['invar'];
-			$aExportFields['num_pev']=$this->aFields['dnupev'];
-			$aExportFields['num_depend']=$this->aFields['dnudes'];
-			$aExportFields['nature']=$this->aFields['l_cconad'];
-			$aExportFields['surface']=$this->aFields['dsudep'];
-			$aExportFields['ponderation']=$this->aFields['dcimlc'];
-			$aExportFields['Etat']=$this->aFields['detent'];
-			$aExportFields['l_Etat']=$this->aFields['l_detent'];
-			$aExportFields['mat_gros_mur']=$this->aFields['dmatgm'];
-			$aExportFields['lib_mat_gros_mur']=$this->aFields['lib_dmatgm'];
-			$aExportFields['mat_toiture']=$this->aFields['dmatto'];
-			$aExportFields['lib_mat_toiture']=$this->aFields['lib_dmatto'];
-			$aExportFields['nb_baignoires']=$this->aFields['dnbbai'];
-			$aExportFields['nb_douches']=$this->aFields['dnbdou'];
-			$aExportFields['nb_lavabos']=$this->aFields['dnblav'];
-			$aExportFields['nb_wc']=$this->aFields['dnbwc'];
-			$aExportFields['eau']=$this->getEau();
-			$aExportFields['elect']=$this->getElect();
-			$aExportFields['chauf']=$this->getChauf();
-		}
-		return $aExportFields;
-	}
-
-	/*
-	DEPRECATED 2013
-	function getNature(){
-		if ($this->aFields['cconad'] == "TR") {
-			return "Terrasse(s)";
-		}
-		if ($this->aFields['cconad'] == "CV") {
-			return "Cave(s)";
-		}
-		if ($this->aFields['cconad'] == "GR") {
-			return "Grenier(s)";
-		}
-		if ($this->aFields['cconad'] == "GA") {
-			return "Garage(s)";
-		}
-	}
-	*/
-
-	function getEau(){
-		if($this->aFields["geaulc"] == "O"){
-			return "EAU";
-		}
-	}
-
-	function getElect(){
-		if($this->aFields["gelelc"] == "O"){
-			return "ELECT";
-		}
-	}
-
-	function getChauf(){
-		if($this->aFields["gchclc"] == "O"){
-			return "CHAUF";
-		}
-	}
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Emprise.class.inc b/web_service/class/majic_lib/Mj_Emprise.class.inc
deleted file mode 100755
index 2ff7cf3dcd698e721a08929146ab3578334fde06..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Emprise.class.inc
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
-* \file Mj_Emprise.class.inc
-* \brief Mj_Emprise.class.inc \n \n Ce fichier contient la classe php Mj_Emprise
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie parcelle. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-/**
-* \class Mj_Emprise
-* \brief Mj_Emprise Class \n \n Mj_Emprise est une classe PHP qui hérite de la classe Mj_Emprise.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Emprise. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Attributes.class.inc");
-
-class Mj_Emprise extends Mj {
-
-	var $sIdEmprise="";
-	/**
-	* Tableau
-	*/
-	var $aAttributesEmprise= array();
-
-	/**
-	* Cette méthode métier permet de récupérer les informations sur les couches intersectées par la surface de la parcelle interrogée.
-	* \param $aField Tableau des noms de champs associées à la vue utilisée.
-	* \param $aRow
-	* \param $iCompteur
-	* \param $iTolerance Valeur minimum de surface intersecté à partir de laquelle le contenu d'un enregistrement est affiché.
-	*/
-	function __construct($aField,$aRow,$iCompteur, $iTolerance) {
-		$aEmpriseParcelle= array();
-		switch(strtoupper($aField["type"])) {
-			case "POINT" :
-				$aEmpriseParcelle["intersectsuf"] = $aRow;
-				$this->sIdEmprise=$iCompteur;
-			break;
-			case "LINE" :
-				if(round($aRow["intersect"]) >= $iTolerance){
-					$aEmpriseParcelle["intersectsuf"] = $aRow;
-					$aEmpriseParcelle["intersectsuf"]["intersect_label"]= $aEmpriseParcelle["intersectsuf"]["intersect"]." m";
-					$this->sIdEmprise=$iCompteur;
-				}else{
-					$aEmpriseParcelle["intersectsuf"]["intersect"] = "0";
-					$aEmpriseParcelle["intersectsuf"]["intersect_label"] = "0 m";
-					$this->sIdEmprise=$iCompteur;
-				}
-			break;
-			case "POLYGON" :
-				if(round($aRow["intersect"]) >= $iTolerance){
-					$aEmpriseParcelle["intersectsuf"] = $aRow;
-					$aEmpriseParcelle["ratio"] = @(round(($aEmpriseParcelle["intersectsuf"]["intersect"] / $aEmpriseParcelle["intersectsuf"]["suf_parcelle"]), 2) * 100);
-					$aEmpriseParcelle["intersectsuf"]["intersect_label"].=$aEmpriseParcelle["intersectsuf"]["intersect"]." m²";
-					$aEmpriseParcelle["ratio_label"]=$aEmpriseParcelle["ratio"]." %";
-					$this->sIdEmprise=$iCompteur;
-				}else{
-					$aEmpriseParcelle["intersectsuf"]["intersect"]="0";
-					$aEmpriseParcelle["intersectsuf"]["intersect_label"]="0 m²";
-					$aEmpriseParcelle["ratio"]= "0";
-					$aEmpriseParcelle["ratio_label"]=$aEmpriseParcelle["ratio"]." %";
-					$this->sIdEmprise=$iCompteur;
-				}
-			break;
-		}
-		$this->aFields=$aEmpriseParcelle;
-		if(is_array($aEmpriseParcelle)){
-			array_push($this->aAttributesEmprise, new Mj_Attributes($aEmpriseParcelle,$aField));
-		}
-		$this->aObjects=$this->aAttributesEmprise;
-	}
-
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['emprise_intersect']=$this->aFields["intersectsuf"]["intersect"];
-			$aExportFields['emprise_intersect_label']=$this->aFields["intersectsuf"]["intersect_label"];
-			if($this->aFields["ratio"]){
-				$aExportFields['emprise_ratio']=$this->aFields["ratio"];
-				$aExportFields['emprise_ratio_label']=$this->aFields["ratio_label"];
-			}
-			$aExportFields['id_emprise']=$this->sIdEmprise;
-		}
-		return $aExportFields;
-	}
-
-}
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Emprises.class.inc b/web_service/class/majic_lib/Mj_Emprises.class.inc
deleted file mode 100755
index df3969ca90f14ade589b68fbf7f09923962d58dc..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Emprises.class.inc
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-/**
-* \file Mj_Emprises.class.inc
-* \brief Mj_Emprises.class.inc \n \n Ce fichier contient la classe php Mj_Emprises
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie parcelle. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-/**
-* \class Mj_Emprises
-* \brief Mj_Emprises Class \n \n Mj_Emprises est une classe PHP qui hérite de la classe Mj_Parcelle.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Emprises. 
-*
-* \author Nicolas Chazeau
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Parcelle.class.inc");
-require_once ("Mj_Emprise.class.inc");
-
-class Mj_Emprises extends Mj {
-
-	/**
-	* Cette méthode métier permet de récupérer les informations sur les couches intersectées par la surface de la parcelle intérrogée.
-	* \param $oCadastre Objet classe Cadastre.
-	* \param $sIdPar Identifiant de la parcelle sélectionnée.
-	* \param $sView Vue Postgis à interroger.
-	* \param $iTolerance Valeur minimum de surface intersecté à partir de laquelle le contenu d'un enregistrement est affiché.
-	* \param $aField Tableau des noms de champs associées à la vue utilisée.
-	* \param $sLayerType Type de géométrie contenue dans la couche parcelle de référence.
-	* \param $sInclude Fichier de rendu (*.vhtml) à afficher en cas d'erreur.
-	* \param $sType (Facultatif) Paramètre signifiant si on veut un tableau HTML (par défaut) ou aucune mise en forme en sortie (valeurs possibles : HTML, TEXT).
-	* \private
-	* \return Un tableau HTML sous la forme d'une chaîne de caractères.
-	*/
-
-	/**
-	* Tableau associatif comportant la liste des objets Emprises d'une parcelle
-	*/
-	var $aEmprisesParcellesSuf=array();
-
-	function __construct($oBD, $sIdPar, $sView, $iTolerance, $aField, $sLayerType) {
-		$sFunction = "";
-		switch(strtoupper($aField["type"])) {
-			case "POINT" :
-				$sFunction.= "st_area2d";
-			break;
-			case "LINE" :
-				$sFunction.= "st_length2d";
-			break;
-			case "POLYGON" :
-				$sFunction.= "st_area2d";
-			break;
-		}
-		($sLayerType == "polygon") ? $sPrcTable = "v_parcelle" : $sPrcTable = "v_parcelle_point";
-
-		$sSql = "SELECT CAST(".$sFunction."(st_intersection(".$sPrcTable.".geom, CASE WHEN st_srid(".$sPrcTable.".geom) = st_srid(".$sView.".geom) THEN ".$sView.".geom ELSE st_transform(".$sView.".geom, st_srid(".$sPrcTable.".geom)) END)) AS DECIMAL(10,1)) AS intersect, ";
-		$sSql.= "st_area2d(".$sPrcTable.".geom) AS suf_parcelle, ".$sView.".* FROM ".$sPrcTable.", ".$sView." WHERE ";
-		$sSql.= "st_intersects(".$sPrcTable.".geom, CASE WHEN st_srid(".$sPrcTable.".geom) = st_srid(".$sView.".geom) THEN ".$sView.".geom ELSE st_transform(".$sView.".geom, st_srid(".$sPrcTable.".geom)) END) ";
-		$sSql.= "AND ".$sPrcTable.".id_par = '".$sIdPar."' ;";
-
-		$iResult=$oBD->execute($sSql);
-		if ($oBD->enErreur()) {
-			$this->sStatus = 1;
-			$this->sMessage = $oBD->getBDMessage();
-		}else{
-			$i=0;
-			while($aRow = $oBD->ligneSuivante ($iResult)) {
-				$oEmprise=new Mj_Emprise($aField,$aRow,$i,$iTolerance);
-				if($oEmprise->aFields["intersectsuf"]["intersect"]!="0"){
-					array_push($this->aEmprisesParcellesSuf,$oEmprise);
-					$i++;
-				}
-			}
-			$iResult = $oBD->fermeResultat();
-		}
-		$aValue["titre"]=$aField["title"];
-		$aValue["type_geom"]=$aField["type"];
-		$this->aFields=$aValue;
-		$this->aObjects=$this->aEmprisesParcellesSuf;
-	}
-	/*
-	* Récupère l'emprise totale d'un ensemble d'emprise (bati ou pos ou servitude etc)
-	* \return Décimal l'emprise totale
-	*/
-	function getEmpriseTotale() {
-		$dEmpriseTotale = 0;
-		foreach ($this->aEmprisesParcellesSuf as $oEmprise) {
-			$dEmpriseTotale = $dEmpriseTotale + (float) $oEmprise->aFields["intersectsuf"]["intersect"];
-		}
-		return $dEmpriseTotale;
-	}
-
-	function getEmpriseRatioTotale() {
-		$dEmpriseRatioTotale = 0;
-		foreach ($this->aEmprisesParcellesSuf as $oEmprise) {
-			$dEmpriseRatioTotale = $dEmpriseRatioTotale + (float) $oEmprise->aFields["ratio"];
-		}
-		return $dEmpriseRatioTotale;
-	}
-
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['titre']=$this->aFields["titre"];
-			$aExportFields['type_geom']=$this->aFields["type_geom"];
-			$aExportFields['emprise_totale_intersect']=$this->getEmpriseTotale();
-			$aExportFields['emprise_totale_ratio']=$this->getEmpriseRatioTotale();
-		}
-		return $aExportFields;
-	}
-
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Exon_Suf.class.inc b/web_service/class/majic_lib/Mj_Exon_Suf.class.inc
deleted file mode 100755
index 0d7f97aa975ce564703a290a7509d19910c01e14..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Exon_Suf.class.inc
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/**
-* \file Mj_Exon_Suf.class.inc
-* \brief Mj_Exon_Suf.class.inc \n \n Ce fichier contient la classe php Mj_Exon_Suf
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Exon-Suf.
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Exon_Suf
-* \brief Mj_Exon_Suf Class \n \n Mj_Exon_Suf est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Exon-Suf.
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-
-class Mj_Exon_Suf extends Mj {
-	/**
-	* \param $sIdSuf Identifiant de l'exonération de la partie d'évaluation
-	* \param $sRnuexn Numéro d'ordre d'exoneration temporaire
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdSuf,$sRnuexn,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql = $aSql[$oBD->sgbd]['exon_suf'];
-		$this->sSql = str_replace('$sIdSuf', $sIdSuf, $this->sSql);
-		$this->sSql = str_replace('$sRnuexn', $sRnuexn, $this->sSql);
-		$oPDOresult= $oBD->execute($this->sSql);
-		if ( $oBD->enErreur()) {
-			$this->sStatus=1;
-			$this->sMessage = $oBD->getBDMessage();
-		}else{
-			$this->aFields =  $oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['rnuexn']=$this->aFields['rnuexn'];
-			$aExportFields['ccolloc']=$this->aFields['ccolloc'];
-			$aExportFields['nat_exo']=$this->aFields['gnexts'];
-			$aExportFields['jfinex']=$this->aFields['jfinex'];
-			$aExportFields['pexn']=$this->aFields['pexn'];
-			$aExportFields['rcexnba']=$this->aFields['rcexnba'];
-		}
-		return $aExportFields;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Exone_Pev.class.inc b/web_service/class/majic_lib/Mj_Exone_Pev.class.inc
deleted file mode 100755
index 9d2b1a68b1de64d542a4ed8234d3c977eea39a45..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Exone_Pev.class.inc
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
-* \file Mj_Exone_Pev.class.inc
-* \brief Mj_Exone_Pev.class.inc \n \n Ce fichier contient la classe php Mj_Exone_Pev
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Exone-Pev. 
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Exone_Pev
-* \brief Mj_Exone_Pev Class \n \n Mj_Exone_Pev est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Exone-Pev. 
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-
-class Mj_Exone_Pev extends Mj {
-	/**
-	* \param $sIdEx Identifiant de l'exonération de la partie d'évaluation
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdEx,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql = $aSql[$oBD->sgbd]['exone_pev'];
-		$this->sSql = str_replace('$sIdEx', $sIdEx, $this->sSql);
-		$oPDOresult= $oBD->execute($this->sSql);
-		if ($oBD->enErreur()) {
-			$this->sStatus=1;
-			$this->sMessage = $oBD->getBDMessage();  	
-		}else{
-			$this->aFields =  $oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		} 
-		else{
-			$aExportFields['coll']=$this->aFields['ccolloc'];
-			$aExportFields['nat_exo']=$this->aFields['gnextl'];
-			$aExportFields['an_ret']=$this->getAnret();
-			$aExportFields['an_deb']=$this->getAndeb();
-			$aExportFields['fraction_rc_exo']=$this->aFields['rcexba2'];
-			$aExportFields['pourc_exo']=$this->getPourcExo();
-			$aExportFields['tx_om']="<font color=red><b>Info Manquante</b></font>";
-			$aExportFields['coef']="<font color=red><b>Info Manquante</b></font>";
-		}
-		return $aExportFields;
-	}
-
-	/**
-	* Cette méthode permet de récupérer les deux derniers caractères de l'attribut janimp.
-	* /return Retourne une chaîne de caractères.
-	*/
-	function getAnret(){
-		$sAnret=$this->aFields['janimp'];
-		$sAnret= substr("$sAnret", 2, 2);
-		return $sAnret;
-	}
-	/**
-	* Cette méthode permet de récupérer les deux derniers caractères de l'attribut jandeb.
-	* /return Retourne une chaîne de caractères.
-	*/
-	function getAndeb(){
-		$sAndeb=$this->aFields['jandeb'];
-		$sAndeb= substr("$sAndeb", 2, 2);
-		return $sAndeb;
-	}
-	/**
-	* Cette méthode permet de récupérer le pourcentage d'éxonération à partir du champ 'pexb'.
-	* /return Retourne un entier
-	*/
-	function getPourcExo(){
-		$iPourcExo=(int)($this->aFields['pexb'])/100;
-		return $iPourcExo;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Habit_Descr.class.inc b/web_service/class/majic_lib/Mj_Habit_Descr.class.inc
deleted file mode 100755
index e22b0fcbd719c37011eccd40e8e1b07aa7c1fca9..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Habit_Descr.class.inc
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-/**
-* \file Mj_Habit_Descr.class.inc
-* \brief Mj_Habit_Descr.class.inc \n \n Ce fichier contient la classe php Mj_Habit_Descr
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Description Habitation.
-*
-* \author John Bosch
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-
-class Mj_Habit_Descr extends Mj {
-	/**
-	* \param $aIdDescrHab Identifiants de la partie Description Habitation (id_pev et dnudes) 
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($aIdDescrHab,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['habit_descr'];
-		$this->sSql=str_replace('$sIdPev',$aIdDescrHab['id_pev'],$this->sSql);
-		$this->sSql=str_replace('$sDnudes',$aIdDescrHab['dnudes'],$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->aFields=$oBD->ligneSuivante($oPDOresult);
-			$this->sStatus=0;
-		}
-	}
-
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété/Fiche Parcelle.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété/Fiche Parcelle.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['num_invar']=$this->aFields['invar'];
-			$aExportFields['num_pev']=$this->aFields['dnupev'];
-			$aExportFields['garage']=$this->getGarage();
-			$aExportFields['suf_garage']=$this->aFields['dsueic1'];
-			$aExportFields['cave']=$this->getCave();
-			$aExportFields['suf_cave']=$this->aFields['dsueic2'];
-			$aExportFields['grenier']=$this->getGrenier();
-			$aExportFields['suf_grenier']=$this->aFields['dsueic3'];
-			$aExportFields['terrasse']=$this->getTerrasse();
-			$aExportFields['suf_terrasse']=$this->aFields['dsueic4'];
-			$aExportFields['nb_baignoires']=$this->aFields['dnbbai'];
-			$aExportFields['nb_douches']=$this->aFields['dnbdou'];
-			$aExportFields['nb_lavabos']=$this->aFields['dnblav'];
-			$aExportFields['nb_wc']=$this->aFields['dnbwc'];
-			$aExportFields['nb_piece_principal']=$this->aFields['dnbppr'];
-			$aExportFields['nb_sam']=$this->aFields['dnbsam'];
-			$aExportFields['nb_chambre']=$this->aFields['dnbcha'];
-			$aExportFields['nb_cuisine_m9']=$this->aFields['dnbcu8'];
-			$aExportFields['nb_cuisine_p9']=$this->aFields['dnbcu9'];
-			$aExportFields['nb_salle_eau']=$this->aFields['dnbsea'];
-			$aExportFields['nb_annexe']=$this->aFields['dnbann'];
-			$aExportFields['nb_piece_total']=$this->aFields['dnbpdc'];
-			$aExportFields['suf_piece_total']=$this->aFields['dsupdc'];
-			$aExportFields['mat_gros_mur']=$this->aFields['dmatgm'];
-			$aExportFields['lib_mat_gros_mur']=$this->aFields['lib_dmatgm'];
-			$aExportFields['mat_toiture']=$this->aFields['dmatto'];
-			$aExportFields['lib_mat_toiture']=$this->aFields['lib_dmatto'];
-			$aExportFields['annee_constr']=$this->aFields['jannat'];
-			$aExportFields['Etat']=$this->aFields['detent'];
-			$aExportFields['l_Etat']=$this->aFields['l_detent'];
-			$aExportFields['nb_niveaux']=$this->aFields['dnbniv'];
-			$aExportFields['eau']=$this->getEau();
-			$aExportFields['elect']=$this->getElect();
-			$aExportFields['esc_serv']=$this->getEsc();
-			$aExportFields['gaz']=$this->getGaz();
-			$aExportFields['asc']=$this->getAsc();
-			$aExportFields['chauf']=$this->getChauf();
-			$aExportFields['vide_ord']=$this->getVide();
-			$aExportFields['egout']=$this->getEgout();
-		}
-		return $aExportFields;
-	}
-
-	function getGarage(){
-		if ($this->aFields['cconad1'] == "GA"){
-			return "Garage(s)";
-		}
-	}
-
-	function getCave(){
-		if ($this->aFields['cconad2'] == "CV"){
-			return "Cave(s)";
-		}
-	}
-
-	function getGrenier(){
-		if ($this->aFields['cconad3'] == "GR"){
-			return "Greniers(s)";
-		}
-	}
-
-	function getTerrasse(){
-		if ($this->aFields['cconad4'] == "TR"){
-			return "Terrasse(s)";
-		}
-	}
-
-	function getEau(){
-		if ($this->aFields["geaulc"] == "O"){
-			return "EAU";
-		}
-	}
-
-	function getElect(){
-		if ($this->aFields["gelelc"] == "O"){
-			return "ELECT";
-		}
-	}
-
-	function getEsc(){
-		if ($this->aFields["gesclc"] == "O"){
-			return "ESC_SERV";
-		}
-	}
-
-	function getGaz(){
-		if ($this->aFields["ggazlc"] == "O"){
-			return "GAZ";
-		}
-	}
-
-	function getAsc(){
-		if ($this->aFields["gasclc"] == "O"){
-			return "ASC";
-		}
-	}
-
-	function getChauf(){
-		if ($this->aFields["gchclc"] == "O"){
-			return "CHAUF";
-		}
-	}
-
-	function getVide(){
-		if ($this->aFields["gvorlc"] == "O"){
-			return "VIDE_ORD";
-		}
-	}
-
-	function getEgout(){
-		if ($this->aFields["gteglc"] == "O"){
-			return "EGOUT";
-		}
-	}
-
-}
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Lot_Local.class.inc b/web_service/class/majic_lib/Mj_Lot_Local.class.inc
deleted file mode 100755
index fdbb87b1d5c39509aca079cba920282bb2e7a199..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Lot_Local.class.inc
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
-* \file Mj_Lot_Local.class.inc
-* \brief Mj_Lot_Local.class.inc \n \n Ce fichier contient la classe php Mj_Lot_Local
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie lot-local.
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Lot_Local
-* \brief Mj_Lot_Local Class \n \n Mj_Lot_Local est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie lot-local.
-*
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-
-class Mj_Lot_Local extends Mj {
-	/**
-	* \param $sIdBat Identifiant de bâti
-	* \param $sKlot Identifiant d'un lot
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdBat,$sKlot,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['lot_local'];
-		$this->sSql=str_replace('$sIdBat', $sIdBat, $this->sSql);
-		$this->sSql=str_replace('$sKlot', $sKlot, $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['lot']=$this->getLot();
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de concaténer les différents attributs d'un lot-local afin d'obtenir une seul chaine de caractères.
-	* \return Retourne une chaine de caractères.
-	*/
-	function getLot(){
-		$NumLot = (string) ((int) $this->aFields['dnulot']);
-		$sLot = $this->aFields['dnupdl']." LOT ".$NumLot." ".$this->aFields['dnumql']." /".$this->aFields['ddenql'];
-		return $sLot;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Parcelle.class.inc b/web_service/class/majic_lib/Mj_Parcelle.class.inc
deleted file mode 100755
index eec0600494fe8396d74854fdfb224656dd320d44..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Parcelle.class.inc
+++ /dev/null
@@ -1,567 +0,0 @@
-<?php
-/**
-* \file Mj_Parcelle.class.inc
-* \brief Mj_Parcelle.class.inc \n \n Ce fichier contient la classe php Mj_Parcelle
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie parcelle. 
-*
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Parcelle
-* \brief Mj_Parcelle Class \n \n Mj_Parcelle est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie parcelle. 
-*
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Suf.class.inc");
-require_once ("Mj_Emprises.class.inc");
-require_once ("Mj_PosPlu.class.inc");
-
-class Mj_Parcelle extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Suf d'une parcelle
-	*/
-	var $aSuf=array();
-	/**
-	* Tableau associatif comportant la liste des objets Emprises d'une parcelle 
-	*/
-	var $aIntersect=array();
-	/**
-	* Tableau associatif comportant la liste des objets PosPlu d'une parcelle
-	*/
-	var $aPosPlu=array();
-
-	/**
-	* Constructeur
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $sIdDnupro Identifiant du propriétaire
-	*/
-	function __construct($oBD,$sIdPar,$sIdDnupro,$sEncryptedKey='', $bAllSuf=false){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['parcelle'];
-		$this->sSql=str_replace('$sIdPar', $sIdPar, $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			if (!$this->aFields=$oBD->ligneSuivante ($oPDOresult)){
-				$this->sMessage='La parcelle "'.$sIdPar.'" n\'existe pas dans les données Majic.';
-				$this->sStatus=1;
-			}else{
-				$this->sStatus=0;
-			}
-		}
-		$aSuf=$this->get_aSuf($oBD,$sIdPar,$sIdDnupro, $sEncryptedKey, $bAllSuf);
-		
-		//$this->get_aPosPlu($oBD,$sIdPar);
-		if ($this->aPosPlu==""){
-			$this->aObjects=$this->aSuf;
-		}else{
-			$this->aObjects=array_merge ($this->aSuf, $this->aPosPlu);
-		}
-	}
-
-	/**
-	* Cette méthode permet de récupérer la liste des objets PosPlu d'une parcelle
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \return Retourne un tableau d'objets PosPlu
-	*/
-	function get_aPosPlu($oBD,$sIdPar){
-		$aPosPlu=array();
-		if($this->isEmpty()){
-			$this->aPosPlu="";
-		}else{
-			$sIdParpos = substr($sIdPar,3);
-			$sCodCom=$this->get_sCodCom($oBD,$sIdPar);
-			$aIdPosPlu=$this->get_aId_PosPlu($oBD,$sIdParpos,$sCodCom);
-			foreach($aIdPosPlu as $sIdPosPlu){
-				array_push($this->aPosPlu, new Mj_PosPlu($oBD,$sIdPosPlu, $sIdParpos,$sCodCom));
-			}
-		}
-		return $aPosPlu;
-	}
-	
-	function get_aId_PosPlu($oBD,$sIdPar,$sCodCom){
-		include $this->sRessourcesFile;
-		$aIdPosPlu=array();
-		$this->sSql=$aSql[$oBD->sgbd]['get_id_pos_plu'];
-		$this->sSql=str_replace('$sIdPar',$sIdPar,$this->sSql);
-		$this->sSql=str_replace('$sCodCom',$sCodCom,$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-				
-				array_push($aIdPosPlu,$aResultFetch[0]);
-				$this->sStatus=0;
-			}
-		}
-		return $aIdPosPlu;
-	}
-	/**
-	* Cette méthode permet de récupérer le CodCom en fonction d'un Id_Par donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \return Retourne une chaîne de caractères
-	*/
-	function get_sCodCom($oBD,$sIdPar){
-		include $this->sRessourcesFile;
-		$aCodCom=array();
-		$this->sSql=$aSql[$oBD->sgbd]['get_codcom'];
-		$this->sSql=str_replace('$sIdPar',$sIdPar,$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-				array_push($aCodCom,$aResultFetch[0]);
-				$this->sStatus=0;
-			}
-		}
-		$sCodCom=$aCodCom[0];
-		return $sCodCom;
-	}
-
-	/**
-	* Cette méthode permet de récupérer la liste des objets Suf d'une parcelle
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $sIdDnupro Identifiant du propriétaire
-	* \return Retourne un tableau d'objets Suf
-	*/
-	function get_aSuf($oBD,$sIdPar,$sIdDnupro,$sEncryptedKey='',$bAllSuf){
-		if($this->isEmpty()){
-			$this->aSuf="";
-		}else{
-			$aIdSuf=$this->get_aId_Suf($oBD,$sIdPar,$sIdDnupro);
-			foreach($aIdSuf as $sIdSuf){
-				array_push($this->aSuf,new Mj_Suf($oBD,$sIdSuf,$sIdDnupro,$sEncryptedKey,$bAllSuf));
-			}
-		}
-		return $aSuf;
-	}
-	/**
-	* Cette méthode permet de récupérer les Id_Suf en fonction d'un Id_Par donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $sIdDnupro Identifiant du propriétaire
-	* \return Retourne un tableau de chaînes de caractères
-	*/
-	function get_aId_Suf($oBD,$sIdPar,$sIdDnupro){
-		include $this->sRessourcesFile;
-		$aIdSuf=array();
-		$this->sSql=$aSql[$oBD->sgbd]['get_id_suf'];
-		$this->sSql=str_replace('sIdPar',$sIdPar,$this->sSql);
-		$this->sSql=str_replace('sIdDnupro',$sIdDnupro,$this->sSql);
-		$this->sSql=str_replace('sDnupro',substr($sIdDnupro,6),$this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-				array_push($aIdSuf,$aResultFetch[0]);
-				$this->sStatus=0;
-			}
-		}
-		return $aIdSuf;
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['dateheure']=date("d/m/Y")." a ".date("H:m");
-			$aExportFields['idpar']=$this->aFields['id_par'];
-			$aExportFields['date']=$this->getJdatat();
-			$aExportFields['section']=$this->aFields['ccosec'];
-			$aExportFields['num_plan']=$this->aFields['dnupla'];
-			$aExportFields['num_parc']=$this->getNumeroParcelle();
-			$aExportFields['num_voirie']=$this->getNumeroVoirie();
-			$aExportFields['adresse']=$this->getAdresseParcelle();
-			$aExportFields['code_rivoli']=$this->aFields['ccoriv'];
-			$aExportFields['num_parc_prim']=$this->aFields['dparpi'];
-			$aExportFields['fp_dp']=$this->aFields['gparnf'];
-			
-			if($this->aFields['gurbpa'] == "U" ) {
-				$aExportFields['gurbpa'] = "Oui";
-			}else{
-				$aExportFields['gurbpa'] = "Non";
-			}
-
-			if($this->aFields['gparbat'] == "" || $this->aFields['gparbat'] == "0") {
-				$aExportFields['gparbat'] = "Non";
-			}else{
-				$aExportFields['gparbat'] = "Oui";
-			}
-			$aExportFields['typevoie']=$this->aFields['typevoie'];
-			if ($this->aFields['typevoie'] == "3" ) {
-				$aExportFields['lieudit']=$this->getAdresseParcelle();
-			}else{
-				$aExportFields['lieudit']="";
-			}
-
-			$aExportFields['surface']=$this->aFields['dcntpa'];
-			$aExportFields['dnupro']=$this->aFields['dnupro'];
-			$aExportFields['s_tar']=$this->getSTar();
-			$aExportFields['suf']=$this->getSuf();
-			$aExportFields['grss_gr']=$this->getGrssGr();
-			$aExportFields['clas']=$this->getClas();
-			$aExportFields['nat_cult']=$this->getNatCult();
-			$iContenance = $this->getContenance ();
-			$aExportFields['ha']=intval($iContenance/10000);
-			if ($aExportFields['ha'] == 0) {
-				$aExportFields['ha']= ' ';
-			}
-			$aExportFields['a']=intval(($iContenance%10000)/100);
-			$sContenanceA=$aExportFields['a'];
-			$sContenanceA=strval($sContenanceA);
-			$sTlenA=strlen($sContenanceA);
-			if ($aExportFields['ha'] == ' ' and $aExportFields['a'] == 0){
-				$aExportFields['a']= ' ';
-			}else{
-				if ($aExportFields['ha'] == ' ' and $sTlenA == 2 and (substr($aExportFields['a'],0,1)== 0)) {
-					$sDeuxiemeValeur= substr($aExportFields['a'],1,1);
-					$aExportFields['a']= ' '.$sDeuxiemeValeur;
-				} else {
-					if ($aExportFields['ha'] != ' ' and $sTlenA == 1) {
-						$aExportFields['a']= '0'.$aExportFields['a'];
-					}
-				}
-			}
-			$aExportFields['ca']=$iContenance%100;
-			$sContenanceCa=$aExportFields['ca'];
-			$sContenanceCa= strval($sContenanceCa);
-			$sTlen=strlen($sContenanceCa);
-			if ($aExportFields['a'] != 0)
-				if ($sTlen == 1) {
-					$aExportFields['ca']= '0'.$aExportFields['ca'];
-				}
-			$aExportFields['revenu_cadastral_avec_exo']=$this->getRevenuCadastralAvecExo();
-			$aExportFields['revenu_cadastral_com_avec_exo']=$this->getRevenuCadastralComAvecExo();
-			$aExportFields['revenu_cadastral_dep_avec_exo']=$this->getRevenuCadastralDepAvecExo();
-			$aExportFields['revenu_cadastral_reg_avec_exo']=$this->getRevenuCadastralRegAvecExo();
-			$aExportFields['revenu_cadastral']=$this->getRevenuCadastral();
-			$aExportFields['revenu_cadastral_txt']=$this->setFloatToText($this->getRevenuCadastral());
-			$aExportFields['revenu_reference']=$this->getRevenuReference();
-			$aExportFields['revenu_reference_txt']=$this->setFloatToText($this->getRevenuReference());
-			//$aExportFields['nat_exo']=$this->getNatExo();
-			$aExportFields['contenance']=$iContenance;
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet d'avoir l'attribut dnupla sur 4 caractères.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNumeroParcelle(){
-		if(strlen($this->aFields['dnupla']) == 1){
-			return "000".$this->aFields['dnupla'];
-		}
-		if(strlen($this->aFields['dnupla']) == 2){
-			return "00".$this->aFields['dnupla'];
-		}
-		if(strlen($this->aFields['dnupla']) == 3){
-			return "0".$this->aFields['dnupla'];
-		}
-		if(strlen($this->aFields['dnupla']) == 4){
-			return $this->aFields['dnupla'];
-		}
-		
-	}
-	/**
-	* Cette méthode permet de récupérer les deux derniers caractères de l'attribut Jdatat et d'y ajouter 1.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getJdatat(){
-		$sNewJdatat=$this->aFields['jdatat'];
-		if (preg_match( '`^\d{1,2}/\d{1,2}/\d{4}$`' , $sNewJdatat ) ){
-			$sNewJdatat=substr("$sNewJdatat", 6, 4)+1;
-			$sNewJdatat=(string)(substr("$sNewJdatat", 2, 2));
-		}else if (preg_match( '`^\d{1,2}/\d{1,2}/\d{2}$`' , $sNewJdatat ) ){
-			$sNewJdatat=(string) (substr("$sNewJdatat", 6, 2)+1);
-			if(strlen($sNewJdatat) == 1){
-				$sNewJdatat='0'.$sNewJdatat;
-			}
-			$sNewJdatat=(string) (substr("$sNewJdatat", -2, 2));
-		}else{
-			$sNewJdatat=substr("$sNewJdatat", 4, 4)+1;
-			$sNewJdatat=(string)(substr("$sNewJdatat", 2, 2));
-		}
-		return $sNewJdatat;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs dnvoiri et indic.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNumeroVoirie(){
-		$sNumeroVoirie = ltrim($this->aFields['dnvoiri'],'0').$this->aFields['dindic'];
-		return $sNumeroVoirie;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs cconvo et dvoilib.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getAdresseParcelle(){
-		$sAdresseParcelle = rtrim($this->aFields['cconvo'])." ".rtrim($this->aFields['dvoilib']);
-		return $sAdresseParcelle;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 's_tar' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getSTar(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->aFields['ccostn'];
-		} else {
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'suf' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getSuf(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->aFields['ccosub'];
-		}else {
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'grss_gr' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getGrssGr(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->aFields['dsgrpf'];
-		}else {
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'clas' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getClas(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->aFields['dclssf'];
-		}else {
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'nat_cult' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNatCult(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->aFields['cnatsp'];
-		}else {
-			return '';
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu cadastral' dans le tableau aSuf.
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuCadastral(){
-		$fRevenuCadastral = 0;
-	  	foreach ($this->aSuf as $oSuf) {
-	    	$fRevenuCadastral = $fRevenuCadastral + (float) $oSuf->getRevenuCadastral();
-		} 
-		return $fRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu reference' dans le tableau aSuf.
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuReference(){
-		$fRevenuReference = 0;
-		foreach ($this->aSuf as $oSuf) {
-			$fRevenuReference = $fRevenuReference + (float) $oSuf->getRevenuReference();
-		} 
-		return $fRevenuReference;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu cadastral' pour des parcelles avec exonération dans le tableau aSuf.
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuCadastralAvecExo(){
-		$fRevenuCadastralAvecExo = 0;
-		foreach ($this->aSuf as $oSuf) {
-			if(ereg ("TA", $oSuf->getNatExo())){
-				$fRevenuCadastralAvecExo = $fRevenuCadastralAvecExo + (float) $oSuf->getRevenuCadastral();
-			}
-		} 
-		return $fRevenuCadastralAvecExo;
-	}
-
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu cadastral' pour des parcelles avec exonération dans le tableau aSuf.
-	* lorsque l'exoneration est procuré par une commune, un groupement de commune ou toutes collectivité
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuCadastralComAvecExo(){
-		$fRevenuCadastralComAvecExo = 0;
-		foreach ($this->aSuf as $oSuf) {
-			if(ereg ("EP", $oSuf->aFields['gnexps']) or ereg("CD", $oSuf->aFields['gnexps']) or ereg("CR", $oSuf->aFields['gnexps']) or ereg("NI", $oSuf->aFields['gnexps']) or ereg("RT", $oSuf->aFields['gnexps'])){
-				$fRevenuCadastralComAvecExo = $fRevenuCadastralComAvecExo + (float) $oSuf->getRevenuCadastral();
-			} else {
-				if($oSuf->getCcolloc("C") == true) {
-					$fRevenuCadastralComExo = $oSuf->getRevenuCadastralExo("C");
-					$fRevenuCadastralComAvecExo = $fRevenuCadastralComAvecExo + (float) $fRevenuCadastralComExo;
-				} else {
-					if($oSuf->getCcolloc("TC") == true) {
-						$fRevenuCadastralComExo = $oSuf->getRevenuCadastralExo("TC");
-						$fRevenuCadastralComAvecExo = $fRevenuCadastralComAvecExo + (float) $fRevenuCadastralComExo;
-					} else {
-						if($oSuf->getCcolloc("GC") == true) {
-							$fRevenuCadastralComExo = $oSuf->getRevenuCadastralExo("GC");
-					    	$fRevenuCadastralComAvecExo = $fRevenuCadastralComAvecExo + (float) $fRevenuCadastralComExo;
-						}
-					}
-				}
-			}
-		}
-		return $fRevenuCadastralComAvecExo;
-	}
-	
-	function getRevenuCadastralTaxeADAvecExo(){
-		$fRevenuCadastralTaxeADAvecExo = 0;
-		foreach ($this->aSuf as $oSuf) {
-			if(ereg ("EP", $oSuf->aFields['gnexps']) or ereg("CD", $oSuf->aFields['gnexps']) or ereg("CR", $oSuf->aFields['gnexps']) or ereg("NI", $oSuf->aFields['gnexps']) or ereg("RT", $oSuf->aFields['gnexps'])){
-				$fRevenuCadastralTaxeADAvecExo = $fRevenuCadastralTaxeADAvecExo + (float) $oSuf->getRevenuCadastral();
-			} else {
-				if($oSuf->getCcolloc("A") == true) {
-					
-					$fRevenuCadastralTaxeADExo = $oSuf->getRevenuCadastralExo("A");
-					
-					$fRevenuCadastralTaxeADAvecExo = $fRevenuCadastralTaxeADAvecExo + (float) $fRevenuCadastralTaxeADExo;
-				}
-			}
-		}
-		return $fRevenuCadastralTaxeADAvecExo;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu cadastral' pour des parcelles avec exonération dans le tableau aSuf.
-	* lorsque l'exoneration est procuré par le département ou toutes collectivité
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuCadastralDepAvecExo(){
-		$fRevenuCadastralDepAvecExo = 0;
-		foreach ($this->aSuf as $oSuf) {
-			if(ereg ("EP", $oSuf->aFields['gnexps']) or ereg("CD", $oSuf->aFields['gnexps']) or ereg("DR", $oSuf->aFields['gnexps']) or ereg("NI", $oSuf->aFields['gnexps']) or ereg("RT", $oSuf->aFields['gnexps'])){
-				$fRevenuCadastralDepAvecExo = $fRevenuCadastralDepAvecExo + (float) $oSuf->getRevenuCadastral();
-			} else {
-				if($oSuf->getCcolloc("D") == true) {
-					$fRevenuCadastralDepExo = $oSuf->getRevenuCadastralExo("D");
-					$fRevenuCadastralDepAvecExo = $fRevenuCadastralDepAvecExo + (float) $fRevenuCadastralDepExo;
-				} else {
-					if($oSuf->getCcolloc("TC") == true) {
-						$fRevenuCadastralDepExo = $oSuf->getRevenuCadastralExo("TC");
-						$fRevenuCadastralDepAvecExo = $fRevenuCadastralDepAvecExo + (float) $fRevenuCadastralDepExo;
-					}
-				}
-			}
-		}
-		return $fRevenuCadastralDepAvecExo;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'revenu cadastral' pour des parcelles avec exonération dans le tableau aSuf.
-	* lorsque l'exoneration est procuré par la région ou toutes collectivité
-	* \return Retourne un nombre réel (float).
-	*/
-	function getRevenuCadastralRegAvecExo(){
-		$fRevenuCadastralRegAvecExo = 0;
-		foreach ($this->aSuf as $oSuf) {
-			if(ereg ("EP", $oSuf->aFields['gnexps']) or ereg("DR", $oSuf->aFields['gnexps']) or ereg("CR", $oSuf->aFields['gnexps']) or ereg("NI", $oSuf->aFields['gnexps']) or ereg("RT", $oSuf->aFields['gnexps'])){
-				$fRevenuCadastralRegAvecExo = $fRevenuCadastralRegAvecExo + (float) $oSuf->getRevenuCadastral();
-			} else {
-				if($oSuf->getCcolloc("R") == true) {
-					$fRevenuCadastralRegExo = $oSuf->getRevenuCadastralExo("R");
-					$fRevenuCadastralRegAvecExo = $fRevenuCadastralRegAvecExo + (float) $fRevenuCadastralRegExo;
-				} else {
-					if($oSuf->getCcolloc("TC") == true) {
-						$fRevenuCadastralRegExo = $oSuf->getRevenuCadastralExo("TC");
-						$fRevenuCadastralRegAvecExo = $fRevenuCadastralRegAvecExo + (float) $fRevenuCadastralRegExo;
-					}
-				}
-			}
-		}
-		return $fRevenuCadastralRegAvecExo;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'contenance' pour des parcelles avec exonération dans le tableau aSuf.
-	* \return Retourne un entier.
-	*/
-	function getContenance (){
-		$iContenance=0;
-		foreach($this->aSuf as $oSuf){
-			$iContenance=$iContenance+$oSuf->getContenance();
-		}
-		return $iContenance;
-	}
-	
-	/**
-	* Cette méthode permet de réupérer l'ensemble des emprises de la parcelles à partir des properties de la fiche d'urbanisme
-	* \return 
-	*/
-	function getEmprises($aProperties,$oBD,$sLayerTypeParcelle) {
-		// boucler sur toutes les couches à intersecter
-		if(isset($aProperties["cadastre"]["fiche_urb"]["intersect"]["views"])) {
-			foreach($aProperties["cadastre"]["fiche_urb"]["intersect"]["views"] as $sView => $aViewValue) {
-				$oEmprises = new Mj_Emprises($oBD,$this->aFields['id_par'],$sView, $aProperties["cadastre"]["fiche_urb"]["intersect"]["tolerance"], $aViewValue, $sLayerTypeParcelle);				
-				array_push($this->aIntersect,$oEmprises);
-			}
-		}
-		// calcule de l'emprise du bati
-		$sViewBati=$aProperties["cadastre"]["view"]["bati"];
-		if(isset($aProperties["cadastre"]["view"]["bati"])){
-			$aField["type"]="POLYGON";
-			$aField["title"]="Emprise Bati";
-			$oEmprises = new Mj_Emprises($oBD,$this->aFields['id_par'],$sViewBati,$aProperties["cadastre"]["fiche_urb"]["intersect"]["tolerance"], $aField, $sLayerTypeParcelle);
-			array_push($this->aIntersect,$oEmprises);
-		}
-		$this->aObjects=array_merge($this->aObjects,$this->aIntersect);
-	}
-
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'nat_exo' dans le tableau aSuf.
-	* \return Retourne une chaîne de caractères.
-	*
-	*/
-	/*function getNatExo(){
-		if(count($this->aSuf)==1) {
-			return $this->aSuf[0]->getNatExo();
-		} else{
-			return '';
-		}
-	}*/
-	/**
-	* Cette méthode permet de formater un décimal pour l'affichage.
-	* \return Retourne une chaine
-	*/
-	function setFloatToText($fFloat){
-		return number_format($fFloat,2,'.','');
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Pev.class.inc b/web_service/class/majic_lib/Mj_Pev.class.inc
deleted file mode 100755
index d33ebb882cdab0a88619ea843eccc055d9f0a9ad..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Pev.class.inc
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
-* \file Mj_Pev.class.inc
-* \brief Mj_Pev.class.inc \n \n Ce fichier contient la classe php Mj_Pev
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie pev. 
-*
-* \author Damien Bedel
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Pev
-* \brief Mj_Pev Class \n \n Mj_Pev est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie pev. 
-*
-* \author Damien Bedel
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Exone_Pev.class.inc");
-require_once ("Mj_Habit_Descr.class.inc");
-require_once ("Mj_Depend_Descr.class.inc");
-require_once ("Mj_Prof_Descr.class.inc");
-
-class Mj_Pev extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Exone_Pev du bâti.
-	*/
-	var $aExPev=array();
-	/**
-	* Tableau associatif comportant la liste des objets Descr de(s) habitation(s)
-	*/
-	var $aDescr_Hab=array();
-	/**
-	* Tableau associatif comportant la liste des objets Descr de(s) dépendance(s)
-	*/
-	var $aDescr_Depend=array();
-	/**
-	* Tableau associatif comportant la liste des objets Descr professionel
-	*/
-	var $aDescr_Prof=array();
-	/**
-	* \param $sIdPev Identifiant de la partie d'Evaluation
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdPev,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['pev'];
-		$this->sSql=str_replace('$sIdPev', $sIdPev, $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()) {
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();  	
-		}else{
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}
-		$this->aExPev=$this->get_aEx_Pev($oBD);
-		$this->aDescr_Hab=$this->get_aDescr_Hab($sIdPev,$oBD);
-		$this->aDescr_Depend=$this->get_aDescr_Depend($sIdPev,$oBD);
-		$this->aDescr_Prof=$this->get_aDescr_Prof($sIdPev,$oBD);
-		$this->aObjects=array_merge($this->aExPev,$this->aDescr_Hab,$this->aDescr_Depend,$this->aDescr_Prof);
-	}
-	/**
-	* Cette méthode permet de récupérer les Id_Ex en fonction d'un Id_Pev donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau de chaînes de caractères.
-	*/
-	function get_aId_Ex_Pev($oBD){
-		if($this->isEmpty()){
-			$aIdExPev="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdExPev=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_ex_pev'];
-			$this->sSql=str_replace('$sIdPev', $this->aFields['id_pev'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdExPev,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdExPev;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Exone_Pev du bâti
-	* \return Retourne un tableau d'objets Exone_Pev
-	*/
-	function get_aEx_Pev($oBD){
-		$aExPev=array();
-		if($this->isEmpty()){
-			$aExPev="";
-		}else{
-			$aIdExPev=$this->get_aId_Ex_Pev($oBD);
-			foreach($aIdExPev as $sValue){
-				array_push($aExPev,new Mj_Exone_Pev($sValue,$oBD));
-			}
-		}
-		return $aExPev;
-	}
-	/**
-	* Cette méthode permet de récupérer les Id_Descr_Hab en fonction d'un Id_Pev donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau de chaînes de caractères.
-	*/
-	function get_aId_Descr_Hab($oBD){
-		if($this->isEmpty()){
-			$aIdDescrHab="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdDescrHab=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_descr_hab'];
-			$this->sSql=str_replace('$sIdPev',$this->aFields['id_pev'],$this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->ligneSuivante($oPDOresult)){
-					array_push($aIdDescrHab,$aResultFetch);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdDescrHab;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Descr du bâti
-	* \return Retourne un tableau d'objets Descr_Hab
-	*/
-	function get_aDescr_Hab($sIdPev,$oBD){
-		$aDescrHab=array();
-		if($this->isEmpty()){
-			$aDescrHab="";
-		}else{
-			$aIdDescrHab=$this->get_aId_Descr_Hab($oBD);
-			foreach($aIdDescrHab as $aValue){
-				array_push($aDescrHab,new Mj_Habit_Descr($aValue,$oBD));
-			}
-			//array_push($aDescrHab,new Mj_Habit_Descr($sIdPev,$oBD));
-		}
-		return $aDescrHab;
-	}
-	/**
-	* Cette méthode permet de récupérer les Id_Descr_Depend en fonction d'un Id_Pev donné
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau de chaînes de caractères.
-	*/
-	function get_aId_Descr_Depend($oBD){
-		if($this->isEmpty()){
-			$aIdDescrDepend="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdDescrDepend=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_id_descr_depend'];
-			$this->sSql=str_replace('$sIdPev', $this->aFields['id_pev'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch=$oBD->tableauSuivant($oPDOresult)){
-					array_push($aIdDescrDepend,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdDescrDepend;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Descr_Depend du bâti
-	* \return Retourne un tableau d'objets Descr_Depend
-	*/
-	function get_aDescr_Depend($sIdPev,$oBD){
-		$aDescrDepend=array();
-		if($this->isEmpty()){
-			$aDescrDepend="";
-		}else{
-			$aIdDescrDepend=$this->get_aId_Descr_Depend($oBD);
-			foreach($aIdDescrDepend as $sValue){
-				array_push($aDescrDepend,new Mj_Depend_Descr($sValue,$oBD));
-			}
-		}
-		return $aDescrDepend;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Descr_Prof du bâti
-	* \return Retourne un tableau d'objets Descr_Prof
-	*/
-	function get_aDescr_Prof($sIdPev,$oBD){
-		$aDescr_Prof=array();
-		if($this->isEmpty()){
-			$aDescr_Prof="";
-		}else{
-			array_push($aDescr_Prof,new Mj_Prof_Descr($sIdPev,$oBD));
-		}
-		return $aDescr_Prof;
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['s_tar']=$this->aFields['ccostb'];
-			$aExportFields['af']=$this->aFields['ccoaff'];
-			$aExportFields['l_nature']=$this->aFields['l_ccoaff'];
-			$aExportFields['cat']=$this->aFields['dcapec'];
-			$aExportFields['nat_exo']=$this->getNatExo();
-			$aExportFields['revenu_cadastral']=$this->getRevenuCadastral();
-			$aExportFields['num_pev']=$this->aFields['dnupev'];
-			$aExportFields['val_loc_ref']=$this->aFields['dvlper'];
-			$aExportFields['val_loc_ann']=$this->aFields['dvlpera'];
-			$aExportFields['nature']=$this->aFields['gnexpl'];
-			$aExportFields['l_nat_exon']=$this->aFields['l_gnexpl'];
-			$aExportFields['local_type']=$this->aFields['dnuref'];
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de récupérer le revenu cadastral d'une Pev.
-	* \return Retourne un entier.
-	*/
-	function getRevenuCadastral(){
-		if ($this->getNatExo()==''){
-			$iRevenuCadastral=(int)$this->aFields['bipevla1'];
-		}else{
-			$fRevenuCadastral=(float)($this->aFields['dvlpera'])/2;
-			$iRevenuCadastral=round($fRevenuCadastral);
-		}
-		return $iRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de récupérer le revenu cadastral d'une Pev.
-	* \return Retourne un float.
-	*/
-	function getRevenuCadastralfloat(){
-		if ($this->getNatExo()==''){
-			$fRevenuCadastral=(float)$this->aFields['bipevla1'];
-		}else{
-			$fRevenuCadastral=(float)($this->aFields['dvlpera'])/2;
-		}
-		return $fRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de récupérer la nature de l'exonération qui peut provenir soit de l'attribut 'gnexpl' soit de l'attribut 'gnextl' contenu dans le tableau aExPev.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNatExo(){
-		if(trim($this->aFields['gnexpl'])==''){
-			$sNatExo=$this->aExPev[0]->aFields['gnextl'];
-		}else{
-			$sNatExo=$this->aFields['gnexpl'];
-		}
-		return $sNatExo;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_PosPlu.class.inc b/web_service/class/majic_lib/Mj_PosPlu.class.inc
deleted file mode 100755
index 5a9edf8e2bcfd43db60e5633d7f23e1c08f14132..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_PosPlu.class.inc
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/**
-* \file Mj_Parcelle.class.inc
-* \brief Mj_Parcelle.class.inc \n \n Ce fichier contient la classe php Mj_Parcelle
-* 
-* Cette classe permet de sélectionner les attributs POS/PLU nécessaires.
-*
-* \author John Bosch <john.bosch@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Parcelle.class.inc");
-
-class Mj_PosPlu extends Mj {
-
-	/**
-	* Constructeur
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdPar Identifiant de la parcelle
-	* \param $sCodCom Code Insee de la commune
-	*/
-	function __construct($oBD,$sObjectId, $sIdPar,$sCodCom) {
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['pos_plu'];
-		$this->sSql=str_replace('$sObjectId', $sObjectId, $this->sSql);
-		$this->sSql=str_replace('$sIdPar', $sIdPar, $this->sSql);
-		$this->sSql=str_replace('$sCodCom', $sCodCom, $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ( $oBD->enErreur()) {
-		    $this->sStatus=1;
-		    $this->sMessage=$oBD->getBDMessage();    	
-		}else{
-			while($aRow = $oBD->ligneSuivante ($oPDOresult)) {
-				$this->aFields=$aRow;
-			}
-			
-			$this->sStatus=0;
-		}	
-	
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété/Fiche Parcelle.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété/Fiche Parcelle.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		} 
-		else{
-			$aExportFields['zonage']=$this->aFields['TYPE'];
-			$aExportFields['lib_zonage']=$this->aFields['LIBELLE'];
-			$aExportFields['surface']=$this->getSurface();
-			$aExportFields['cos']=$this->aFields['COS'];
-			$aExportFields['ces']=$this->aFields['CES'];
-			$aExportFields['hauteur']=$this->aFields['HAUTEUR'];
-			$aExportFields['idreg']=$this->aFields['IDREG'];
-			$aExportFields['codecom']=$this->aFields['CODCOM'];
-		}
-		return $aExportFields;
-	}
-	function getSurface(){
-		$iSurface= round($this->aFields['SURFACE']);
-		return $iSurface;
-	}
-	
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Prof_Descr.class.inc b/web_service/class/majic_lib/Mj_Prof_Descr.class.inc
deleted file mode 100755
index 8c24aed515a0309fb57579b5e44ac57e673fbed5..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Prof_Descr.class.inc
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
-* \file Mj_Prof_Descr.class.inc
-* \brief Mj_Prof_Descr.class.inc \n \n Ce fichier contient la classe php Mj_Prof_Descr
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Description Professionel.
-*
-* \author John Bosch
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-
-require_once ("Mj.class.inc");
-
-class Mj_Prof_Descr extends Mj {
-	/**
-	* \param $sIdPev Identifiant de la partie d'Evaluation
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdPev,$oBD){
-		include $this->sRessourcesFile;
-		$this->sSql=$aSql[$oBD->sgbd]['prof_descr'];
-		$this->sSql=str_replace('$sIdPev', $sIdPev, $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ( $oBD->enErreur()) {
-		    $this->sStatus=1;
-		    $this->sMessage=$oBD->getBDMessage();    	
-		}
-		else{
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}	
-		
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété/Fiche Parcelle.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété/Fiche Parcelle.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		} 
-		else{
-			$aExportFields['num_invar']=$this->aFields['invar'];
-			$aExportFields['num_pev']=$this->aFields['dnupev'];
-			$aExportFields['num_prof']=$this->aFields['dnudes'];
-			$aExportFields['surface']=$this->aFields['vsurzt'];
-		}
-		return $aExportFields;
-	}
-	
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Proprietaire.class.inc b/web_service/class/majic_lib/Mj_Proprietaire.class.inc
deleted file mode 100755
index 31455062cf478a7a56648ece5bc11f3d4635004d..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Proprietaire.class.inc
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
-* \file Mj_Proprietaire.class.inc
-* \brief Mj_Proprietaire.class.inc \n \n Ce fichier contient la classe php Mj_Proprietaire
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie proprietaire.
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Proprietaire
-* \brief Mj_Proprietaire Class \n \n Mj_Proprietaire est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie proprietaire.
-*
-* \author Damien Bedel <damien.bedel@veremes.com>
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-
-class Mj_Proprietaire extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Pev du bâti
-	*/
-	var $aProprietaireNom=array();
-	
-	/**
-	* \param $sIdDnupro Identifiant National de compte communal
-	* \param $sIdPro Identifiant d'un propriétaire pour le département et le CDIF
-	* \param $oBD Objet de connexion PDO_BD
-	*/
-	function __construct($sIdDnupro,$sIdPro,$oBD, $sEncryptedKey=''){
-		$this->sEncryptKey = $sEncryptedKey;
-		include $this->sRessourcesFile;
-		$this->sSql = $aSql[$oBD->sgbd]['proprietaire'];
-		$this->sSql= str_replace('$sIdDnupro', $this->encrypt($sIdDnupro),$this->sSql);
-		$this->sSql = str_replace('$sIdPro', $sIdPro, $this->sSql);
-		$oPDOresult= $oBD->execute($this->sSql);
-		
-		if ( $oBD->enErreur()) {
-		    $this->sStatus=1;
-		    $this->sMessage=$oBD->getBDMessage();    	
-		}else{
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->aFields['id_dnupro'] = $sIdDnupro;
-			$this->sStatus=0;
-		}
-		$oPDOresult = $oBD->fermeResultat();
-		
-		$this->aProprietaireNom = $this->getProprietaireNom();
-	}
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		} 
-		else{
-			$aExportFields['l_ccodro']=$this->aFields['l_ccodro'];
-			$aExportFields['l_ccodem']=$this->aFields['l_ccodem'];
-			$aExportFields['dnuper']=$this->aFields['dnuper'];
-			$aExportFields['dnupro']=$this->aFields['dnupro'];
-			$aExportFields['proprietaire_nom']=$this->getProprietaireNom();
-			$aExportFields['proprietaire_nom_tiers']=$this->getProprietaireNomTiers();
-			$aExportFields['proprietaire_adresse']=$this->getProprietaireAdresse();
-			$aExportFields['jdatnss']=$this->getJdatnss();
-			$aExportFields['dldnss']=$this->getDldnss();
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de récupérer le nom du propriétaire en fonction de la valeur de l'attribut epxnee.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getProprietaireNom(){
-		switch($this->aFields["epxnee"]){
-			case 'EPX' : 
-				$sProprietaireNom = rtrim($this->aFields["dqualp"])." ".rtrim($this->aFields["ddenom"])." EP ".rtrim($this->aFields["dnomcp"])." ".rtrim($this->aFields["dprncp"]);
-				break;
-			case 'NEE' :
-				$sProprietaireNom = rtrim($this->aFields["dqualp"])." ".rtrim($this->aFields["ddenom"])." EP ".rtrim($this->aFields["dnomlp"])." ".rtrim($this->aFields["dprnlp"]);
-				break;
-			default : 
-				$sProprietaireNom = rtrim($this->aFields["dqualp"])." ".rtrim($this->aFields["ddenom"]);
-				break;
-		}
-		return $sProprietaireNom;
-	}
-	/**
-	* Cette méthode permet de récupérer l'adresse complète du propriétaire en concaténant les attributs dlign3, dlign4, dlign5 et dlign6.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getProprietaireAdresse(){
-		$sProprietaireAdresse = rtrim($this->aFields['dlign3'])." ".ltrim(rtrim($this->aFields['dlign4']),'0')." ".rtrim($this->aFields['dlign5'])." ".rtrim($this->aFields['dlign6']);
-		return $sProprietaireAdresse;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs dnvoiri et indic.
-	* \return Retourne une chaîne de caractères. Elle est vide si l'attribut dqualp est vide.
-	*/
-	function getJdatnss(){
-		if($this->aFields["gtoper"]=='2'){
-			$sJdatnss = '';
-		}else{
-			$sJdatnss = "NE(E) le ".$this->aFields['jdatnss'];
-		}
-		return $sJdatnss;
-	}
-	/**
-	* Cette méthode permet de concaténer les attributs dnvoiri et indic.
-	* \return Retourne une chaîne de caractères. Elle est vide si l'attribut dqualp est vide.
-	*/
-	function getDldnss(){
-		if($this->aFields["gtoper"]=='2'){
-			$sJdatnss = '';
-		}else{
-			$sDldnss = "A ".$this->aFields['dldnss'];
-		}
-		return $sDldnss;
-	}
-	/**
-	* Cette méthode permet de récupérer le nom du propriétaire correspondant à un relevé de propriété destiné aux tiers.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getProprietaireNomTiers(){
-		$sProprietaireNomTiers = rtrim($this->aFields["dqualp"])." ".rtrim($this->aFields["ddenom"]);
-		return $sProprietaireNomTiers;
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/Mj_Suf.class.inc b/web_service/class/majic_lib/Mj_Suf.class.inc
deleted file mode 100755
index f68795311f10395b6f1eb636bae254ac4519c0a1..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/Mj_Suf.class.inc
+++ /dev/null
@@ -1,332 +0,0 @@
-<?php
-/**
-* \file Mj_Suf.class.inc
-* \brief Mj_Suf.class.inc \n \n Ce fichier contient la classe php Mj_Suf
-* 
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Suf. 
-*
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-/**
-* \class Mj_Suf
-* \brief Mj_Suf Class \n \n Mj_Suf est une classe PHP qui hérite de la classe Mj.
-*
-* Cette classe permet de sélectionner les attributs nécessaires afin de traiter la partie Suf. 
-*
-* \author Fabien Marty <fabien.marty@veremes.com>
-* \author Damien Bedel
-* \author Olivier Gayte <olivier.gayte@veremes.com>
-*/
-require_once ("Mj.class.inc");
-require_once ("Mj_Exon_Suf.class.inc");
-
-class Mj_Suf extends Mj {
-	/**
-	* Tableau associatif comportant la liste des objets Exon_Suf d'une parcelle
-	*/
-	var $aExonSuf=array();
-	/**
-	* \param $oBD Objet de connexion PDO_BD
-	* \param $sIdSuf Identifiant de la suf
-	* \param $sIdDnupro Identifiant du propriétaire
-	*/
-	function __construct($oBD,$sIdSuf,$sIdDnupro,$sEncryptedKey='', $bAllSuf=false){
-		$this->bAllSuf = $bAllSuf;
-		$this->sEncryptKey = $sEncryptedKey;
-		include $this->sRessourcesFile;
-		// récupèration du dnupro de la suf
-		$this->sSql=$aSql[$oBD->sgbd]['suf_dnupro'];
-		$this->sSql=str_replace('$sIdSuf', $sIdSuf, $this->sSql);
-		
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-			$this->sSql=$aSql['suf'];
-		}else{
-			$this->sStatus=0;
-			$aSufPar=$oBD->ligneSuivante ($oPDOresult);
-			// Si le DNUPRO de la suf est différent de la parcelle il s'agit d'une parcelle concernée par des lots en biens non délimités
-			if (trim($aSufPar['dnupro'])==trim(substr($sIdDnupro,6))){
-				$this->sSql=$aSql[$oBD->sgbd]['suf'];
-			}else{
-				if($this->bAllSuf){
-					$this->sSql=$aSql[$oBD->sgbd]['suf_bnd_all'];
-				}else{
-					$this->sSql=$aSql[$oBD->sgbd]['suf_bnd'];
-				}
-			}
-		}
-		$this->sSql=str_replace('$sIdSuf', $sIdSuf, $this->sSql);
-		$this->sSql=str_replace('sIdDnupro', substr($sIdDnupro, 5), $this->sSql);
-		$oPDOresult=$oBD->execute($this->sSql);
-		if ($oBD->enErreur()){
-			$this->sStatus=1;
-			$this->sMessage=$oBD->getBDMessage();
-		}else{
-			$this->aFields=$oBD->ligneSuivante ($oPDOresult);
-			$this->sStatus=0;
-		}
-		$this->aExonSuf=$this->get_aExon_Suf($oBD);
-		if ($this->aFields['dnulot']){
-			$this->aPro=$this->get_aPro($oBD);
-			$this->aObjects = array_merge ($this->aPro,$this->aExonSuf);
-		}else{
-			$this->aObjects=$this->aExonSuf;
-		}
-	}
-	/**
-	* Cette méthode permet de récupérer les ID_PRO en fonction d'un ID_DNUPRO donné.
-	* \return Retourne un tableau de ID_PRO.
-	*/
-	function get_aId_Pro($oBD){
-		if($this->isEmpty()){
-			$aIdPro="";
-		}else{
-			include $this->sRessourcesFile;
-			$aIdPro=array();
-			$this->sSql = $aSql[$oBD->sgbd]['get_id_pro'];
-			$this->sSql = str_replace('$sIdDnupro', $this->encrypt($this->aFields['id_dnupro']), $this->sSql);
-			$oPDOresult= $oBD->execute($this->sSql);
-			if ( $oBD->enErreur()) {
-				$this->sStatus=1;
-				$this->sMessage = $oBD->getBDMessage();
-			}else{
-				while($aResultFetch = $oBD->tableauSuivant ($oPDOresult)){
-					array_push($aIdPro,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aIdPro;
-		$oPDOresult=$oBD->fermeResultat();
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Proprietaire
-	* \param $oBD Objet de connexion PDO_BD
-	* \return Retourne un tableau d'objets Proprietaire
-	*/
-	function get_aPro($oBD){
-		$aPro=array();
-		if($this->isEmpty()){
-			$aPro="";
-		}else{
-			$aIdPro = $this->get_aId_Pro($oBD);
-			foreach($aIdPro as $sIdPro){
-				array_push($aPro,new Mj_Proprietaire($this->encrypt($this->aFields['id_dnupro']),$sIdPro,$oBD));
-			}
-		}
-		return $aPro;
-	}
-	/**
-	* Cette méthode permet de récupérer les Rnuexn en fonction d'un Id_Suf donné
-	* \return Retourne un tableau de chaîne de caractères.
-	*/
-	function get_aRnuexn($oBD){
-		if($this->isEmpty()){
-			$aRnuexn="";
-		}else{
-			include $this->sRessourcesFile;
-			$aRnuexn=array();
-			$this->sSql=$aSql[$oBD->sgbd]['get_rnuexn'];
-			$this->sSql=str_replace('$sIdSuf', $this->aFields['id_suf'], $this->sSql);
-			$oPDOresult=$oBD->execute($this->sSql);
-			if ($oBD->enErreur()){
-				$this->sStatus=1;
-				$this->sMessage=$oBD->getBDMessage();
-			}else{
-				while($aResultFetch = $oBD->tableauSuivant ($oPDOresult)){
-					array_push($aRnuexn,$aResultFetch[0]);
-					$this->sStatus=0;
-				}
-			}
-		}
-		return $aRnuexn;
-	}
-	/**
-	* Cette méthode permet de récupérer la liste des objets Exon_Suf d'une parcelle
-	* \return Retourne un tableau d'objets Exon_Suf
-	*/
-	function get_aExon_Suf($oBD){
-		$aExonSuf=array();
-		if($this->isEmpty()){
-			$aExonSuf="";
-		}else{
-			$aRnuexn=$this->get_aRnuexn($oBD);
-			foreach($aRnuexn as $sRnuexn){
-				array_push($aExonSuf,new Mj_Exon_Suf($this->aFields['id_suf'],$sRnuexn,$oBD));
-			}
-		}
-		return $aExonSuf;
-	}
-
-	/**
-	* Cette méthode permet de construire un tableau correspondant au relevé de propriété.
-	* \return Retourne un tableau associatif correspondant au relevé de propriété.
-	*/
-	function getExportFields(){
-		$aExportFields=array();
-		if($this->isEmpty()){
-			$aExportFields="";
-		}else{
-			$aExportFields['dnupro']=$this->aFields['dnupro'];
-			$aExportFields['id_dnupro']=$this->aFields['id_dnupro'];
-			$aExportFields['s_tar']=$this->aFields['ccostn'];
-			$aExportFields['suf']=$this->aFields['ccosub'];
-			$aExportFields['gnexps']=$this->aFields['gnexps'];
-			$aExportFields['grss_gr']=$this->aFields['dsgrpf'];
-			$aExportFields['occupation']=$this->aFields['l_dsgrpf'];
-			$aExportFields['nature']=$this->aFields['l_dsgrpf'];
-			$aExportFields['groupe']=$this->aFields['l_cgrnum'];
-			$aExportFields['clas']=$this->aFields['dclssf'];
-			$aExportFields['nat_cult']=$this->aFields['cnatsp'];
-			$aExportFields['ha']=$this->getContenanceHA();
-			if ($aExportFields['ha'] == 0){
-				$aExportFields['ha']=' ';
-			}
-			$aExportFields['a']=$this->getContenanceA();
-			$sContenanceA=$aExportFields['a'];
-			$sContenanceA= strval($sContenanceA);
-			$sTlenA=strlen($sContenanceA);
-			if ($aExportFields['ha'] == ' ' and $aExportFields['a'] == 0){
-				$aExportFields['a']=' ';
-			}else{
-				if ($aExportFields['ha'] == ' ' and $sTlenA == 2 and (substr($aExportFields['a'],0,1)== 0)){
-					$sDeuxiemeValeur= substr($aExportFields['a'],1,1);
-					$aExportFields['a']= ' '.$sDeuxiemeValeur;
-				}else{
-					if ($aExportFields['ha'] != ' ' and $sTlenA == 1){
-						$aExportFields['a']='0'.$aExportFields['a'];
-					}
-				}
-			}
-			$aExportFields['ca']=$this->getContenanceCA();
-			$sContenanceCa=$aExportFields['ca'];
-			$sContenanceCa=strval($sContenanceCa);
-			$sTlen=strlen($sContenanceCa);
-			if ($aExportFields['a'] != 0)
-				if ($sTlen == 1){
-					$aExportFields['ca']='0'.$aExportFields['ca'];
-				}
-			$aExportFields['revenu_cadastral']=$this->getRevenuCadastral();
-			$aExportFields['revenu_cadastral_txt']=$this->setFloatToText($this->getRevenuCadastral());
-			$aExportFields['revenu_cadastral_exo']=$this->getRevenuCadastralExo($sCollectivite);
-			$aExportFields['revenu_reference']=$this->getRevenuReference();
-			$aExportFields['revenu_reference_txt']=$this->setFloatToText($this->getRevenuReference());
-			$aExportFields['nat_exo']=$this->getNatExo();
-			$aExportFields['ccolloc']=$this->getCcolloc($sCollectivite);
-			$aExportFields['contenance_suf']=$this->getContenance();
-			if ($this->aFields['dnulot']){
-				$aExportFields['num_voirie']='*****';
-				$aExportFields['dnulot']=$this->aFields['dnulot'];
-				$aExportFields['dnupdl']=$this->aFields['dnupdl'];
-				$aExportFields['dnumql']=$this->aFields['dnumql'];
-				$aExportFields['ddenql']=$this->aFields['ddenql'];
-			}
-		}
-		return $aExportFields;
-	}
-	/**
-	* Cette méthode permet de récupérer les caractères correspondants à la colonne HA depuis l'attribut dcntsf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getContenanceHA(){
-		$sContenanceHA=$this->aFields['dcntsf'];
-		$sContenanceHA=substr("$sContenanceHA",0,5);
-		$iContenanceHA= (int) $sContenanceHA;
-		return $iContenanceHA;
-	}
-	/**
-	* Cette méthode permet de récupérer les caractères correspondants à la colonne A depuis l'attribut dcntsf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getContenanceA(){
-		$sContenanceA=$this->aFields['dcntsf'];
-		$sContenanceA=substr("$sContenanceA", 5, 2);
-		return $sContenanceA;
-	}
-	/**
-	* Cette méthode permet de récupérer les caractères correspondants à la colonne CA depuis l'attribut dcntsf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getContenanceCA(){
-		$sContenanceCA=$this->aFields['dcntsf'];
-		$sContenanceCA=substr("$sContenanceCA", 7, 2);
-		return $sContenanceCA;
-	}
-	/*
-	* Cette méthode permet de récupérer la contenance totale d'une suf.
-	* \return Retourne un entier.
-	*/
-	function getContenance(){
-		$iContenanceHA = (int) $this->getContenanceHA();
-		$iContenanceA = (int) $this->getContenanceA();
-		$iContenanceCA = (int) $this->getContenanceCA();
-		$iContenance = ($iContenanceHA*10000)+($iContenanceA*100)+($iContenanceCA);
-		return $iContenance;
-	}
-	/**
-	* Cette méthode permet de diviser l'attribut drcsuba par 100.
-	* \return Retourne un float.
-	*/
-	function getRevenuCadastral(){
-		$fRevenuCadastral=floatval($this->aFields['drcsuba']);
-		$fRevenuCadastral=$fRevenuCadastral/100;
-		return $fRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de diviser l'attribut drcsub par 100.
-	* \return Retourne un float.
-	*/
-	function getRevenuReference(){
-		$fRevenuReference=floatval($this->aFields['drcsub']);
-		$fRevenuReference=$fRevenuReference/100;
-		return $fRevenuReference;
-	}
-
-	/**
-	* Cette méthode permet de diviser l'attribut rcexnba par 100.
-	* \return Retourne un float.
-	*/
-	function getRevenuCadastralExo($sCollectivite){
-		foreach($this->aExonSuf as $aFieldsRevExo) {
-			if (rtrim($aFieldsRevExo->aFields['ccolloc']) == $sCollectivite) {
-				$fRevenuCadastral=floatval($aFieldsRevExo->aFields['rcexnba']);
-				$fRevenuCadastral=$fRevenuCadastral/100;
-			}
-		}
-		return $fRevenuCadastral;
-	}
-	/**
-	* Cette méthode permet de récupérer la valeur de l'attribut 'nat_exo' du tableau aExonSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getNatExo(){
-		return $this->aExonSuf[0]->aFields['gnexts'];
-	}
-	/** 
-	* Cette méthode permet de récupérer la valeur de l'attribut 'ccolloc' du tableau aExonSuf.
-	* \return Retourne une chaîne de caractères.
-	*/
-	function getCcolloc($sCollectivite){
-		$bVal=false;
-		foreach($this->aExonSuf as $aFieldsExo) {
-			if(rtrim($aFieldsExo->aFields['ccolloc']) == $sCollectivite) {
-				$aReturn=$aFieldsExo;
-				$bVal=true;
-			}
-		}
-		return $bVal;
-	}
-	/**
-	* Cette méthode permet de formater un décimal pour l'affichage.
-	* \return Retourne une chaine
-	*/
-	function setFloatToText($fFloat){
-		return number_format($fFloat,2,'.','');
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/FP.xslt b/web_service/class/majic_lib/xsl/FP.xslt
deleted file mode 100755
index 64881b2790eef9e028ee40ed5f818ad271fb38d8..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/FP.xslt
+++ /dev/null
@@ -1,1481 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE xsl:stylesheet [
-  <!ENTITY nbsp "&#160;">
-]>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
-  <xsl:template match="/">
-    <xsl:param name="poste"/>
-    <xsl:param name="type"/>
-
-    <html xmlns="http://www.w3.org/1999/xhtml"
-      lang="fr"
-      >
-      <head>
-        <style type="text/css">
-          body {
-          font-family:arial, "sans-serif";
-          padding:100px 20px 20px 20px;
-          background-image:url(http://img15.hostingpics.net/pics/500812bandeau.jpg);
-          background-repeat:no-repeat;
-          background-position:center top;
-          }
-
-          hr {
-          text-align: center;
-          width:100%;
-          color:#F1B4B4;
-          }
-
-          table {
-          text-align:left;
-          width:100%;
-          font-size:12px;
-          margin-bottom:35px;
-          }
-
-          td {
-          text-align:left;
-
-          background-color:#F7F7F7 ;
-          }
-
-          h1 {
-          font-family:tahoma;
-          color: #008393;
-          }
-
-          th {
-          text-align:left;
-
-          background-color:#eeeeee;
-          }
-
-          h4 {
-          font-family:tahoma;
-          color: #990000;
-          }
-
-          h5 {
-          font-family:tahoma;
-          }
-        </style>
-      </head>
-      <body>
-        <hr size="5"/>
-        <h1>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-            Parcelle <xsl:value-of select="@section" /><xsl:value-of select="format-number(@num_parc, '0000')"/>
-          </xsl:for-each>
-        </h1>
-        <hr size="10"/>
-        <Table cellspacing="2" cellpadding="5" >
-          <TR>
-            <TH align="left" width ="15%">
-              Adresse :
-            </TH>
-            <TD align="left" width ="85%">
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                <xsl:value-of select="@num_voirie" />
-                <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
-                <xsl:value-of select="@adresse" />
-              </xsl:for-each>
-            </TD>
-          </TR>
-          <TR>
-            <TH align="left" width ="15%">
-              Commune :
-            </TH>
-            <TD align="left" width ="85%">
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                <xsl:value-of select="@libcom" />
-              </xsl:for-each>
-            </TD>
-          </TR>
-          <TR>
-            <TH align="left" width ="15%">
-              Code Commune (Insee) :
-            </TH>
-            <TD align="left" width ="85%">
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                <xsl:value-of select="@codeinsee" />
-              </xsl:for-each>
-            </TD>
-          </TR>
-          <TR>
-            <TH align="left" width ="15%">
-              Compte Propriétaire :
-            </TH>
-            <TD align="left" width ="85%">
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                <xsl:value-of select="Mj_Parcelle/@dnupro" />
-                <BR/>
-              </xsl:for-each>
-            </TD>
-          </TR>
-          <TR>
-            <TH align="left" width ="15%">
-              Surface cadastrale (m²) :
-            </TH>
-            <TD align="left" width ="85%">
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                <xsl:value-of select="@total_contenance_m2" />
-              </xsl:for-each>
-            </TD>
-          </TR>
-          <xsl:if test="not($type='restreint')">
-            <TR>
-              <TH align="left" width ="15%">
-                Urbaine :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select="@gurbpa" />
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Bâtie :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select="@gparbat" />
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Parcelle primitive :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:if test="not(@num_parc_prim = '')">
-                    <xsl:value-of select="@num_parc_prim" />
-                  </xsl:if>
-                  <xsl:if test="@num_parc_prim = ''">
-                    -
-                  </xsl:if>
-                </xsl:for-each>
-              </TD>
-            </TR>
-          </xsl:if>
-        </Table>
-        <xsl:if test="$poste='internet'">
-          <img>
-            <xsl:attribute name="src">http://mapsrv.rgd74.fr/geomap70/mg/net/ggGetMapImage.aspx?USER=Administrator&amp;PWD=admin&amp;MAPNAME=Library://RISNET_GESTION/Cartes/RGD 73-74 - RISNET_GESTION_73_74.MapDefinition&amp;SELOBJS=PARCELLE%2C<xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                <xsl:value-of select='substring(@idpar,1,2)'/>
-                <xsl:value-of select='substring(@idpar,4,3)'/>
-                <xsl:if test ="substring(@idpar,7,3)='000'">
-                  <xsl:text disable-output-escaping="yes">---</xsl:text>
-                </xsl:if>
-                <xsl:if test ="not(substring(@idpar,7,3)='000')">
-                  <xsl:value-of select='substring(@idpar,7,3)'/>
-                </xsl:if>
-                <xsl:if test ="substring(@idpar,10,1)='0'">
-                  <xsl:text disable-output-escaping="yes">-</xsl:text>
-                </xsl:if>
-                <xsl:if test ="not(substring(@idpar,10,1)='0')">
-                  <xsl:value-of select='substring(@idpar,10,1)'/>
-                </xsl:if>
-                <xsl:value-of select='substring(@idpar,11,1)'/>
-                <xsl:value-of select='substring(@idpar,12)'/>
-              </xsl:for-each>-&amp;CENTERX=&amp;CENTERY=&amp;SCALE=*8&amp;HEIGHT=400&amp;WIDTH=575&amp;RESULTTYPE=JPG</xsl:attribute>
-          </img>
-          <h4>
-            Urbanisme : POS/PLU
-          </h4>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH>
-                Zonage
-              </TH>
-              <TH>
-                Libellé
-              </TH>
-              <TH>
-                Surface (m²)*
-              </TH>
-              <TH>
-                COS
-              </TH>
-              <TH>
-                CES
-              </TH>
-              <TH>
-                Hauteur
-              </TH>
-              <TH>
-                Réglement de la zone
-              </TH>
-            </TR>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-              <TR>
-                <TD>
-                  <xsl:value-of select="@zonage" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@lib_zonage" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@surface" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@cos" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@ces" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@hauteur" /> &nbsp;
-                </TD>
-                <TD>
-                  <a>
-                    <xsl:attribute name="href">http://mapris.rgd74.fr/DocumentsPartenaires/Reglement_POS/<xsl:value-of select="@idreg" />.pdf</xsl:attribute>Consulter le réglement
-                  </a> &nbsp;
-                </TD>
-              </TR>
-            </xsl:for-each>
-          </Table>
-          <h6>*calcul sur la surface graphique, exclusion si surface &#139; 2 m² </h6>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-            <a>
-              <xsl:attribute name="href">http://mapris.rgd74.fr/Risnet_Gestion/Application/Rapport/etat_pos_plu/fiche_pos.asp?codcom=<xsl:value-of select="@codecom" /></xsl:attribute>Avancement de l'actualisation/mise en ligne du POS/PLU de cette commune
-            </a> &nbsp;
-          </xsl:for-each>
-        </xsl:if>
-        <xsl:if test="not($type='sansnom')">
-          <hr size="5"/>
-          <h4>
-            Propriétaire(s) de la parcelle
-          </h4>
-          <h6>*Cliquer sur le n° de compte pour accéder à son relevé de propriété </h6>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH colspan="2">
-                Compte
-              </TH>
-              <TH>
-                Nom
-              </TH>
-              <xsl:if test="$type='complet'">
-                <TH>
-                  Etat Civil
-                </TH>
-              </xsl:if>
-              <TH>
-                Adresse
-              </TH>
-              <TH>
-                Type
-              </TH>
-            </TR>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-              <TR>
-                <TD colspan="2">
-                  <xsl:if test="$type='complet'">
-                    <a>
-                      <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                    </a>
-                  </xsl:if>
-                  <xsl:if test="$type='restreint'">
-                    <a>
-                      <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                    </a>
-                  </xsl:if>
-                  <xsl:if test="$type='sansnom'">
-                    <xsl:value-of select="@dnupro" />&nbsp;
-                  </xsl:if>
-                </TD>
-                <TD>
-                  <xsl:if test="$type='complet'">
-                    <xsl:value-of select="@proprietaire_nom" />&nbsp;
-                  </xsl:if>
-                  <xsl:if test="$type='restreint'">
-                    <xsl:value-of select="@proprietaire_nom_tiers" />&nbsp;
-                  </xsl:if>
-                </TD>
-                <xsl:if test="$type='complet'">
-                  <TD>
-                    <xsl:value-of select="@jdatnss" />
-                    <BR/>
-                    <xsl:value-of select="@dldnss" />&nbsp;
-                  </TD>
-                </xsl:if>
-                <TD>
-                  <xsl:value-of select="@proprietaire_adresse" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@l_ccodro" /> &nbsp;
-                </TD>
-              </TR>
-              <xsl:if test ="..//Mj_Parcelle/Mj_Suf/Mj_Proprietaire[@dnupro]">
-                <tr>
-                  <th colspan="6">
-                    Détail
-                  </th>
-                </tr>
-                <TR>
-                  <TH>
-                    Numéro du lot
-                  </TH>
-                  <TH>
-                    Compte
-                  </TH>
-                  <TH>
-                    Nom
-                  </TH>
-                  <xsl:if test="$type='complet'">
-                    <TH>
-                      Etat Civil
-                    </TH>
-                  </xsl:if>
-                  <TH>
-                    Adresse
-                  </TH>
-                  <TH>
-                    Type
-                  </TH>
-                </TR>
-                <xsl:for-each select="../Mj_Parcelle/Mj_Suf/Mj_Proprietaire">
-                  <tr>
-                    <td>
-                      <xsl:value-of select="../@dnulot" /> &nbsp;
-                    </td>
-                    <td>
-                      <xsl:if test="$type='complet'">
-                        <a>
-                          <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                        </a>
-                      </xsl:if>
-                      <xsl:if test="$type='restreint'">
-                        <a>
-                          <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                        </a>
-                      </xsl:if>
-                      <xsl:if test="$type='sansnom'">
-                        <xsl:value-of select="@dnupro" />&nbsp;
-                      </xsl:if>
-                    </td>
-                    <td>
-                      <xsl:if test="$type='complet'">
-                        <xsl:value-of select="@proprietaire_nom" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="$type='restreint'">
-                        <xsl:value-of select="@proprietaire_nom_tiers" />&nbsp;
-                      </xsl:if>
-                    </td>
-                    <xsl:if test="$type='complet'">
-                    <td>
-                        <xsl:value-of select="@jdatnss" />
-                        <BR/>
-                        <xsl:value-of select="@dldnss" />&nbsp;   
-                    </td>
-                    </xsl:if>
-                    <td>
-                      <xsl:value-of select="@proprietaire_adresse" />&nbsp;
-                    </td>
-                    <td>
-                      <xsl:value-of select="@l_ccodro" /> &nbsp;
-                    </td>
-                  </tr>
-                </xsl:for-each>
-              </xsl:if>
-            </xsl:for-each>
-          </Table>
-        </xsl:if>
-        <hr size="5"/>
-        <h4>
-          Subdivision(s) fiscale(s)
-        </h4>
-        <Table cellspacing="2" cellpadding="5">
-          <TR>
-            <TH>
-              Lettre
-            </TH>
-            <TH>
-              Groupe
-            </TH>
-            <TH>
-              Nature
-            </TH>
-            <TH>
-              Classe
-            </TH>
-            <TH>
-              Compte
-            </TH>
-            <TH>
-              Surface (m²)
-            </TH>
-            <xsl:if test="not($type='restreint')">
-              <TH>
-                Revenu (€)
-              </TH>
-            </xsl:if>
-            <TH>
-              Référence
-            </TH>
-          </TR>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_Suf">
-            <TR>
-              <TD>
-                <xsl:if test="not(@suf = '')">
-                  <xsl:value-of select="@suf" />&nbsp;
-                </xsl:if>
-                <xsl:if test="@suf = ''">
-                  -
-                </xsl:if>
-              </TD>
-              <TD>
-                <xsl:if test="not(@groupe = '')">
-                  <xsl:value-of select="@groupe" />&nbsp;
-                </xsl:if>
-                <xsl:if test="@groupe = ''">
-                  -
-                </xsl:if>
-              </TD>
-              <TD>
-                <xsl:if test="not(@nature = '')">
-                  <xsl:value-of select="@nature" />&nbsp;
-                </xsl:if>
-                <xsl:if test="@nature = ''">
-                  -
-                </xsl:if>
-              </TD>
-              <TD>
-                <xsl:if test="not(@clas = '')">
-                  <xsl:value-of select="@clas" />&nbsp;
-                </xsl:if>
-                <xsl:if test="@clas = ''">
-                  -
-                </xsl:if>
-              </TD>
-              <TD>
-                <xsl:value-of select="@dnupro" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@contenance_suf" />&nbsp;
-              </TD>
-              <xsl:if test="not($type='restreint')">
-                <TD>
-                  <xsl:value-of select="@revenu_cadastral_txt" />&nbsp;
-                </TD>
-              </xsl:if>
-              <TD>
-                <xsl:value-of select="@revenu_reference_txt" />&nbsp;
-              </TD>
-            </TR>
-          </xsl:for-each>
-        </Table>
-        <xsl:if test="not($type='sansnom')">
-          <xsl:if test="count(Mj/Mj_Compte_Communal_Parcelle/Mj_Bati) &gt; 0">
-            <hr size="5"/>
-            <h4>
-              Elément(s) bâti(s)
-            </h4>
-            <xsl:if test="$type='complet'">
-              <h6>*Cliquer sur la référence du local pour accéder à sa description</h6>
-            </xsl:if>
-            <Table cellspacing="2" cellpadding="5">
-              <TR>
-                <TH>
-                  Ref. local
-                </TH>
-                <TH>
-                  Nature
-                </TH>
-                <TH>
-                  <xsl:if test="$type='restreint'">
-                    Etages
-                  </xsl:if>
-                  <xsl:if test="$type='complet'">
-                    Date mutation
-                  </xsl:if>
-                </TH>
-                <TH>
-                  Propriétaire(s)
-                </TH>
-              </TR>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-                <xsl:for-each select="Mj_Proprietaire">
-                  <TR>
-                    <xsl:if test="position()='1'">
-                      <TD>
-                        <xsl:if test="$type='restreint'">
-                          <xsl:value-of select="../@num_invar" />
-                        </xsl:if>
-                        <xsl:if test="$type='complet'">
-                          <a href="#{../@num_invar}">
-                            <xsl:value-of select="../@num_invar" />
-                          </a>&nbsp;
-                        </xsl:if>
-                      </TD>
-                      <TD>
-                        <xsl:value-of select="../@lib_nature" />&nbsp;
-                      </TD>
-                      <TD>
-                        <xsl:if test="$type='restreint'">
-                          <xsl:value-of select="../@niv" />&nbsp;
-                        </xsl:if>
-                        <xsl:if test="$type='complet'">
-                          <xsl:value-of select="../@date_mut" />&nbsp;
-                        </xsl:if>
-                      </TD>
-                    </xsl:if>
-                    <xsl:if test="position() &gt; '1'">
-                      <TD>
-                      </TD>
-                      <TD>
-                      </TD>
-                      <TD>
-                      </TD>
-                    </xsl:if>
-                    <TD>
-                      <xsl:if test="$type='restreint'">
-                        <xsl:value-of select="@dnupro" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="$type='complet'">
-                        <xsl:value-of select="@proprietaire_nom" />&nbsp;
-                      </xsl:if>
-                    </TD>
-                  </TR>
-                </xsl:for-each>
-              </xsl:for-each>
-            </Table>
-          </xsl:if>
-          <!-- .........................................Propriétaire de Bâtis, mode restreint................................................. -->
-          <xsl:if test="$type='restreint'">
-            <hr size="5"/>
-            <h4>
-              Propriétaire(s) du local
-            </h4>
-
-            <Table cellspacing="2" cellpadding="5">
-              <TR>
-                <TH>
-                  Compte
-                </TH>
-                <TH>
-                  Nom
-                </TH>
-                <TH>
-                  Adresse
-                </TH>
-                <TH>
-                  Type
-                </TH>
-              </TR>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati/Mj_Proprietaire">
-                <TR>
-                  <TD>
-                    <a>
-                      <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                    </a>
-                  </TD>
-                  <TD>
-                    <xsl:value-of select="@proprietaire_nom" />&nbsp;
-                  </TD>
-                  <TD>
-                    <xsl:value-of select="@proprietaire_adresse" />&nbsp;
-                  </TD>
-                  <TD>
-                    <xsl:value-of select="@l_ccodro" />&nbsp;
-                  </TD>
-                </TR>
-              </xsl:for-each>
-            </Table>
-
-          </xsl:if>
-          <!-- .........................................Description du local, mode complet................................................. -->
-          <xsl:if test="$type='complet'">
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-              <hr size="15"/>
-              <h1>
-
-                <a name="{@num_invar}">
-                  Local n° <xsl:value-of select="@num_invar" />
-                </a>
-
-              </h1>
-              <hr size="10"/>
-              <Table cellspacing="2" cellpadding="5">
-                <TR>
-                  <TH align="left" width="39%">
-
-                  </TH>
-                  <TH align="left" width="40%">
-
-                  </TH>
-                  <TH align="center" width="7%">
-                    Bat
-                  </TH>
-                  <TH align="center" width="7%">
-                    Esc
-                  </TH>
-                  <TH align="center" width="7%">
-                    Etage
-                  </TH>
-                </TR>
-
-                <TR>
-                  <TH align="left" width="39%">
-                    Adresse :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@voirie" />&nbsp;<xsl:value-of select="@adresse" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-                    <xsl:value-of select="@bat" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-                    <xsl:value-of select="@ent" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-                    <xsl:value-of select="@niv" />&nbsp;
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Commune :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@libcom" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Type :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@dteloc" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Occupation :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@lib_occupation" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Nature :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@lib_nature" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Année de construction :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:if test="not(@annee_constr = '0')">
-                      <xsl:value-of select="@annee_constr" />&nbsp;
-                    </xsl:if>
-                    <xsl:if test="@annee_constr = '0'">
-                      -
-                    </xsl:if>
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Date de mutation :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@date_mut" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Valeur cadastrale (€) :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="Mj_Pev/@revenu_cadastral" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-                <TR>
-                  <TH align="left" width="39%">
-                    Niveaux :
-                  </TH>
-                  <TD align="left" width="40%">
-                    <xsl:value-of select="@niveaux" />&nbsp;
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                  <TD align="center" width="7%">
-
-                  </TD>
-                </TR>
-
-              </Table>
-              <hr size="5"/>
-              <h4>
-                Propriétaire(s) du local
-              </h4>
-              <Table cellspacing="2" cellpadding="5">
-                <TR>
-                  <TH>
-                    Compte
-                  </TH>
-                  <TH>
-                    Nom
-                  </TH>
-                  <TH>
-                    État Civil
-                  </TH>
-                  <TH>
-                    Adresse
-                  </TH>
-                  <TH>
-                    Type
-                  </TH>
-                </TR>
-
-                <xsl:for-each select="Mj_Proprietaire">
-                  <TR>
-                    <TD>
-                      <a>
-                        <xsl:attribute name="href">http://ns227471.ovh.net/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0</xsl:attribute><xsl:value-of select="@dnupro" />
-                      </a>
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="@proprietaire_nom" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="@jdatnss" />
-                      <BR/>
-                      <xsl:value-of select="@dldnss" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="@proprietaire_adresse" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="@l_ccodro" />&nbsp;
-                    </TD>
-                  </TR>
-                </xsl:for-each>
-
-              </Table>
-              <hr size="5"/>
-              <h4>
-                P.E.V
-              </h4>
-              <Table cellspacing="2" cellpadding="5">
-                <TR>
-                  <TH>
-                    N°
-                  </TH>
-                  <TH>
-                    Nature
-                  </TH>
-                  <TH>
-                    Catégorie fiscale
-                  </TH>
-                  <TH>
-                    Série Tarif batie
-                  </TH>
-                  <TH>
-                    Local Type
-                  </TH>
-                  <TH>
-                    Val. Loc. Ref. (€)
-                  </TH>
-                  <TH>
-                    Val. Loc. Ann. (€)
-                  </TH>
-                  <TH>
-                    Nature exonération
-                  </TH>
-                </TR>
-
-                <xsl:for-each select="Mj_Pev">
-                  <TR>
-                    <TD>
-                      <xsl:if test="not(@num_pev = '')">
-                        <xsl:value-of select="@num_pev" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@num_pev = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@l_nature = '')">
-                        <xsl:value-of select="@l_nature" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@l_nature = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@cat = '')">
-                        <xsl:value-of select="@cat" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@cat = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@s_tar = '')">
-                        <xsl:value-of select="@s_tar" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@s_tar = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@local_type = '')">
-                        <xsl:value-of select="@local_type" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@local_type = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@val_loc_ref = '')">
-                        <xsl:value-of select="@val_loc_ref" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@val_loc_ref = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@val_loc_ann = '')">
-                        <xsl:value-of select="@val_loc_ann" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@val_loc_ann = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                    <TD>
-                      <xsl:if test="not(@l_nat_exon = '')">
-                        <xsl:value-of select="@l_nat_exon" />&nbsp;
-                      </xsl:if>
-                      <xsl:if test="@l_nat_exon = ''">
-                        -
-                      </xsl:if>
-                    </TD>
-                  </TR>
-                </xsl:for-each>
-              </Table>
-
-              <xsl:if test ="Mj_Pev/Mj_Habit_Descr[@num_pev]">
-                <hr size="5"/>
-                <h4>
-                  Habitation principale
-                  <BR/>
-                </h4>
-                <h5>
-                  N° P.E.V : <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@num_pev" />
-                </h5>
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    <TH width="30%">
-                      Divers
-                    </TH>
-                    <TH width="40%">
-                      Eléments de confort
-                    </TH>
-                    <TH width="10%">
-                      Pièces
-                    </TH>
-                    <TH width="20">
-                      Surfaces (m²)
-                    </TH>
-                  </TR>
-                  <TR>
-                    <TD width="30%">
-                      <Table cellspacing="2" cellpadding="5">
-                        <TR>
-                          <TD align ="left">
-                            Surface (m²) :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_piece_total" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Nbr pièces :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_total" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Nbr pièces princ. :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_principal" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Entretien :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@l_Etat" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Année de Constr. :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@annee_constr" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Nbr Niveaux :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_niveaux" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Gros murs :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@lib_mat_gros_mur" />&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Toitures :
-                          </TD>
-
-                          <TD align ="right">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@lib_mat_toiture" />&nbsp;
-                          </TD>
-
-                        </TR>
-                      </Table>
-                    </TD>
-                    <TD width="40%">
-                      <Table cellspacing="2" cellpadding="5">
-                        <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_baignoires &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_baignoires" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Baignoire(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_douches &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_douches" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Douche(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_lavabos &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_lavabos" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Lavabo(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_wc &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_wc" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              W.C.
-                            </TD>
-                          </TR>
-                        </xsl:if>
-                        
-                        
-                        <TR>
-                          <TD align ="left">
-                            Eau :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@eau = 'EAU'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@eau = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Electricité :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@elect = 'ELECT'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@elect = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Gaz :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@gaz = 'GAZ'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@gaz = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Esc. de service :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@esc_serv = 'ESC_SERV'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@esc_serv = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Ascenseur :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@asc = 'ASC'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@asc = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Chauffage :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@chauf = 'CHAUF'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@chauf = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Vide ordure :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@vide_ord = 'VIDE_ORD'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@vide_ord = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Égout :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@egout = 'EGOUT'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@egout = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                      </Table>
-                    </TD>
-                    <TD width="15%">
-                      <Table cellspacing="2" cellpadding="5">
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_sam" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            S. a manger
-                          </TD>
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_chambre" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            Chambre
-                          </TD>
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_m9" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            Cuisine (inf.9m2)
-                          </TD>
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_p9" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            Cuisine (sup.9m2)
-                          </TD>
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_salle_eau" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            S. de bain
-                          </TD>
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_annexe" />&nbsp;
-                          </TD>
-
-                          <TD align ="left" width ="75%">
-                            Annexe
-                          </TD>
-                        </TR>
-                      </Table>
-                    </TD>
-                    <TD width="15%">
-                      <Table cellspacing="2" cellpadding="5">
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_cave" />&nbsp;
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            Cave(s)&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_grenier" />&nbsp;
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            Grenier(s)&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_terrasse" />&nbsp;
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            Terrasse(s)&nbsp;
-                          </TD>
-
-                        </TR>
-                        <TR>
-
-                          <TD align ="left">
-                            <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_garage" />&nbsp;
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            Garage(s)&nbsp;
-                          </TD>
-
-                        </TR>
-                      </Table>
-                    </TD>
-                  </TR>
-                </Table>
-              </xsl:if>
-              <xsl:if test ="Mj_Pev/Mj_Depend_Descr[@num_pev]">
-                <hr size="5"/>
-                <h4>
-                  Dépendance(s)
-                </h4>
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    <TH>
-                      N°
-                    </TH>
-                    <TH>
-                      Nature
-                    </TH>
-                    <TH>
-                      Surface (m²)
-                    </TH>
-                    <TH>
-                      Pondération
-                    </TH>
-                    <TH>
-                      Entretien
-                    </TH>
-                    <TH>
-                      Gros murs
-                    </TH>
-                    <TH>
-                      Toitures
-                    </TH>
-                    <TH>
-                      Elt. confort
-                    </TH>
-                  </TR>
-                  <TR>
-
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@num_pev" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nature" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@surface" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@ponderation" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@l_Etat" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@lib_mat_gros_mur" />&nbsp;
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@lib_mat_toiture" />&nbsp;
-                    </TD>
-
-                    <TD>
-                      <Table cellspacing="2" cellpadding="5">
-                        <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_baignoires &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_baignoires" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Baignoire(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_douches &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_douches" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Douche(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_lavabos &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_lavabos" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              Lavabo(s)
-                            </TD>
-                          </TR>
-                        </xsl:if>
-
-                        <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_wc &gt; 0">
-                          <TR>
-                            <TD align ="left">
-                              <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_wc" />&nbsp;
-                            </TD>
-                            <TD align ="left" width ="75%">
-                              W.C.
-                            </TD>
-                          </TR>
-                        </xsl:if>
-                        <TR>
-                          <TD align ="left">
-                            Eau :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@eau = 'EAU'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@eau = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Chauffage :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@chauf = 'CHAUF'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@chauf = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                        <TR>
-                          <TD align ="left">
-                            Electricité :
-                          </TD>
-                          <TD align ="left" width ="75%">
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@elect = 'ELECT'">
-                              Oui
-                            </xsl:if>
-                            <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@elect = ''">
-                              -
-                            </xsl:if>
-                          </TD>
-                        </TR>
-                      </Table>
-                    </TD>
-                  </TR>
-                </Table>
-              </xsl:if>
-              <xsl:if test ="Mj_Pev/Mj_Prof_Descr[@num_pev]">
-                <hr size="5"/>
-                <h4>
-                  Locaux Professionnels
-                </h4>
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    <TH>
-                      N°
-                    </TH>
-                    <TH>
-                      Surface (m²)
-                    </TH>
-                  </TR>
-                  <TR>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@num_pev" />
-                    </TD>
-                    <TD>
-                      <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@surface" />
-                    </TD>
-                  </TR>
-                </Table>
-              </xsl:if>
-            </xsl:for-each>
-          </xsl:if>
-        </xsl:if>
-      </body>
-    </html>
-  </xsl:template>
-</xsl:stylesheet>
-
diff --git a/web_service/class/majic_lib/xsl/FP_New.xslt b/web_service/class/majic_lib/xsl/FP_New.xslt
deleted file mode 100755
index 89c143675d9771aebb2fb1e299becb364c81f141..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/FP_New.xslt
+++ /dev/null
@@ -1,1000 +0,0 @@
-<?xsl version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE xsl:stylesheet [
-  <!ENTITY nbsp "&#160;">
-]>
-<html xsl:version="1.0"
-      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-      lang="fr"
-      
-      >
-     
-      
-        <head>
-          <!--<link rel="stylesheet" href="C:\\svn\\lib\\majic_lib\\xsl\\style.css" type="text/css" />-->
-          <link href="style.css" type="text/css" rel="stylesheet" />
-          
-        </head>
-		    <body>
-          <hr size="5"/>
-          <h1>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-              Parcelle <xsl:value-of select="@section" /><xsl:value-of select="@num_parc" />
-            </xsl:for-each>
-          </h1>
-          <hr size="10"/>
-          <Table cellspacing="2" cellpadding="5" >
-            <TR>
-              <TH align="left" width ="15%">
-                Adresse :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select="@adresse" />
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Commune :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                  <xsl:value-of select="@libcom" />
-                </xsl:for-each>  
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Code Commune (Insee) :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                  <xsl:value-of select="@codeinsee" />
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Cpte Propriétaire :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                  <xsl:value-of select="Mj_Parcelle/@dnupro" /> <BR/>
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Surface cadastrale (m²) :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                   <xsl:value-of select="@total_contenance_m2" /> 
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Urbaine :
-              </TH>
-              <TD align="left" width ="85%">
-                A Chercher ???
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Bâtie :
-              </TH>
-              <TD align="left" width ="85%">
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select="@gparbat" />
-                </xsl:for-each>
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width ="15%">
-                Parcelle primitive :
-              </TH>
-              <TD align="left" width ="85%">
-                A Chercher ???
-              </TD>
-            </TR>
-           </Table>
-          <img>
-            <xsl:attribute name="src">
-              <xsl:value-of select = "concat('http://www.maison-passive-nice.fr/images/','parcelle.gif')"/>
-            </xsl:attribute>
-          </img>          
-            <hr size="5"/>
-            <h4>
-              Propriétaire(s) de la parcelle
-            </h4>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH>
-                Compte
-              </TH>
-              <TH>
-                Nom
-              </TH>
-              <TH>
-                Etat Civil
-              </TH>
-              <TH>
-                Adresse
-              </TH>
-              <TH>
-                Type
-              </TH>
-            </TR>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-            <TR>
-              <TD>
-                <xsl:value-of select="@dnupro" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@proprietaire_nom_tiers" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@jdatnss" />
-                <BR/>
-                <xsl:value-of select="@dldnss" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@proprietaire_adresse" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@l_ccodro" /> &nbsp;
-              </TD>
-            </TR>
-            </xsl:for-each>
-          </Table>
-          <hr size="5"/>
-          <h4>
-            Subdivision(s) Fiscale(s)
-          </h4>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH>
-                Lettre
-              </TH>
-              <TH>
-                groupe
-              </TH>
-              <TH>
-                Nature
-              </TH>
-              <TH>
-                Occupation
-              </TH>
-              <TH>
-                Classe
-              </TH>
-              <TH>
-                Compte
-              </TH>
-              <TH>
-                Surface (m²)
-              </TH>
-              <TH>
-                Revenu (€)
-              </TH>
-              <TH>
-                Référence
-              </TH>
-            </TR>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_Suf">
-              <TR>
-                <TD>
-                  <xsl:value-of select="@suf" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@grss_gr" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@nat_cult" />&nbsp;
-                </TD>
-                <TD>
-                  ???
-                </TD>
-                <TD>
-                  <xsl:value-of select="@clas" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@dnupro" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@contenance_suf" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@revenu_cadastral_txt" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="@revenu_reference_txt" />&nbsp;
-                </TD>
-              </TR>
-            </xsl:for-each>
-          </Table>
-          <hr size="5"/>
-          <h4>
-            Elément(s) Bâti(s)
-          </h4>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH>
-                Ref. local
-              </TH>
-              <TH>
-                Nature
-              </TH>
-              <TH>
-                Date mutation
-              </TH>
-              <TH>
-                Propriétaire(s)
-              </TH>
-            </TR>
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-            <TR>
-              <TD>
-					<a href="<xsl:value-of select="@num_invar" />"><xsl:value-of select="@num_invar" /></a>&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@nature" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="@date_mut" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Proprietaire/@proprietaire_nom" />&nbsp;
-              </TD>
-            </TR>
-            </xsl:for-each>
-          </Table>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-          <hr size="15"/>
-          <h1>
-            
-            <a name="<xsl:value-of select="@num_invar" />">Local n° <xsl:value-of select="@num_invar" /></a>
-            
-          </h1>
-          <hr size="10"/>           
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH align="left" width="39%">
-                
-              </TH>
-              <TH align="left" width="40%">
-                
-              </TH>
-              <TH align="center" width="7%">
-                Bat
-              </TH>
-              <TH align="center" width="7%">
-                Esc
-              </TH>
-              <TH align="center" width="7%">
-                Etage
-              </TH>
-            </TR>
-            
-            <TR>
-              <TH align="left" width="39%">
-                Adresse :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@voirie" />&nbsp;<xsl:value-of select="@adresse" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-                <xsl:value-of select="@bat" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-                <xsl:value-of select="@ent" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-                <xsl:value-of select="@niv" />&nbsp;
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Commune :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@libcom" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Type :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@dteloc" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Occupation :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@occupation" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Nature :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@nature" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Année de construction :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@annee_constr" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Date de mutation :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@date_mut" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Valeur cadastrale (€) :
-              </TH>
-              <TD align="left" width="40%">
-                ????
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            <TR>
-              <TH align="left" width="39%">
-                Niveaux :
-              </TH>
-              <TD align="left" width="40%">
-                <xsl:value-of select="@niveaux" />&nbsp;
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-              <TD align="center" width="7%">
-
-              </TD>
-            </TR>
-            
-          </Table>
-          <hr size="5"/>
-            <h4>
-              Propriétaire(s) du local
-            </h4>
-            <Table cellspacing="2" cellpadding="5">
-              <TR>
-                <TH>
-                  Compte
-                </TH>
-                <TH>
-                  Nom
-                </TH>
-                <TH>
-                  État Civil
-                </TH>
-                <TH>
-                  Adresse
-                </TH>
-                <TH>
-                  Type
-                </TH>
-              </TR>
-
-              <TR>
-                <TD>
-                  <xsl:value-of select="Mj_Proprietaire/@dnupro" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Proprietaire/@proprietaire_nom" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Proprietaire/@jdatnss" />
-                  <BR/>
-                  <xsl:value-of select="Mj_Proprietaire/@dldnss" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Proprietaire/@proprietaire_adresse" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Proprietaire/@l_ccodro" />&nbsp;
-                </TD>
-              </TR>
-
-            </Table>
-            <hr size="5"/>
-          <h4>
-            P.E.V
-          </h4>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH>
-                N°
-              </TH>
-              <TH>
-                Nature
-              </TH>
-              <TH>
-                Catégorie
-              </TH>
-              <TH>
-                Tarif
-              </TH>
-              <TH>
-                Local Type
-              </TH>
-              <TH>
-                Val. Loc. Ref. (€)
-              </TH>
-              <TH>
-                Val. Loc. Ann. (€)
-              </TH>
-              <TH>
-                Nat. Exemp.
-              </TH>
-            </TR>
-            
-            <TR>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@num_pev" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@af" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@cat" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@s_tar" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@local_type" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@val_loc_ref" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@val_loc_ann" />&nbsp;
-              </TD>
-              <TD>
-                <xsl:value-of select="Mj_Pev/@nature" />&nbsp;
-              </TD>
-            </TR>            
-          </Table>
-
-          <xsl:if test ="Mj_Pev/Mj_Habit_Descr[@num_pev]"> 
-          <hr size="5"/>
-          <h4>
-            Habitation principale
-            <BR/>
-          </h4>
-            <h5>
-              N° P.E.V : <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@num_pev" />
-            </h5>
-          <Table cellspacing="2" cellpadding="5">
-            <TR>
-              <TH width="30%">
-                Divers
-              </TH>
-              <TH width="40%">
-                Eléments de confort
-              </TH>
-              <TH width="10%">
-                Pièces
-              </TH>
-              <TH width="20">
-                Surfaces (m²)
-              </TH>
-            </TR>
-            <TR>
-              <TD width="30%">
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    <TD align ="left">
-                      Surface (m²) :
-                    </TD>
-                    
-                    <TD align ="right">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_piece_total" />&nbsp;
-                    </TD>
-                   
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Nbr pièces :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_total" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Nbr pièces princ. :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_principal" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Entretien :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@Etat" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Année de Constr. :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@annee_constr" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Nbr Niveaux :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_niveaux" />&nbsp;
-                      </TD>
-                   
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Gros murs :
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@mat_gros_mur" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Toitures : 
-                    </TD>
-                    
-                      <TD align ="right">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@mat_toiture" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                </Table>
-              </TD> 
-              <TD width="40%">
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    <TD align ="left">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_baignoires" />&nbsp;
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      Baignoire(s)
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_douches" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      Douche(s)
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_lavabos" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      Lavabo(s)
-                    </TD>  
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_wc" />&nbsp;
-                      </TD>
-                  
-                    <TD align ="left" width ="75%">
-                      W.C.
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                       Eau :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                       <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@eau" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Electricité :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@elect" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Gaz :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@gaz" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Esc. de service :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@esc_serv" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Ascenseur :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@asc" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Chauffage :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@chauf" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Vide ordure :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@vide_ord" />&nbsp;
-                    </TD>
-                  </TR>
-                  <TR>
-                    <TD align ="left">
-                      Égout :
-                    </TD>
-                    <TD align ="left" width ="75%">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@egout" />&nbsp;
-                    </TD>
-                  </TR>
-                </Table>
-              </TD>
-              <TD width="15%">
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_sam" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      S. a manger
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_chambre" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      Chambre
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_m9" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      Cuisine (inf.9m2)
-                    </TD>
-                  </TR>
-                  <TR>
-
-                    <TD align ="left">
-                      <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_p9" />&nbsp;
-                    </TD>
-
-                    <TD align ="left" width ="75%">
-                      Cuisine (sup.9m2)
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_salle_eau" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      S. de bain
-                    </TD>
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_annexe" />&nbsp;
-                      </TD>
-                    
-                    <TD align ="left" width ="75%">
-                      Annexe
-                    </TD>
-                  </TR>
-                </Table>
-              </TD>
-              <TD width="15%">
-                <Table cellspacing="2" cellpadding="5">
-                  <TR>
-                  
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_cave" />&nbsp;
-                      </TD>
-                      <TD align ="left" width ="75%">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@cave" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_grenier" />&nbsp;
-                      </TD>
-                      <TD align ="left" width ="75%">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@grenier" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                    
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_terrasse" />&nbsp;
-                      </TD>
-                      <TD align ="left" width ="75%">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@terrasse" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                  <TR>
-                   
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_garage" />&nbsp;
-                      </TD>
-                      <TD align ="left" width ="75%">
-                        <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@garage" />&nbsp;
-                      </TD>
-                    
-                  </TR>
-                </Table>
-              </TD>
-            </TR>
-          </Table>
-          </xsl:if>
-          <xsl:if test ="Mj_Pev/Mj_Depend_Descr[@num_pev]">
-            <hr size="5"/>
-            <h4>
-              Dépendance(s)
-            </h4>
-            <Table cellspacing="2" cellpadding="5">
-              <TR>
-                <TH>
-                  N°
-                </TH>
-                <TH>
-                  Nature
-                </TH>
-                <TH>
-                  Surface (m²)
-                </TH>
-                <TH>
-                  Pondération
-                </TH>
-                <TH>
-                  Entretien
-                </TH>
-                <TH>
-                  Gros murs
-                </TH>
-                <TH>
-                  Toitures
-                </TH>
-                <TH>
-                  Elt. confort
-                </TH>
-              </TR>
-              <TR>
-
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@num_depend" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nature" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@surface" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@ponderation" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@Etat" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@mat_gros_mur" />&nbsp;
-                </TD>
-                <TD>
-                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@mat_toiture" />&nbsp;
-                </TD>
-
-                <TD>
-
-                  (<xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@eau" />) (<xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@elect" />) (<xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@chauf" />)&nbsp;
-
-                  <Table cellspacing="2" cellpadding="5">
-                    <TR>
-
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_baignoires" />&nbsp;
-                      </TD>
-
-                      <TD align ="left" width ="75%">
-                        Baignoire(s)
-                      </TD>
-                    </TR>
-                    <TR>
-
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_douches" />&nbsp;
-                      </TD>
-
-                      <TD align ="left" width ="75%">
-                        Douche(s)
-                      </TD>
-
-                    </TR>
-                    <TR>
-
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_lavabos" />&nbsp;
-                      </TD>
-
-                      <TD align ="left" width ="75%">
-                        Lavabo(s)
-                      </TD>
-                    </TR>
-                    <TR>
-
-                      <TD align ="left">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_wc" />&nbsp;
-                      </TD>
-
-                      <TD align ="left" width ="75%">
-                        W.C.
-                      </TD>
-                    </TR>
-                  </Table>
-                </TD>
-              </TR>
-            </Table>
-          </xsl:if>
-            <xsl:if test ="Mj_Pev/Mj_Prof_Descr[@num_pev]">
-              <hr size="5"/>
-              <h4>
-                Locaux Professionnels
-              </h4>
-              <Table cellspacing="2" cellpadding="5">
-                <TR>
-                  <TH>
-                    N°
-                  </TH>
-                  <TH>
-                    Surface (m²)
-                  </TH>
-                </TR>
-                <TR>
-                  <TD>
-                    <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@num_pev" />
-                  </TD>
-                  <TD>
-                    <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@surface" />
-                  </TD>
-                </TR>
-              </Table>
-            </xsl:if>
-          </xsl:for-each>
-        </body> 
-   </html>
-    
diff --git a/web_service/class/majic_lib/xsl/FP_fo_Complet.xsl b/web_service/class/majic_lib/xsl/FP_fo_Complet.xsl
deleted file mode 100755
index 1ce443f25421b218f9d7409768da6d1b32330d51..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/FP_fo_Complet.xsl
+++ /dev/null
@@ -1,1762 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:template match="/">
-    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Helvetica">
-      <fo:layout-master-set>
-        <fo:simple-page-master master-name="simple" page-width="21cm" page-height="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-          <fo:region-body margin-top="0cm" margin-bottom="0cm" margin-left="0.5cm" margin-right="0.5cm" />
-        </fo:simple-page-master>
-      </fo:layout-master-set>
-
-      <fo:page-sequence master-reference="simple" font-family="Times">
-        <!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-        <fo:flow flow-name="xsl-region-body">
-          
-          <fo:block >
-            <fo:external-graphic >
-              <xsl:attribute name="src">
-                file:///C:\serveurs\Apache2\htdocs\rgd\images\bandeau.jpg
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>
-
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="17pt" color="#008393">
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-              Parcelle <xsl:value-of select="@section" /><xsl:value-of select="format-number(@num_parc, '0000')"/> 
-            </xsl:for-each>
-          </fo:block>
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2" >
-            <fo:table-column column-width="17%" />
-            <fo:table-column column-width="83%" />
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@num_voirie" />
-                      <xsl:value-of select="@adresse" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Commune :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@libcom" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Code Commune (Insee) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@codeinsee" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Cpte Propriétaire :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="Mj_Parcelle/@dnupro" />
-                    </fo:block>
-                    <!-- retour chariot -->
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface cadastrale (m²) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@total_contenance_m2" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Urbaine :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@gurbpa" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Bâtie :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@gparbat" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Parcelle primitive :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@num_parc_prim = '')">
-                        <xsl:value-of select="@num_parc_prim" />
-                      </xsl:if>
-                      <xsl:if test="@num_parc_prim = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-            </fo:table-body>
-          </fo:table>
-
-          <!--<fo:block>
-            <fo:external-graphic>
-              <xsl:attribute name="src">
-                http://mapsrv.rgd74.fr/geomap70/mg/net/ggGetMapImage.aspx?USER=Administrator&amp;PWD=admin&amp;MAPNAME=Library://RISNET_GESTION/Cartes/RGD 73-74 - RISNET_GESTION_73_74.MapDefinition&amp;SELOBJS=PARCELLE%2C<xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select='substring(@idpar,1,2)'/>
-                  <xsl:value-of select='substring(@idpar,4,3)'/>
-                  <xsl:if test ="substring(@idpar,7,3)='000'">
-                    <xsl:text disable-output-escaping="yes">-.-.-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,7,3)='000')">
-                    <xsl:value-of select='substring(@idpar,7,3)'/>
-                  </xsl:if>
-                  <xsl:if test ="substring(@idpar,10,1)='0'">
-                    <xsl:text disable-output-escaping="yes">-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,10,1)='0')">
-                    <xsl:value-of select='substring(@idpar,10,1)'/>
-                  </xsl:if>
-                  <xsl:value-of select='substring(@idpar,11,1)'/>
-                  <xsl:value-of select='substring(@idpar,12)'/>
-                </xsl:for-each>-&amp;CENTERX=&amp;CENTERY=&amp;SCALE=*8&amp;HEIGHT=400&amp;WIDTH=575&amp;RESULTTYPE=JPG
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>-->
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Urbanisme : POS/PLU
-          </fo:block>
-          
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-            <fo:table-column column-width="9%" />
-            <fo:table-column column-width="27.48%" />
-            <fo:table-column column-width="15.38%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="9.79%" />
-            <fo:table-column column-width="23.77%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Zonage</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Libellé</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m2)*</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">COS</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">CES</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Hauteur</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Réglement de la zone</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@lib_zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@surface" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@cos" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@ces" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@hauteur" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                      <fo:basic-link>
-                        <xsl:attribute name="external-destination">
-                          http://mapris.rgd74.fr/DocumentsPartenaires/Reglement_POS/ <xsl:value-of select="@idreg" />.pdf
-                        </xsl:attribute>Consulter le réglement
-                      </fo:basic-link>
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-          <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-            *calcul sur la surface graphique, exclusion si surf &#139; 2 m²
-          </fo:block>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-            <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-              <fo:basic-link>
-                <xsl:attribute name="external-destination">
-                  http://mapris.rgd74.fr/Risnet_Gestion/Application/Rapport/etat_pos_plu/fiche_pos.asp?codcom=<xsl:value-of select="@codecom" />
-                </xsl:attribute>Avancement de l'actualisation/mise en ligne du POS/PLU de cette commune
-              </fo:basic-link>
-            </fo:block>
-          </xsl:for-each>
-
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Propriétaire(s) de la parcelle
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-            *Cliquer sur le n° de compte pour accéder à son relevé de propriété
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-            <fo:table-column column-width="12%" />
-            <fo:table-column column-width="12%" />
-            <fo:table-column column-width="20%" />
-            <fo:table-column column-width="15%" />
-            <fo:table-column column-width="26%" />
-            <fo:table-column column-width="15%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell number-columns-spanned="2" background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Etat Civil</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                <fo:table-row>
-                  <fo:table-cell number-columns-spanned="2" background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                        <fo:basic-link>
-                          <xsl:attribute name="external-destination">
-                            http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0
-                          </xsl:attribute><xsl:value-of select="@dnupro" />
-                        </fo:basic-link>
-                      </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_nom" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@jdatnss" />
-                    </fo:block>
-                    <!-- retour chariot -->
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@dldnss" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_adresse" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@l_ccodro" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <xsl:if test ="..//Mj_Parcelle/Mj_Suf/Mj_Proprietaire[@dnupro]">
-                  <fo:table-row>
-                    <fo:table-cell number-columns-spanned="6" background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Détail</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Numéro du lot</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Etat Civil</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <xsl:for-each select="../Mj_Parcelle/Mj_Suf/Mj_Proprietaire">
-                    <fo:table-row>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="../@dnulot" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                          <fo:basic-link>
-                            <xsl:attribute name="external-destination">
-                              http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0
-                            </xsl:attribute>
-                            <xsl:value-of select="@dnupro" />
-                          </fo:basic-link>
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@proprietaire_nom" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@jdatnss" />
-                        </fo:block>
-                        <!-- retour chariot -->
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@dldnss" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@proprietaire_adresse" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@l_ccodro" />
-                        </fo:block>
-                      </fo:table-cell>
-                    </fo:table-row>
-                  </xsl:for-each>
-                </xsl:if>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Subdivision(s) fiscale(s)
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Lettre</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Groupe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Occupation</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Classe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²)</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Revenu (€)</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Référence</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_Suf">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@suf = '')">
-                        <xsl:value-of select="@suf" />
-                      </xsl:if>
-                      <xsl:if test="@suf = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@groupe = '')">
-                        <xsl:value-of select="@groupe" />
-                      </xsl:if>
-                      <xsl:if test="@groupe = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@nature = '')">
-                        <xsl:value-of select="@nature" />
-                      </xsl:if>
-                      <xsl:if test="@nature = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">-</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@clas = '')">
-                        <xsl:value-of select="@clas" />
-                      </xsl:if>
-                      <xsl:if test="@clas = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@dnupro" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@contenance_suf" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@revenu_cadastral_txt" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@revenu_reference_txt" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-
-          <xsl:if test="count(Mj/Mj_Compte_Communal_Parcelle/Mj_Bati) &gt; 0">
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-            <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-              Elément(s) bâti(s)
-            </fo:block>
-            <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="55%" />
-
-              <fo:table-body>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Ref. local</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Date mutation</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Propriétaire(s)</fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-                  <xsl:for-each select="Mj_Proprietaire">
-                    <fo:table-row>
-                      <xsl:if test="position()='1'">
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@num_invar" />
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@lib_nature" />
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@date_mut" />
-                          </fo:block>
-                        </fo:table-cell>
-                      </xsl:if>
-                      <xsl:if test="position() &gt; '1'">
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                      </xsl:if>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@proprietaire_nom" />
-                        </fo:block>
-                      </fo:table-cell>
-                    </fo:table-row>
-                  </xsl:for-each>
-                </xsl:for-each>
-              </fo:table-body>
-            </fo:table>
-          </xsl:if>
-          <!-- .........................................Description du local, mode Complet................................................. -->
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-            <fo:block text-align="left" vertical-align="middle" font-size="15pt" color="#008393">
-              Local n° <xsl:value-of select="@num_invar" />
-            </fo:block>
-
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-            <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2" >
-
-              <fo:table-column column-width="39%" />
-              <fo:table-column column-width="40%" />
-              <fo:table-column column-width="7%" />
-              <fo:table-column column-width="7%" />
-              <fo:table-column column-width="7%" />
-
-              <fo:table-body>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Bat</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Esc</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Etage</fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@voirie" />
-                      <xsl:value-of select="@adresse" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@bat" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@ent" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@niv" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Commune :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@libcom" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@dteloc" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Occupation :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@lib_occupation" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@lib_nature" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Année de construction :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@annee_constr = '0')">
-                        <xsl:value-of select="@annee_constr" />
-                      </xsl:if>
-                      <xsl:if test="@annee_constr = '0'">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Date de mutation :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@date_mut" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Valeur cadastrale (?) :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="Mj_Pev/@revenu_cadastral" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Niveaux :</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@niveaux" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="center" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt"></fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </fo:table-body>
-            </fo:table>
-
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-
-            <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-              Propriétaire(s) du local
-            </fo:block>
-
-            <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="27.5%" />
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="27.5%" />
-              <fo:table-column column-width="15%" />
-
-              <fo:table-body>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">État Civil</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-
-                <xsl:for-each select="Mj_Proprietaire">
-                  <fo:table-row>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                        <fo:basic-link>
-                          <xsl:attribute name="external-destination">
-                            http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=complet&amp;format=pdf&amp;version=1.0
-                          </xsl:attribute>
-                          <xsl:value-of select="@dnupro" />
-                        </fo:basic-link>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="@proprietaire_nom" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="@jdatnss" />
-                        <!-- retour chariot -->
-                        <xsl:value-of select="@dldnss" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="@proprietaire_adresse" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="@l_ccodro" />
-                      </fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                </xsl:for-each>
-              </fo:table-body>
-            </fo:table>
-
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-            <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-              P.E.V
-            </fo:block>
-            <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-              <fo:table-column column-width="12.5%" />
-
-              <fo:table-body>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">N°</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Catégorie</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Tarif</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Local Type</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Val. Loc. Ref. (?)</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Val. Loc. Ann. (?)</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nat. Exemp.</fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-
-                <xsl:for-each select="Mj_Pev">
-                  <fo:table-row>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@num_pev = '')">
-                          <xsl:value-of select="@num_pev" />
-                        </xsl:if>
-                        <xsl:if test="@num_pev = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@l_nature = '')">
-                          <xsl:value-of select="@l_nature" />
-                        </xsl:if>
-                        <xsl:if test="@l_nature = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@cat = '')">
-                          <xsl:value-of select="@cat" />
-                        </xsl:if>
-                        <xsl:if test="@cat = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@s_tar = '')">
-                          <xsl:value-of select="@s_tar" />
-                        </xsl:if>
-                        <xsl:if test="@s_tar = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@local_type = '')">
-                          <xsl:value-of select="@local_type" />
-                        </xsl:if>
-                        <xsl:if test="@local_type = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@val_loc_ref = '')">
-                          <xsl:value-of select="@val_loc_ref" />
-                        </xsl:if>
-                        <xsl:if test="@val_loc_ref = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@val_loc_ann = '')">
-                          <xsl:value-of select="@val_loc_ann" />
-                        </xsl:if>
-                        <xsl:if test="@val_loc_ann = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:if test="not(@l_nat_exon = '')">
-                          <xsl:value-of select="@l_nat_exon" />
-                        </xsl:if>
-                        <xsl:if test="@l_nat_exon = ''">
-                          -
-                        </xsl:if>
-                      </fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                </xsl:for-each>
-              </fo:table-body>
-            </fo:table>
-
-            <xsl:if test ="Mj_Pev/Mj_Habit_Descr[@num_pev]">
-              <fo:block color="#F1B4B4">
-                <fo:leader leader-length="100%" leader-pattern="rule"/>
-              </fo:block>
-              <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-                Habitation principale
-                <!-- retour chariot -->
-              </fo:block>
-              <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-                N° P.E.V : <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@num_pev" />
-              </fo:block>
-              <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-                <fo:table-column column-width="30%" />
-                <fo:table-column column-width="30%" />
-                <fo:table-column column-width="20%" />
-                <fo:table-column column-width="20%" />
-
-                <fo:table-body>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Divers</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Eléments de confort</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Pièces</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surfaces (m²)</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:table table-layout="fixed" width="100%" border-separation="2">
-
-                        <fo:table-column column-width="60%" />
-                        <fo:table-column column-width="40%" />
-
-                        <fo:table-body>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²) :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_piece_total" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nbr pièces :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_total" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nbr pièces princ. :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_piece_principal" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Entretien :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@l_Etat" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Année de Constr. :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@annee_constr" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nbr Niveaux :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_niveaux" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Gros murs :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@lib_mat_gros_mur" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Toitures :</fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="right" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@lib_mat_toiture" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                        </fo:table-body>
-                      </fo:table>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:table table-layout="fixed" width="100%" border-separation="2">
-
-                        <fo:table-column column-width="50%" />
-                        <fo:table-column column-width="50%" />
-
-                        <fo:table-body>
-                          <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_baignoires &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_baignoires" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Baignoire(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_douches &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_douches" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Douche(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_lavabos &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_lavabos" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Lavabo(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Habit_Descr/@nb_wc &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_wc" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">W.C.</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Eau :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@eau = 'EAU'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@eau = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Electricité :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@elect = 'ELECT'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@elect = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Gaz :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@gaz = 'GAZ'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@gaz = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Esc. de service :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@esc_serv = 'ESC_SERV'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@esc_serv = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Ascenseur :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@asc = 'ASC'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@asc = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Chauffage :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@chauf = 'CHAUF'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@chauf = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Vide ordure :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@vide_ord = 'VIDE_ORD'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@vide_ord = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Égout :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@egout = 'EGOUT'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Habit_Descr/@egout = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                        </fo:table-body>
-                      </fo:table>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:table table-layout="fixed" width="100%" border-separation="2">
-
-                        <fo:table-column column-width="30%" />
-                        <fo:table-column column-width="70%" />
-
-                        <fo:table-body>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_sam" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">S. a manger</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_chambre" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Chambre</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_m9" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Cuisine (inf.9m2)</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_cuisine_p9" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Cuisine (sup.9m2)</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_salle_eau" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">S. de bain</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@nb_annexe" />
-                              </fo:block>
-                            </fo:table-cell>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Annexe</fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                        </fo:table-body>
-                      </fo:table>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:table table-layout="fixed" width="100%" border-separation="2">
-
-                        <fo:table-column column-width="30%" />
-                        <fo:table-column column-width="70%" />
-
-                        <fo:table-body>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_cave" />
-                              </fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                Cave(s)
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_grenier" />
-                              </fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                Grenier(s)
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_terrasse" />
-                              </fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                Terrasse(s)
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                          <fo:table-row>
-
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:value-of select="Mj_Pev/Mj_Habit_Descr/@suf_garage" />
-                              </fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                Garage(s)
-                              </fo:block>
-                            </fo:table-cell>
-
-                          </fo:table-row>
-                        </fo:table-body>
-                      </fo:table>
-                    </fo:table-cell>
-                  </fo:table-row>
-                </fo:table-body>
-              </fo:table>
-            </xsl:if>
-            <xsl:if test ="Mj_Pev/Mj_Depend_Descr[@num_pev]">
-              <fo:block color="#F1B4B4">
-                <fo:leader leader-length="100%" leader-pattern="rule"/>
-              </fo:block>
-              <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-                Dépendance(s)
-              </fo:block>
-              <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-                <fo:table-column column-width="10%" />
-                <fo:table-column column-width="12.5%" />
-                <fo:table-column column-width="11%" />
-                <fo:table-column column-width="11%" />
-                <fo:table-column column-width="11%" />
-                <fo:table-column column-width="12.5%" />
-                <fo:table-column column-width="12.5%" />
-                <fo:table-column column-width="19.5%" />
-
-                <fo:table-body>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">N°</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²)</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Pondération</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Entretien</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Gros murs</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Toitures</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Elt. confort</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <fo:table-row>
-
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@num_pev" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nature" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@surface" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@ponderation" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@l_Etat" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@lib_mat_gros_mur" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@lib_mat_toiture" />
-                      </fo:block>
-                    </fo:table-cell>
-
-                    <fo:table-cell>
-                      <fo:table table-layout="fixed" width="100%" border-separation="2">
-
-                        <fo:table-column column-width="45%" />
-                        <fo:table-column column-width="55%" />
-
-                        <fo:table-body>
-                          <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_baignoires &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_baignoires" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Baignoire(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_douches &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_douches" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Douche(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_lavabos &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_lavabos" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">Lavabo(s)</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <xsl:if test="Mj_Pev/Mj_Depend_Descr/@nb_wc &gt; 0">
-                            <fo:table-row>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                  <xsl:value-of select="Mj_Pev/Mj_Depend_Descr/@nb_wc" />
-                                </fo:block>
-                              </fo:table-cell>
-                              <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                                <fo:block text-align="left" vertical-align="middle" font-size="9pt">W.C.</fo:block>
-                              </fo:table-cell>
-                            </fo:table-row>
-                          </xsl:if>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Eau :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@eau = 'EAU'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@eau = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Chauffage :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@chauf = 'CHAUF'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@chauf = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                          <fo:table-row>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">Electricité :</fo:block>
-                            </fo:table-cell>
-                            <fo:table-cell background-color="#F7F7F7" text-align ="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@elect = 'ELECT'">
-                                  Oui
-                                </xsl:if>
-                              </fo:block>
-                              <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                                <xsl:if test ="Mj_Pev/Mj_Depend_Descr/@elect = ''">
-                                  -
-                                </xsl:if>
-                              </fo:block>
-                            </fo:table-cell>
-                          </fo:table-row>
-                        </fo:table-body>
-                      </fo:table>
-                    </fo:table-cell>
-                  </fo:table-row>
-                </fo:table-body>
-              </fo:table>
-            </xsl:if>
-            <xsl:if test ="Mj_Pev/Mj_Prof_Descr[@num_pev]">
-              <fo:block color="#F1B4B4">
-                <fo:leader leader-length="100%" leader-pattern="rule"/>
-              </fo:block>
-              <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-                Locaux Professionnels
-              </fo:block>
-              <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-                <fo:table-column column-width="15%" />
-                <fo:table-column column-width="85%" />
-
-                <fo:table-body>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">N°</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²)</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@num_pev" />
-                      </fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                        <xsl:value-of select="Mj_Pev/Mj_Prof_Descr/@surface" />
-                      </fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                </fo:table-body>
-              </fo:table>
-            </xsl:if>
-          </xsl:for-each>
-        </fo:flow>
-      </fo:page-sequence>
-    </fo:root>
-  </xsl:template>
-</xsl:stylesheet>
-
-
diff --git a/web_service/class/majic_lib/xsl/FP_fo_Restreint.xsl b/web_service/class/majic_lib/xsl/FP_fo_Restreint.xsl
deleted file mode 100755
index a4ad0ace046dd98b69f2d2115e6839141bbd31ef..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/FP_fo_Restreint.xsl
+++ /dev/null
@@ -1,593 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:template match="/">
-    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-      <fo:layout-master-set>
-        <fo:simple-page-master master-name="simple" page-width="21cm" page-height="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-          <fo:region-body margin-top="0cm" margin-bottom="0cm" margin-left="0.5cm" margin-right="0.5cm" />
-        </fo:simple-page-master>
-      </fo:layout-master-set>
-
-      <fo:page-sequence master-reference="simple" font-family="Times">
-        <!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-        <fo:flow flow-name="xsl-region-body">
-
-          <fo:block >
-            <fo:external-graphic >
-              <xsl:attribute name="src">
-                file:///C:\serveurs\Apache2\htdocs\rgd\images\bandeau.jpg
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>
-
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="19pt" color="#008393">
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-              Parcelle <xsl:value-of select="@section" /><xsl:value-of select="format-number(@num_parc, '0000')"/> 
-            </xsl:for-each>
-          </fo:block>
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2" >
-            <fo:table-column column-width="17%" />
-            <fo:table-column column-width="83%" />
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@num_voirie" />
-                      <xsl:value-of select="@adresse" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Commune :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@libcom" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Code Commune (Insee) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@codeinsee" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Cpte Propriétaire :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="Mj_Parcelle/@dnupro" />
-                    </fo:block>
-                    <!-- retour chariot -->
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface cadastrale (m²) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@total_contenance_m2" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-            </fo:table-body>
-          </fo:table>
-
-          <!--<fo:block>
-            <fo:external-graphic>
-              <xsl:attribute name="src">
-                http://mapsrv.rgd74.fr/geomap70/mg/net/ggGetMapImage.aspx?USER=Administrator&amp;PWD=admin&amp;MAPNAME=Library://RISNET_GESTION/Cartes/RGD 73-74 - RISNET_GESTION_73_74.MapDefinition&amp;SELOBJS=PARCELLE%2C<xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select='substring(@idpar,1,2)'/>
-                  <xsl:value-of select='substring(@idpar,4,3)'/>
-                  <xsl:if test ="substring(@idpar,7,3)='000'">
-                    <xsl:text disable-output-escaping="yes">-.-.-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,7,3)='000')">
-                    <xsl:value-of select='substring(@idpar,7,3)'/>
-                  </xsl:if>
-                  <xsl:if test ="substring(@idpar,10,1)='0'">
-                    <xsl:text disable-output-escaping="yes">-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,10,1)='0')">
-                    <xsl:value-of select='substring(@idpar,10,1)'/>
-                  </xsl:if>
-                  <xsl:value-of select='substring(@idpar,11,1)'/>
-                  <xsl:value-of select='substring(@idpar,12)'/>
-                </xsl:for-each>-&amp;CENTERX=&amp;CENTERY=&amp;SCALE=*8&amp;HEIGHT=400&amp;WIDTH=575&amp;RESULTTYPE=JPG
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>-->
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Urbanisme : POS/PLU
-          </fo:block>
-            
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-            <fo:table-column column-width="9%" />
-            <fo:table-column column-width="27.48%" />
-            <fo:table-column column-width="15.38%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="9.79%" />
-            <fo:table-column column-width="23.77%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Zonage</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Libellé</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m2)*</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">COS</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">CES</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Hauteur</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Réglement de la zone</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@lib_zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@surface" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@cos" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@ces" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@hauteur" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                      <fo:basic-link>
-                        <xsl:attribute name="external-destination">
-                          http://mapris.rgd74.fr/DocumentsPartenaires/Reglement_POS/ <xsl:value-of select="@idreg" />.pdf
-                        </xsl:attribute>Consulter le réglement
-                      </fo:basic-link>
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-          <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-            *calcul sur la surface graphique, exclusion si surf &#139; 2 m²
-          </fo:block>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-            <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-              <fo:basic-link>
-                <xsl:attribute name="external-destination">
-                  http://mapris.rgd74.fr/Risnet_Gestion/Application/Rapport/etat_pos_plu/fiche_pos.asp?codcom=<xsl:value-of select="@codecom" />
-                </xsl:attribute>Avancement de l'actualisation/mise en ligne du POS/PLU de cette commune
-              </fo:basic-link>
-            </fo:block>
-          </xsl:for-each>
-
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Propriétaire(s) de la parcelle
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-            *Cliquer sur le n° de compte pour accéder à son relevé de propriété
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-            <fo:table-column column-width="12.5%" />
-            <fo:table-column column-width="12.5%" />
-            <fo:table-column column-width="30%" />
-            <fo:table-column column-width="30%" />
-            <fo:table-column column-width="15%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell number-columns-spanned="2" background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                      <fo:basic-link>
-                        <xsl:attribute name="external-destination">
-                          http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0
-                        </xsl:attribute>
-                        <xsl:value-of select="@dnupro" />
-                      </fo:basic-link>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_nom_tiers" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_adresse" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@l_ccodro" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <xsl:if test ="..//Mj_Parcelle/Mj_Suf/Mj_Proprietaire[@dnupro]">
-                  <fo:table-row>
-                    <fo:table-cell number-columns-spanned="5" background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Détail</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <fo:table-row>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Numéro du lot</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                    </fo:table-cell>
-                    <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                      <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                    </fo:table-cell>
-                  </fo:table-row>
-                  <xsl:for-each select="../Mj_Parcelle/Mj_Suf/Mj_Proprietaire">
-                    <fo:table-row>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="../@dnulot" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                          <fo:basic-link>
-                            <xsl:attribute name="external-destination">
-                              http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0
-                            </xsl:attribute>
-                            <xsl:value-of select="@dnupro" />
-                          </fo:basic-link>
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@proprietaire_nom" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@proprietaire_adresse" />
-                        </fo:block>
-                      </fo:table-cell>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@l_ccodro" />
-                        </fo:block>
-                      </fo:table-cell>
-                    </fo:table-row>
-                  </xsl:for-each>
-                </xsl:if>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Subdivision(s) fiscale(s)
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-            <fo:table-column column-width="12.4%" />
-            <fo:table-column column-width="12.4%" />
-            <fo:table-column column-width="12.4%" />
-            <fo:table-column column-width="12.6%" />
-            <fo:table-column column-width="12.4%" />
-            <fo:table-column column-width="12.6%" />
-            <fo:table-column column-width="12.6%" />
-            <fo:table-column column-width="12.6%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Lettre</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Groupe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Occupation</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Classe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²)</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Référence</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_Suf">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@suf = '')">
-                        <xsl:value-of select="@suf" />
-                      </xsl:if>
-                      <xsl:if test="@suf = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@groupe = '')">
-                        <xsl:value-of select="@groupe" />
-                      </xsl:if>
-                      <xsl:if test="@groupe = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@nature = '')">
-                        <xsl:value-of select="@nature" />
-                      </xsl:if>
-                      <xsl:if test="@nature = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">-</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@clas = '')">
-                        <xsl:value-of select="@clas" />
-                      </xsl:if>
-                      <xsl:if test="@clas = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@dnupro" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@contenance_suf" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@revenu_reference_txt" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-
-          <xsl:if test="count(Mj/Mj_Compte_Communal_Parcelle/Mj_Bati) &gt; 0">
-            <fo:block color="#F1B4B4">
-              <fo:leader leader-length="100%" leader-pattern="rule"/>
-            </fo:block>
-            <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-              Elément(s) bâti(s)
-            </fo:block>
-            <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="15%" />
-              <fo:table-column column-width="55%" />
-
-              <fo:table-body>
-                <fo:table-row>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Ref. local</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Etages</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">Propriétaire(s)</fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-                <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-                  <xsl:for-each select="Mj_Proprietaire">
-                    <fo:table-row>
-                      <xsl:if test="position()='1'">
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@num_invar" />
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@lib_nature" />
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                            <xsl:value-of select="../@niv" />
-                          </fo:block>
-                        </fo:table-cell>
-                      </xsl:if>
-                      <xsl:if test="position() &gt; '1'">
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                        <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                          <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          </fo:block>
-                        </fo:table-cell>
-                      </xsl:if>
-                      <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                        <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                          <xsl:value-of select="@dnupro" />
-                        </fo:block>
-                      </fo:table-cell>
-                    </fo:table-row>
-                  </xsl:for-each>
-                </xsl:for-each>
-              </fo:table-body>
-            </fo:table>
-          </xsl:if>
-          <!-- .........................................Propriétaire de Bâtis, mode Restreint................................................. -->
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Propriétaire(s) du local
-          </fo:block>
-
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2" >
-            
-            <fo:table-column column-width="15%" />
-            <fo:table-column column-width="35%" />
-            <fo:table-column column-width="35%" />
-            <fo:table-column column-width="15%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nom</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Type</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Bati/Mj_Proprietaire">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                      <fo:basic-link>
-                        <xsl:attribute name="external-destination">
-                          http://localhost/rgd/rgdservices.phtml?operation=GetReleveprop&amp;compte=<xsl:value-of select="@dnupro"/>&amp;type=restreint&amp;format=pdf&amp;version=1.0
-                        </xsl:attribute>
-                        <xsl:value-of select="@dnupro" />
-                      </fo:basic-link>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_nom_tiers" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@proprietaire_adresse" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@l_ccodro" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-        </fo:flow>
-      </fo:page-sequence>
-    </fo:root>
-  </xsl:template>
-</xsl:stylesheet>
-
-
diff --git a/web_service/class/majic_lib/xsl/FP_fo_SansNom.xsl b/web_service/class/majic_lib/xsl/FP_fo_SansNom.xsl
deleted file mode 100755
index 59e985cc72f7919904c9c156725c4a94c03e1f15..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/FP_fo_SansNom.xsl
+++ /dev/null
@@ -1,394 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:template match="/">
-    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Helvetica">
-      <fo:layout-master-set>
-        <fo:simple-page-master master-name="simple" page-width="21cm" page-height="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-          <fo:region-body margin-top="0cm" margin-bottom="0cm" margin-left="0.5cm" margin-right="0.5cm" />
-        </fo:simple-page-master>
-      </fo:layout-master-set>
-
-      <fo:page-sequence master-reference="simple" font-family="Times">
-        <!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-        <fo:flow flow-name="xsl-region-body">
-          
-          <fo:block >
-            <fo:external-graphic >
-              <xsl:attribute name="src">
-                file:///C:\serveurs\Apache2\htdocs\rgd\images\bandeau.jpg
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>
-
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:block text-align="left" vertical-align="middle" font-size="17pt" color="#008393">
-            <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-              Parcelle <xsl:value-of select="@section" /><xsl:value-of select="format-number(@num_parc, '0000')"/> 
-            </xsl:for-each>
-          </fo:block>
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2" >
-            <fo:table-column column-width="17%" />
-            <fo:table-column column-width="83%" />
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Adresse :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@num_voirie" />
-                      <xsl:value-of select="@adresse" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Commune :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@libcom" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Code Commune (Insee) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@codeinsee" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Cpte Propriétaire :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="Mj_Parcelle/@dnupro" />
-                    </fo:block>
-                    <!-- retour chariot -->
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface cadastrale (m²) :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@total_contenance_m2" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Urbaine :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@gurbpa" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Bâtie :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@gparbat" />
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Parcelle primitive :</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#F7F7F7" text-align="left"  padding-left="5" padding-top="5" padding-bottom="5" padding-right="5" >
-                  <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@num_parc_prim = '')">
-                        <xsl:value-of select="@num_parc_prim" />
-                      </xsl:if>
-                      <xsl:if test="@num_parc_prim = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </xsl:for-each>
-                </fo:table-cell>
-              </fo:table-row>
-            </fo:table-body>
-          </fo:table>
-
-          <!--<fo:block>
-            <fo:external-graphic>
-              <xsl:attribute name="src">
-                http://mapsrv.rgd74.fr/geomap70/mg/net/ggGetMapImage.aspx?USER=Administrator&amp;PWD=admin&amp;MAPNAME=Library://RISNET_GESTION/Cartes/RGD 73-74 - RISNET_GESTION_73_74.MapDefinition&amp;SELOBJS=PARCELLE%2C<xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-                  <xsl:value-of select='substring(@idpar,1,2)'/>
-                  <xsl:value-of select='substring(@idpar,4,3)'/>
-                  <xsl:if test ="substring(@idpar,7,3)='000'">
-                    <xsl:text disable-output-escaping="yes">-.-.-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,7,3)='000')">
-                    <xsl:value-of select='substring(@idpar,7,3)'/>
-                  </xsl:if>
-                  <xsl:if test ="substring(@idpar,10,1)='0'">
-                    <xsl:text disable-output-escaping="yes">-</xsl:text>
-                  </xsl:if>
-                  <xsl:if test ="not(substring(@idpar,10,1)='0')">
-                    <xsl:value-of select='substring(@idpar,10,1)'/>
-                  </xsl:if>
-                  <xsl:value-of select='substring(@idpar,11,1)'/>
-                  <xsl:value-of select='substring(@idpar,12)'/>
-                </xsl:for-each>-&amp;CENTERX=&amp;CENTERY=&amp;SCALE=*8&amp;HEIGHT=400&amp;WIDTH=575&amp;RESULTTYPE=JPG
-              </xsl:attribute>
-            </fo:external-graphic>
-          </fo:block>-->
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Urbanisme : POS/PLU
-          </fo:block>
-            
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-            <fo:table-column column-width="9%" />
-            <fo:table-column column-width="27.48%" />
-            <fo:table-column column-width="15.38%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="7.29%" />
-            <fo:table-column column-width="9.79%" />
-            <fo:table-column column-width="23.77%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Zonage</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Libellé</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m2)*</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">COS</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">CES</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Hauteur</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Réglement de la zone</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@lib_zonage" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@surface" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@cos" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@ces" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@hauteur" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-                      <fo:basic-link>
-                        <xsl:attribute name="external-destination">
-                          http://mapris.rgd74.fr/DocumentsPartenaires/Reglement_POS/ <xsl:value-of select="@idreg" />.pdf
-                        </xsl:attribute>Consulter le réglement
-                      </fo:basic-link>
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-          <fo:block text-align="left" vertical-align="middle" font-size="8pt">
-            *calcul sur la surface graphique, exclusion si surf &#139; 2 m²
-          </fo:block>
-          <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_PosPlu">
-            <fo:block color="blue" text-decoration="underline" text-align="left" vertical-align="middle" font-size="9pt">
-              <fo:basic-link>
-                <xsl:attribute name="external-destination">
-                  http://mapris.rgd74.fr/Risnet_Gestion/Application/Rapport/etat_pos_plu/fiche_pos.asp?codcom=<xsl:value-of select="@codecom" />
-                </xsl:attribute>Avancement de l'actualisation/mise en ligne du POS/PLU de cette commune
-              </fo:basic-link>
-            </fo:block>
-          </xsl:for-each>
-		  
-          <fo:block color="#F1B4B4">
-            <fo:leader leader-length="100%" leader-pattern="rule"/>
-          </fo:block>
-          
-          <fo:block text-align="left" vertical-align="middle" font-size="13pt" color="#990000">
-            Subdivision(s) fiscale(s)
-          </fo:block>
-          <fo:table margin-bottom="35px" table-layout="fixed" width="100%" border-separation="2">
-
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-            <fo:table-column column-width="11.2%" />
-
-            <fo:table-body>
-              <fo:table-row>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Lettre</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Groupe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Nature</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Occupation</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Classe</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Compte</fo:block>
-                </fo:table-cell>
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Surface (m²)</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Revenu (?)</fo:block>
-                </fo:table-cell>
-
-                <fo:table-cell background-color="#eeeeee" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                  <fo:block text-align="left" vertical-align="middle" font-size="9pt">Référence</fo:block>
-                </fo:table-cell>
-              </fo:table-row>
-              <xsl:for-each select="Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle/Mj_Suf">
-                <fo:table-row>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@suf = '')">
-                        <xsl:value-of select="@suf" />
-                      </xsl:if>
-                      <xsl:if test="@suf = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@groupe = '')">
-                        <xsl:value-of select="@groupe" />
-                      </xsl:if>
-                      <xsl:if test="@groupe = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@nature = '')">
-                        <xsl:value-of select="@nature" />
-                      </xsl:if>
-                      <xsl:if test="@nature = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">-</fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:if test="not(@clas = '')">
-                        <xsl:value-of select="@clas" />
-                      </xsl:if>
-                      <xsl:if test="@clas = ''">
-                        -
-                      </xsl:if>
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@dnupro" />
-                    </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@contenance_suf" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@revenu_cadastral_txt" />
-                    </fo:block>
-                  </fo:table-cell>
-
-                  <fo:table-cell background-color="#F7F7F7" text-align="left" padding-left="5" padding-top="5" padding-bottom="5" padding-right="5">
-                    <fo:block text-align="left" vertical-align="middle" font-size="9pt">
-                      <xsl:value-of select="@revenu_reference_txt" />
-                    </fo:block>
-                  </fo:table-cell>
-                </fo:table-row>
-              </xsl:for-each>
-            </fo:table-body>
-          </fo:table>
-          
-        </fo:flow>
-      </fo:page-sequence>
-    </fo:root>
-  </xsl:template>
-</xsl:stylesheet>
-
-
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport.xsl
deleted file mode 100755
index 0df5da5c1adf6611a593f3597bd5a88159fc42f1..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport.xsl
+++ /dev/null
@@ -1,303 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<xsl:template match="Rapport_Parcelle">
-	<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-		<fo:layout-master-set>
-			<fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.2cm" margin-right="0.2cm">
-				<fo:region-body region-name="Content" margin="0.2cm 0.2cm 0.2cm 0.2cm"></fo:region-body>
-				<fo:region-after region-name="Footer" extent="0.5in"></fo:region-after>
-			</fo:simple-page-master>
-		</fo:layout-master-set>
-	<fo:page-sequence master-reference="simple" font-family="Helvetica">
-
-	<!-- Début du pied de page qui se retrouvera sur chaque page -->
-		<fo:static-content flow-name="Footer">
-			<fo:block text-align="right" font-size="6pt">
-				Page <fo:page-number />
-			</fo:block>
-
-			<fo:block text-align="right" font-size="6pt">
-				<xsl:value-of select="Mj_Compte_Communal_Parcelles/Mj_Compte_Communal_Parcelle/Mj_Parcelle/@dateheure" />
-			</fo:block>
-		</fo:static-content>
-	<!-- Fin du pied de page -->
-
-	<fo:flow flow-name="Content">
-
-	<fo:block>
-
-	<!-- Création du contenu de la page pour chaque Mj_Compte_Communal_Parcelle trouvé -->
-
-	<xsl:for-each select="Mj_Compte_Communal_Parcelles">
-
-	<fo:table table-layout="fixed" border-collapse="collapse">
-	<fo:table-body>
-		<fo:table-row height="4cm">
-			<!--fo:table-cell><fo:block><fo:external-graphic src="C:/serveurs/Apache2/htdocs/lib/majic_lib/pics_for_xsl/blason.bmp" content-height="2.5cm"/></fo:block></fo:table-cell-->
-			<fo:table-cell><fo:block  font-weight="bold" text-align="center" font-size="14pt">Rapport de parcelles</fo:block></fo:table-cell>
-		</fo:table-row>
-	</fo:table-body>
-	</fo:table>
-	<xsl:for-each select="./Mj_Compte_Communal_Parcelle">
-	<fo:block border-color="black" border-style="double" border-width="1pt">
-
-	<fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="10pt">
-
-	<fo:table-body>
-
-		<!-- Tableau d'affichage des informations de la parcelle -->
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block font-weight="bold">PARCELLE</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@idpar" /></fo:block></fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Adresse</fo:block></fo:table-cell>
-			<fo:table-cell>
-				<xsl:if test="normalize-space(./Mj_Parcelle/@num_voirie) != '' ">
-					<fo:block><xsl:value-of select="./Mj_Parcelle/@num_voirie" />, </fo:block>
-				</xsl:if>
-				<fo:block> <xsl:value-of select="./Mj_Parcelle/@adresse" />, </fo:block>
-				<fo:block> <xsl:value-of select="@libcom" /></fo:block>
-			</fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Surface cadastrale</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@contenance" /> m²</fo:block></fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Emprise batie</fo:block></fo:table-cell>
-			<fo:table-cell>
-				<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-					<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-						<fo:block><xsl:value-of select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect" /> m² = <xsl:value-of select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_ratio" /> % </fo:block>
-					</xsl:if>
-				</xsl:if>
-				<fo:block></fo:block>
-			</fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Emprise non-batie</fo:block></fo:table-cell>
-			<fo:table-cell>
-				<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-					<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-						<fo:block>
-						<xsl:variable name="surf_parcelle" select="./Mj_Parcelle/@contenance"/>
-						<xsl:variable name="surf_emprisebati" select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect"/>
-						<xsl:variable name="res" select="round((($surf_parcelle - $surf_emprisebati)*100))*0.01"/>
-
-						<xsl:variable name="ratio_emprisebati" select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_ratio"/>
-						<xsl:variable name="resratio" select="100 - $ratio_emprisebati"/>
-
-						<xsl:value-of select="$res" /> m² = <xsl:value-of select="$resratio" /> %</fo:block>
-					</xsl:if>
-				</xsl:if>
-				<fo:block></fo:block>
-			</fo:table-cell>
-		</fo:table-row>
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block>Compte propriétaire</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@dnupro" /></fo:block></fo:table-cell>
-		</fo:table-row>
-
-		<!-- Tableau d'affichage des propriétaires de la parcelle -->
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block font-weight="bold">PROPRIÉTAIRE</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block></fo:block></fo:table-cell>
-		</fo:table-row>
-		<xsl:for-each select="./Mj_Proprietaire">
-			<fo:table-row>
-				<fo:table-cell><fo:block>Nom</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block><xsl:value-of select="@proprietaire_nom" /></fo:block></fo:table-cell>
-			</fo:table-row>
-			<fo:table-row height="1cm">
-				<fo:table-cell><fo:block>Adresse</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block><xsl:value-of select="@proprietaire_adresse" /></fo:block></fo:table-cell>
-			</fo:table-row>
-		</xsl:for-each>
-
-		<!-- Tableau d'affichage des informations de la subdi. fiscale de la parcelle -->
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block font-weight="bold">SUBDIVISION FISCALE</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block></fo:block></fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Revenu</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@revenu_cadastral" /> &#x20AC;</fo:block></fo:table-cell>
-		</fo:table-row>
-		<fo:table-row>
-			<fo:table-cell><fo:block>Surface</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@contenance" /> m²</fo:block></fo:table-cell>
-		</fo:table-row>
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block>Occupation</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block><xsl:value-of select="./Mj_Parcelle/@grss_gr" /></fo:block></fo:table-cell>
-		</fo:table-row>
-
-		<!-- Tableau d'affichage des emprises de la parcelle -->
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block font-weight="bold">EMPRISES</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block></fo:block></fo:table-cell>
-		</fo:table-row>
-
-		<xsl:for-each select="./Mj_Parcelle/Mj_Emprises">
-			<xsl:if test="./@emprise_totale_intersect != 0 ">
-				<fo:table-row>
-					<fo:table-cell>
-						<fo:block><xsl:value-of select="./@titre" /></fo:block>
-					</fo:table-cell>
-					<fo:table-cell><fo:block></fo:block></fo:table-cell>
-				</fo:table-row>
-				<xsl:for-each select="./Mj_Emprise">
-					<fo:table-row>
-						<fo:table-cell><fo:block></fo:block></fo:table-cell>
-						<fo:table-cell>
-							<fo:block>
-								Pourcentage de la parcelle intersectée : <xsl:value-of select="./@emprise_ratio_label" />
-							</fo:block>
-						</fo:table-cell>
-					</fo:table-row>
-					<xsl:for-each select="./Mj_Attributes/Mj_Attribute">
-						<xsl:if test="./@title != '' ">
-							<fo:table-row>
-								<fo:table-cell><fo:block></fo:block></fo:table-cell>
-								<fo:table-cell>
-									<fo:block>
-										<xsl:value-of select="./@title" /> : <xsl:value-of select="./@value" />
-										<xsl:if test="./@label = 'intersect' "> m² </xsl:if>
-									</fo:block>
-								</fo:table-cell>
-							</fo:table-row>
-						</xsl:if>
-					</xsl:for-each>
-					<fo:table-row height="0.5cm">
-						<fo:table-cell><fo:block></fo:block></fo:table-cell>
-					</fo:table-row>
-				</xsl:for-each>
-			</xsl:if>
-		</xsl:for-each>
-
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block></fo:block></fo:table-cell>
-		</fo:table-row>
-
-		<!-- Tableau d'affichage des locaux de la parcelle -->
-		<fo:table-row height="1cm">
-			<fo:table-cell><fo:block font-weight="bold">LOCAL</fo:block></fo:table-cell>
-			<fo:table-cell><fo:block></fo:block></fo:table-cell>
-		</fo:table-row>
-
-		<xsl:for-each select="./Mj_Bati">
-
-			<fo:table-row>
-				<fo:table-cell><fo:block>Adresse</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block>Batiment <xsl:value-of select="@bat" />,Etage <xsl:value-of select="@niv" />,Porte <xsl:value-of select="@num_de_porte" />,<xsl:value-of select="voirie" />,<xsl:value-of select="@adresse" /></fo:block></fo:table-cell>
-			</fo:table-row>
-			<fo:table-row>
-				<fo:table-cell><fo:block>Type de local</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block><xsl:value-of select="@nat_loc" /></fo:block></fo:table-cell>
-			</fo:table-row>
-			<fo:table-row>
-				<fo:table-cell><fo:block>Valeur locative</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block><xsl:value-of select="@dvlpera" /> &#x20AC;</fo:block></fo:table-cell>
-			</fo:table-row>
-			<fo:table-row>
-				<fo:table-cell><fo:block>Millièmes et lots</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block></fo:block></fo:table-cell>
-			</fo:table-row>
-			<fo:table-row height="1cm">
-				<fo:table-cell><fo:block>Compte propriétaire</fo:block></fo:table-cell>
-				<fo:table-cell><fo:block><xsl:value-of select="@b_dnupro" /></fo:block></fo:table-cell>
-			</fo:table-row>
-
-			<!-- affichage en tableau des propriétaires des locaux -->
-			<xsl:for-each select="./Mj_Proprietaire">
-				<fo:table-row>
-					<fo:table-cell>
-						<fo:table>
-						<fo:table-body>
-							<fo:table-row height="1.5cm">
-								<fo:table-cell width="2cm"><fo:block></fo:block></fo:table-cell>
-								<fo:table-cell width="5cm" font-size="9pt"><fo:block>Propriétaire local</fo:block></fo:table-cell>
-								<fo:table-cell width="13cm" font-size="9pt"><fo:block><xsl:value-of select="@proprietaire_nom" /> ; <xsl:value-of select="@proprietaire_adresse" /></fo:block></fo:table-cell>
-							</fo:table-row>
-						</fo:table-body>
-						</fo:table>
-					</fo:table-cell>
-				</fo:table-row>
-			</xsl:for-each>
-
-		</xsl:for-each>
-
-
-	</fo:table-body>
-
-	</fo:table>
-
-	</fo:block>
-
-	<!-- permet de sauter une page -->
-	<fo:block break-after="page"/>
-
-	</xsl:for-each>
-
-	<fo:block>
-		<fo:table>
-			<fo:table-body>
-				<fo:table-row height="1.5cm">
-					<fo:table-cell width="2cm"><fo:block></fo:block></fo:table-cell>
-					<fo:table-cell width="5cm" font-size="9pt"><fo:block font-weight="bold" >Totaux</fo:block></fo:table-cell>
-				</fo:table-row>
-			</fo:table-body>
-		</fo:table>
-	</fo:block>
-
-	<fo:block>
-		<fo:table>
-			<fo:table-body>
-				<fo:table-row height="1.5cm">
-					<fo:table-cell width="2cm"><fo:block></fo:block></fo:table-cell>
-					<fo:table-cell width="5cm" font-size="9pt"><fo:block>Surface cadastrale</fo:block></fo:table-cell>
-					<fo:table-cell width="13cm" font-size="9pt"><fo:block><xsl:value-of select="@Sum_contenance" /> m²</fo:block></fo:table-cell>
-				</fo:table-row>
-			</fo:table-body>
-		</fo:table>
-	</fo:block>
-
-	<fo:block>
-		<fo:table>
-			<fo:table-body>
-				<fo:table-row height="1.5cm">
-					<fo:table-cell width="2cm"><fo:block></fo:block></fo:table-cell>
-					<fo:table-cell width="5cm" font-size="9pt"><fo:block>Revenu</fo:block></fo:table-cell>
-					<fo:table-cell width="13cm" font-size="9pt"><fo:block><xsl:value-of select="@Sum_revenu" /> &#x20AC;</fo:block></fo:table-cell>
-				</fo:table-row>
-			</fo:table-body>
-		</fo:table>
-	</fo:block>
-
-	<fo:block>
-		<fo:table>
-			<fo:table-body>
-				<fo:table-row height="1.5cm">
-					<fo:table-cell width="2cm"><fo:block></fo:block></fo:table-cell>
-					<fo:table-cell width="5cm" font-size="9pt"><fo:block>Valeur locative</fo:block></fo:table-cell>
-					<fo:table-cell width="13cm" font-size="9pt"><fo:block><xsl:value-of select="@Sum_valeur_locative" /> &#x20AC;</fo:block></fo:table-cell>
-				</fo:table-row>
-			</fo:table-body>
-		</fo:table>
-	</fo:block>
-
-	</xsl:for-each>
-
-	</fo:block>
-
-	</fo:flow>
-
-	</fo:page-sequence>
-
-	</fo:root>
-
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_BatieNonBatie.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_BatieNonBatie.xsl
deleted file mode 100755
index a440086602e69804df707989e6e0d1067d4fe63e..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_BatieNonBatie.xsl
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-
-			<Style	ss:ID="s63">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s64">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Right"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s65">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-			</Style>
-
-		</Styles>
-		 <Worksheet ss:Name="Feuil1">
-			<!--<xsl:variable name="nb_ligne"><xsl:value-of select="./XmlMapLog/XmlLog/@nb_ligne" /></xsl:variable>-->
-			<Table ss:ExpandedColumnCount="7" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<!--<xsl:attribute name="ss:ExpandedRowCount"><xsl:value-of select="1000" /></xsl:attribute>-->
-				<Column ss:AutoFitWidth="0" ss:Width="103.5"/>
-				<Column ss:AutoFitWidth="0" ss:Width="105"/>
-				<Column ss:AutoFitWidth="0" ss:Width="119.25"/><!--<Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="63.75"/>-->
-				<Column ss:AutoFitWidth="0" ss:Width="119.25"/>
-				<Column ss:AutoFitWidth="0" ss:Width="127.5"/>
-				<Column ss:AutoFitWidth="0" ss:Width="119.25"/>
-				<Column ss:AutoFitWidth="0" ss:Width="127.5"/>
-
-					<Row	ss:AutoFitHeight="0"	ss:Height="15.75">
-						<Cell	ss:MergeAcross="2"	ss:StyleID="s63"><Data ss:Type="String">PARCELLES</Data></Cell>
-						<Cell	ss:MergeAcross="3"	ss:StyleID="s64"><Data ss:Type="String">EMPRISES</Data></Cell>
-					</Row>
-
-					<Row ss:AutoFitHeight="0">
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Parcelle</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Adresse</Data></Cell> 
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Surface cadastrale (m²)</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Emprise bâtie (m²)</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Emprise bâtie (%)</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Emprise non bâtie (m²)</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Emprise non bâtie (%)</Data></Cell>
-					</Row>
-					<xsl:for-each select="Mj_Compte_Communal_Parcelles/Mj_Compte_Communal_Parcelle">
-
-						<Row ss:AutoFitHeight="0"> 
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@idpar" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@adresse" /></Data></Cell>
-							<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Parcelle/@contenance" /></Data></Cell>
-							<Cell>
-								<Data ss:Type="Number">
-									<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-										<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-											<xsl:value-of select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect" />
-										</xsl:if>
-									</xsl:if>
-								</Data>
-							</Cell>	
-							<Cell>
-								<Data ss:Type="Number">
-
-									<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-										<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-											<xsl:value-of select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_ratio" />
-										</xsl:if>
-									</xsl:if>
-								</Data>
-							</Cell>
-
-							<Cell>
-								<Data ss:Type="Number">
-									<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-										<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-											<xsl:variable name="surf_parcelle" select="./Mj_Parcelle/@contenance"/>
-											<xsl:variable name="surf_emprisebati" select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect"/>
-											<xsl:variable name="res" select="round((($surf_parcelle - $surf_emprisebati)*100))*0.01"/>
-											<xsl:value-of select="$res" />
-										</xsl:if>
-									</xsl:if>
-								</Data>
-							</Cell>
-
-							<Cell>
-								<Data ss:Type="Number">
-								
-									<xsl:if test="./Mj_Parcelle/Mj_Emprises/@titre = 'Emprise Bati' ">
-										<xsl:if test="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_intersect != '' ">
-											<xsl:variable name="ratio_emprisebati" select="./Mj_Parcelle/Mj_Emprises[@titre='Emprise Bati']/@emprise_totale_ratio"/>
-											<xsl:variable name="resratio" select="100 - $ratio_emprisebati"/>
-											<xsl:value-of select="$resratio" />
-										</xsl:if>
-									</xsl:if>
-								</Data>
-							</Cell>
-						</Row>
-						
-
-					</xsl:for-each>
-
-					<Row ss:AutoFitHeight="0">	
-						<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_bati" /></Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-						<Cell>
-							<Data ss:Type="String">
-								<xsl:variable name="sum_contenance" select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2"/>
-								<xsl:variable name="sum_contenance_bati" select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_bati"/>
-								<xsl:variable name="sum_contenance_non_bati" select="$sum_contenance - $sum_contenance_bati"/>
-								<xsl:value-of select="$sum_contenance_non_bati" />	
-							</Data>
-						</Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>	
-					</Row>
-
-			</Table>
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		 </Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_EmprisePosPlu.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_EmprisePosPlu.xsl
deleted file mode 100755
index a2d8011841189ac04dac61ddea0918030b3430e6..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_EmprisePosPlu.xsl
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-			<Style ss:ID="s61">
-				<Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
-			</Style>
-			<Style ss:ID="s62">
-				<Alignment ss:Horizontal="Center" ss:WrapText="1"/>
-			</Style>
-			<Style ss:ID="s63">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-				<Borders>
-					<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style ss:ID="s64">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-				<Borders>
-					<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style ss:ID="s65">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-			</Style>
-
-		</Styles>
-		<Worksheet ss:Name="Feuil1">
-			<Table ss:ExpandedColumnCount="40" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<Column ss:AutoFitWidth="0" ss:Width="103.5"/>
-				<Column ss:AutoFitWidth="0" ss:Width="105"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Row>
-					<Cell ss:MergeAcross="2" ss:StyleID="s64"><Data ss:Type="String">PARCELLES</Data></Cell>
-					<Cell ss:MergeAcross="6" ss:StyleID="s64"><Data ss:Type="String">EMPRISES</Data></Cell>
-				</Row>
-				<Row ss:AutoFitHeight="0">
-					<Cell ss:StyleID="s65"><Data ss:Type="String">Parcelle</Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String">Adresse</Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String">Surface cadastrale (m²)</Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-					<Cell ss:StyleID="s65"><Data ss:Type="String"></Data></Cell>
-				</Row>
-
-				<xsl:for-each select="Mj_Compte_Communal_Parcelles/Mj_Compte_Communal_Parcelle">
-					<Row ss:AutoFitHeight="0">
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@idpar" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@adresse" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Parcelle/@contenance" /></Data></Cell>
-						<xsl:for-each select="./Mj_Parcelle/Mj_Emprises">
-							<Cell><Data ss:Type="String"><xsl:value-of select="./@titre" /> :</Data></Cell>
-							<xsl:for-each select="./Mj_Emprise">
-								<Cell>
-									<Data ss:Type="String">Pourcentage de la parcelle intersectée : <xsl:value-of select="./@emprise_ratio_label" />,
-<xsl:for-each select="./Mj_Attributes/Mj_Attribute">
-											<xsl:if test="./@title != '' ">
-<xsl:value-of select="./@title" /> : <xsl:value-of select="./@value" /><xsl:if test="./@label = 'intersect' "> m²</xsl:if>,
-</xsl:if>
-										</xsl:for-each>
-									</Data>
-								</Cell>
-							</xsl:for-each>
-						</xsl:for-each>
-					</Row>
-				</xsl:for-each>
-
-				<Row ss:AutoFitHeight="0">
-					<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2" /></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-				</Row>
-			</Table>
-
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		 </Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Locaux.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Locaux.xsl
deleted file mode 100755
index 6ef49212c7e61b08bd7d914cfb1d0648eb0865b4..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Locaux.xsl
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-
-			<Style ss:ID="s63">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-				<Borders>
-					<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style ss:ID="s64">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-				<Borders>
-					<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
-					<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style ss:ID="s65">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
-			</Style>
-
-		</Styles>
-		 <Worksheet ss:Name="Feuil1">
-			<Table ss:ExpandedColumnCount="7" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<Column ss:AutoFitWidth="0" ss:Width="85"/>
-				<Column ss:AutoFitWidth="0" ss:Width="125"/>
-				<Column ss:AutoFitWidth="0" ss:Width="115"/>
-				<Column ss:AutoFitWidth="0" ss:Width="135"/>
-				<Column ss:AutoFitWidth="0" ss:Width="115"/>
-				<Column ss:AutoFitWidth="0" ss:Width="105"/>
-				<Column ss:AutoFitWidth="0" ss:Width="90"/>
-
-				<Row ss:AutoFitHeight="0" ss:Height="15.75">
-					<Cell ss:MergeAcross="2" ss:StyleID="s63"><Data ss:Type="String">PARCELLES</Data></Cell>
-					<Cell ss:MergeAcross="3" ss:StyleID="s64"><Data ss:Type="String">LOCAUX</Data></Cell>
-				</Row>
-
-				<Row ss:AutoFitHeight="0" ss:StyleID="s65">
-					<Cell><Data ss:Type="String">Parcelle</Data></Cell>
-					<Cell><Data ss:Type="String">Adresse</Data></Cell> 
-					<Cell><Data ss:Type="String">Surface cadastrale (m²)</Data></Cell>
-					<Cell><Data ss:Type="String">Adresse local</Data></Cell>
-					<Cell><Data ss:Type="String">Type de local</Data></Cell>
-					<Cell><Data ss:Type="String">Valeur locative (Euros)</Data></Cell>
-					<Cell><Data ss:Type="String">Millièmes et lots</Data></Cell>
-				</Row>
-
-				<xsl:for-each select="Mj_Bati_Parcelles/Mj_Bati_Parcelle">
-					<Row ss:AutoFitHeight="0"> 
-						<Cell><Data ss:Type="String"><xsl:value-of select="@id_par" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="@adresse" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="@contenance" /></Data></Cell>
-						<xsl:if test="./Mj_Bati/@bat != '' ">
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@voirie" /> <xsl:value-of select="./Mj_Bati/@adresse" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@dteloc" /></Data></Cell>
-							<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Bati/@dvlpera" /></Data></Cell>
-							<xsl:if test="./Mj_Bati/@dnumql != '' ">
-								<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@dnumql" />/<xsl:value-of select="./Mj_Bati/@ddenql" /></Data></Cell>
-							</xsl:if>
-							<xsl:if test="./Mj_Bati/@dnumql = '' ">
-								<Cell><Data ss:Type="String"></Data></Cell>
-							</xsl:if>
-						</xsl:if>
-						<xsl:if test="./Mj_Bati/@bat = '' ">
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-						</xsl:if>
-					</Row>
-					<xsl:for-each select="./Mj_Bati">
-						<xsl:if test="position()!=1">
-							<Row ss:AutoFitHeight="0">
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@voirie" /> <xsl:value-of select="./@adresse" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@dteloc" /></Data></Cell>
-								<Cell><Data ss:Type="Number"><xsl:value-of select="./@dvlpera" /></Data></Cell>
-								<xsl:if test="./@dnumql != '' ">
-									<Cell><Data ss:Type="String"><xsl:value-of select="./@dnumql" />/<xsl:value-of select="./@ddenql" /></Data></Cell>
-								</xsl:if>
-								<xsl:if test="./@dnumql = '' ">
-									<Cell><Data ss:Type="String"></Data></Cell>
-								</xsl:if>
-							</Row>
-						</xsl:if>
-					</xsl:for-each>
-				</xsl:for-each> 
-
-				<Row ss:AutoFitHeight="0">
-					<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Bati_Parcelles/@sum_contenance_m2" /></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Bati_Parcelles/@sum_valeur_locative" /></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-				</Row>
-
-			</Table>
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		</Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Proprietaire.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Proprietaire.xsl
deleted file mode 100755
index 32ded4b7ea8c4682c30a4a236d812ff6a632e04c..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_Proprietaire.xsl
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-
-			<Style	ss:ID="s63">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s64">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Right"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s65">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-			</Style>
-
-		</Styles>
-		 <Worksheet ss:Name="Feuil1">
-			<!--<xsl:variable name="nb_ligne"><xsl:value-of select="./XmlMapLog/XmlLog/@nb_ligne" /></xsl:variable>-->
-			<Table ss:ExpandedColumnCount="6" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<!--<xsl:attribute name="ss:ExpandedRowCount"><xsl:value-of select="1000" /></xsl:attribute>-->
-				<Column ss:AutoFitWidth="0" ss:Width="103.5"/>
-				<Column ss:AutoFitWidth="0" ss:Width="105"/>
-				<Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="63.75"/>
-				<Column ss:AutoFitWidth="0" ss:Width="119.25"/>
-				<Column ss:AutoFitWidth="0" ss:Width="127.5"/>
-
-					<Row	ss:AutoFitHeight="0"	ss:Height="15.75">
-						<Cell	ss:MergeAcross="2"	ss:StyleID="s63"><Data ss:Type="String">PARCELLES</Data></Cell>
-						<Cell	ss:MergeAcross="2"	ss:StyleID="s64"><Data ss:Type="String">PROPRIETAIRES</Data></Cell>
-					</Row>
-					<Row ss:AutoFitHeight="0">
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Parcelle</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Adresse</Data></Cell> 
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Surface cadastrale (m²)</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Compte propriétaire</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Nom</Data></Cell>
-						<Cell	ss:StyleID="s65"><Data ss:Type="String">Adresse</Data></Cell>
-					</Row>
-
-					<xsl:for-each select="Mj_Compte_Communal_Parcelles/Mj_Compte_Communal_Parcelle">
-
-						<Row ss:AutoFitHeight="0"> 
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@idpar" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@adresse" /></Data></Cell>
-							<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Parcelle/@contenance" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Proprietaire/@dnupro" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Proprietaire/@proprietaire_nom" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Proprietaire/@proprietaire_adresse" /></Data></Cell>
-						</Row>
-
-						<xsl:for-each select="./Mj_Proprietaire">
-							<xsl:if test="position()!=1">
-								<Row ss:AutoFitHeight="0">
-									<Cell><Data ss:Type="String"></Data></Cell>
-									<Cell><Data ss:Type="String"></Data></Cell>
-									<Cell><Data ss:Type="String"></Data></Cell>
-									<Cell><Data ss:Type="String"></Data></Cell>
-									<Cell><Data ss:Type="String"><xsl:value-of select="@proprietaire_nom" /></Data></Cell>
-									<Cell><Data ss:Type="String"><xsl:value-of select="@proprietaire_adresse" /></Data></Cell>
-								</Row>
-							</xsl:if>
-						</xsl:for-each>
-					</xsl:for-each> 
-
-					<Row ss:AutoFitHeight="0">
-						<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2" /></Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-						<Cell><Data ss:Type="String"></Data></Cell>
-					</Row>
-
-			</Table>
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		 </Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_ProprietaireLocaux.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_ProprietaireLocaux.xsl
deleted file mode 100755
index 8a9cfff6b14d15c3029a4bab4a6c01ecc7c3f3ef..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_ProprietaireLocaux.xsl
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-			<Style	ss:ID="s64">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Top"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Right"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style ss:ID="s65">
-				<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
-			</Style>
-		</Styles>
-
-		<Worksheet ss:Name="Feuil1">
-			<!--<xsl:variable name="nb_ligne"><xsl:value-of select="./XmlMapLog/XmlLog/@nb_ligne" /></xsl:variable>-->
-			<Table ss:ExpandedColumnCount="30" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<!--<xsl:attribute name="ss:ExpandedRowCount"><xsl:value-of select="1000" /></xsl:attribute>-->
-				<Column ss:AutoFitWidth="0" ss:Width="100"/>
-				<Column ss:AutoFitWidth="0" ss:Width="100"/>
-				<Column ss:AutoFitWidth="0" ss:Width="200"/>
-				<Column ss:AutoFitWidth="0" ss:Width="55"/>
-				<Column ss:AutoFitWidth="0" ss:Width="60"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="90"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="45"/>
-				<Column ss:AutoFitWidth="0" ss:Width="200"/>
-				<Column ss:AutoFitWidth="0" ss:Width="80"/>
-				<Column ss:AutoFitWidth="0" ss:Width="115"/>
-				<Column ss:AutoFitWidth="0" ss:Width="200"/>
-				<Column ss:AutoFitWidth="0" ss:Width="70"/>
-				<Column ss:AutoFitWidth="0" ss:Width="80"/>
-				<Row ss:AutoFitHeight="0" ss:Height="15.75" ss:StyleID="s64">
-					<Cell ss:MergeAcross="3"><Data ss:Type="String">PARCELLES</Data></Cell>
-					<Cell ss:MergeAcross="12"><Data ss:Type="String">LOCAUX</Data></Cell>
-				</Row>
-
-				<Row ss:AutoFitHeight="0" ss:Height="30" ss:StyleID="s65">
-					<Cell><Data ss:Type="String">Parcelle</Data></Cell>
-					<Cell><Data ss:Type="String">Commune</Data></Cell>
-					<Cell><Data ss:Type="String">Adresse parcelle</Data></Cell>
-					<Cell><Data ss:Type="String">Superficie parcelle(m²)</Data></Cell>
-					<Cell><Data ss:Type="String">Invariant</Data></Cell>
-					<Cell><Data ss:Type="String">Superficie local(m²)</Data></Cell>
-					<Cell><Data ss:Type="String">Type</Data></Cell>
-					<Cell><Data ss:Type="String">Nature</Data></Cell>
-					<Cell><Data ss:Type="String">Occupation</Data></Cell>
-					<Cell><Data ss:Type="String">Année construction</Data></Cell>
-					<Cell><Data ss:Type="String">Étage</Data></Cell>
-					<Cell><Data ss:Type="String">Adresse local</Data></Cell>
-					<Cell><Data ss:Type="String">Compte propriétaire</Data></Cell>
-					<Cell><Data ss:Type="String">Propriétaire</Data></Cell>
-					<Cell><Data ss:Type="String">Adresse propriétaire</Data></Cell>
-					<Cell><Data ss:Type="String">Indivision</Data></Cell>
-					<Cell><Data ss:Type="String">Droit</Data></Cell>
-				</Row>
-
-				<xsl:for-each select="Mj_Bati_Parcelles/Mj_Bati_Parcelle">
-					<Row ss:AutoFitHeight="0">
-						<Cell><Data ss:Type="String"><xsl:value-of select="@id_par" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="@com" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="@adresse" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="@contenance" /></Data></Cell>
-						<xsl:if test="./Mj_Bati/@bat != '' ">
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@num_invar" /></Data></Cell>
-							<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Bati/Mj_Pev/Mj_Habit_Descr/@suf_piece_total" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@local_type" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@lib_nature" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@lib_occupation" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@annee_constr" /></Data></Cell>
-							<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/@niv" /></Data></Cell>
-							<Cell><Data ss:Type="String">Batiment <xsl:value-of select="./Mj_Bati/@bat" /> <xsl:value-of select="./Mj_Bati/@ent" />, Etage <xsl:value-of select="./Mj_Bati/@niv" />, Porte  <xsl:value-of select="./Mj_Bati/@num_de_porte" />,, <xsl:value-of select="./Mj_Bati/@adresse" /></Data></Cell>
-						</xsl:if>
-						<xsl:if test="./Mj_Bati/@bat = '' ">
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-							<Cell><Data ss:Type="String"></Data></Cell>
-						</xsl:if>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/Mj_Proprietaire/@dnupro" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/Mj_Proprietaire/@proprietaire_nom" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/Mj_Proprietaire/@proprietaire_adresse" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/Mj_Proprietaire/@l_ccodem" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Bati/Mj_Proprietaire/@l_ccodro" /></Data></Cell>
-					</Row>
-
-					<xsl:for-each select="./Mj_Bati/Mj_Proprietaire">
-						<xsl:if test="position()!=1">
-							<Row ss:AutoFitHeight="0">
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@num_invar" /></Data></Cell>
-								<Cell><Data ss:Type="Number"><xsl:value-of select="../Mj_Pev/Mj_Habit_Descr/@suf_piece_total" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@local_type" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@lib_nature" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@lib_occupation" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@annee_constr" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="../@niv" /></Data></Cell>
-								<Cell><Data ss:Type="String">Batiment <xsl:value-of select="../@bat" /> <xsl:value-of select="../@ent" />, Etage <xsl:value-of select="../@niv" />, Porte  <xsl:value-of select="../@num_de_porte" />,, <xsl:value-of select="../@adresse" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@dnupro" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@proprietaire_nom" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@proprietaire_adresse" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@l_ccodem" /></Data></Cell>
-								<Cell><Data ss:Type="String"><xsl:value-of select="./@l_ccodro" /></Data></Cell>
-							</Row>
-						</xsl:if>
-					</xsl:for-each>
-				</xsl:for-each>
-
-				<Row ss:AutoFitHeight="0">
-					<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Bati_Parcelles/@sum_contenance_m2" /></Data></Cell>
-				</Row>
-
-			</Table>
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		 </Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_SubdivisionFiscale.xsl b/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_SubdivisionFiscale.xsl
deleted file mode 100755
index bd1e45b07c4f9eb4b7c979b8e63b0ec748f80b54..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_Rapport_Parcelle_SubdivisionFiscale.xsl
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding='utf-8' ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="xml" indent="yes"/>
-<xsl:template match="Rapport_Parcelle">
-<?mso-application progid="Excel.Sheet"?>
-	<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:o="urn:schemas-microsoft-com:office:office"
-		xmlns:x="urn:schemas-microsoft-com:office:excel"
-		xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
-		xmlns:html="http://www.w3.org/TR/REC-html40">
-		<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-			<Author>Veremap.pro</Author>
-			<LastAuthor>Veremap.pro</LastAuthor>
-			<Company>Veremes</Company>
-		</DocumentProperties>
-		<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-			<WindowHeight>12300</WindowHeight>
-			<WindowWidth>18915</WindowWidth>
-			<WindowTopX>120</WindowTopX>
-			<WindowTopY>105</WindowTopY>
-			<ProtectStructure>False</ProtectStructure>
-			<ProtectWindows>False</ProtectWindows>
-		</ExcelWorkbook>
-		<Styles>
-			<Style ss:ID="Default" ss:Name="Normal">
-				<Alignment ss:Vertical="Bottom"/>
-				<Borders/>
-				<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
-				<Interior/>
-				<NumberFormat/>
-				<Protection/>
-			</Style>
-
-			<Style	ss:ID="s63">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s64">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-				<Borders>
-					<Border	ss:Position="Bottom"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Left"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Right"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-					<Border	ss:Position="Top"	ss:LineStyle="Continuous"	ss:Weight="2"/>
-				</Borders>
-			</Style>
-			<Style	ss:ID="s65">
-				<Alignment	ss:Horizontal="Center"	ss:Vertical="Bottom"/>
-			</Style>
-
-		</Styles>
-		 <Worksheet ss:Name="Feuil1">
-			<Table ss:ExpandedColumnCount="6" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
-				<Column ss:AutoFitWidth="0" ss:Width="103.5"/>
-				<Column ss:AutoFitWidth="0" ss:Width="105"/>
-				<Column ss:AutoFitWidth="0" ss:Width="115"/>
-				<Column ss:AutoFitWidth="0" ss:Width="115"/>
-				<Column ss:AutoFitWidth="0" ss:Width="110"/>
-				<Column ss:AutoFitWidth="0" ss:Width="110"/>
-
-				<Row	ss:AutoFitHeight="0"	ss:Height="15.75">
-					<Cell	ss:MergeAcross="2"	ss:StyleID="s63"><Data ss:Type="String">PARCELLES</Data></Cell>
-					<Cell	ss:MergeAcross="2"	ss:StyleID="s64"><Data ss:Type="String">SUBDIVISION FISCALE</Data></Cell>
-				</Row>
-				<Row ss:AutoFitHeight="0">
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Parcelle</Data></Cell>
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Adresse</Data></Cell> 
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Surface cadastrale (m²)</Data></Cell>
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Revenu (Euros)</Data></Cell>
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Surface (m²)</Data></Cell>
-					<Cell	ss:StyleID="s65"><Data ss:Type="String">Occupation</Data></Cell>
-				</Row>
-				<xsl:for-each select="./Mj_Compte_Communal_Parcelles/Mj_Compte_Communal_Parcelle">
-
-					<Row ss:AutoFitHeight="0"> 
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@idpar" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/@adresse" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Parcelle/@contenance" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./@total_revenu_cadastral" /></Data></Cell>
-						<Cell><Data ss:Type="Number"><xsl:value-of select="./@total_contenance" /></Data></Cell>
-						<Cell><Data ss:Type="String"><xsl:value-of select="./Mj_Parcelle/Mj_Suf/@occupation" /></Data></Cell>
-					</Row>
-				</xsl:for-each>
-
-				<Row ss:AutoFitHeight="0">
-					<Cell><Data ss:Type="String">TOTAUX</Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2" /></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_revenu" /></Data></Cell>
-					<Cell><Data ss:Type="Number"><xsl:value-of select="./Mj_Compte_Communal_Parcelles/@Sum_contenance_m2" /></Data></Cell>
-					<Cell><Data ss:Type="String"></Data></Cell>
-				</Row>
-
-			</Table>
-			<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-				<PageSetup>
-					<Header x:Margin="0.3"/>
-					<Footer x:Margin="0.3"/>
-					<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
-				</PageSetup>
-				<Unsynced/>
-				<Print>
-					<ValidPrinterInfo/>
-					<PaperSizeIndex>9</PaperSizeIndex>
-					<HorizontalResolution>600</HorizontalResolution>
-					<VerticalResolution>600</VerticalResolution>
-				</Print>
-				<Selected/>
-				<ProtectObjects>False</ProtectObjects>
-				<ProtectScenarios>False</ProtectScenarios>
-			</WorksheetOptions>
-		 </Worksheet>
-	</Workbook>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/Mj_fo.xsl b/web_service/class/majic_lib/xsl/Mj_fo.xsl
deleted file mode 100755
index dbfa9df57303c23247d4de3a7a75ecabf4449384..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_fo.xsl
+++ /dev/null
@@ -1,2405 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-   <xsl:template match="/">
-      <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-         <fo:layout-master-set>
-            <fo:simple-page-master master-name="simple" page-height="21cm" page-width="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-               <fo:region-body margin="0.5cm 0 0.5cm 0" />
-            </fo:simple-page-master>
-         </fo:layout-master-set>
-
-         <fo:page-sequence master-reference="simple" font-family="Times">
-<!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-            <fo:flow flow-name="xsl-region-body">
-               <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                  <fo:table-column column-width="28.7" />
-
-<!-- Début de l'en-tête qui se retrouvera sur chaque page du RP -->
-                  <fo:table-header>
-				  <fo:table-row>
-                  <fo:table-cell>
-                  <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-				  <fo:table-column column-width="1.2cm" />
-                  <fo:table-column column-width="0.6cm" />
-                  <fo:table-column column-width="0.6cm" />
-                  <fo:table-column column-width="0.9cm" />
-                  <fo:table-column column-width="0.9cm" />
-                  <fo:table-column column-width="6.4cm" />
-                  <fo:table-column column-width="15.4cm" />
-                  <fo:table-column column-width="1.8cm" />
-                  <fo:table-column column-width="0.9cm" />
-				  <fo:table-body>
-                     <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                        <fo:table-row>
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">ANNEE DE MAJ</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@annee_de_maj" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">DEP DIR</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@dep_dir" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">COM</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" padding-left="0.1cm" border-width="0.5pt">
-                              <fo:block line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@com" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell>
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle" font-size="16pt" font-style="italic">RELEVE DE PROPRIETE ( 
-                              <fo:page-number />
-
-                              / 
-                              <fo:page-number-citation ref-id="theEnd" />
-
-                              )</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">NUMERO COMMUNAL</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@numero_communal" />
-                              </fo:block>
-                           </fo:table-cell>
-                        </fo:table-row>
-                     </xsl:for-each>
-					 </fo:table-body>
-					 </fo:table>
-					 </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage de la ligne titre "PROPRIETAIRE" -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="28.7cm" />
-
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell padding-top="0.5cm" padding-bottom="0.1cm">
-                                       <fo:block font-size="8pt" text-align="center">PROPRIETAIRE</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du tableau proprietaire -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" border="0.5pt solid black" width="100%" font-size="8pt" >
-                              <fo:table-column column-width="21.7cm" />
-
-                              <fo:table-column column-width="7cm" />
-
-                              <fo:table-body>
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Proprietaire | Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                                    <fo:table-row>
-                                       <fo:table-cell>
-                                          <fo:block>
-                                          <!-- <xsl:value-of select="@l_ccodro" /> -->
-
-                                            
-                                          <!-- <xsl:value-of select="@l_ccodem" /> -->
-
-                                            
-                                          <xsl:value-of select="@dnuper" />
-
-                                            
-                                          <xsl:value-of select="@proprietaire_nom" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.3cm">
-                                          <fo:block>
-                                             <xsl:value-of select="@jdatnss" />
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-
-                                    <fo:table-row>
-                                       <fo:table-cell padding-left="0.3cm">
-                                          <fo:block>
-                                             <xsl:value-of select="@proprietaire_adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell>
-                                          <fo:block>
-                                             <xsl:value-of select="@dldnss" />
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-                  </fo:table-header>
-
-<!-- Fin de l'en-tête -->
-<!-- Début du corps du tableau global -->
-                  <fo:table-body>
-<!-- Affichage des poprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="6.4cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.8cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="2.4cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.8cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-<!-- Affichage de l'en-tête des propriétés baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="26" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="7" border="0.5pt solid black">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="5" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">IDENTIFICATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="14" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des propriétés baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black" >
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black"  border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLI</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">BAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ENT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NIV</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PORTE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°INVAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">M EVAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NAT LOC</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COLL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN RET</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN DEB</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FRACTION RC EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">% EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" >
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">TX OM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COEF</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des données des propriétés baties -->
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell>
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Bati | Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-								 <xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-                                    <fo:table-row>
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@date" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@section" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_plan" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@cp" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@voirie" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-left="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@code_rivoli" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@bat" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ent" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@niv" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_de_porte" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_invar" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-<!--Affichage du PEV lorsqu'il n'y en a qu'un (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) = 1">
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@s_tar" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@m_eva" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@af" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@nat_loc" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@cat" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@revenu_cadastral" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@coll" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/@nat_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@an_ret" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@fraction_rc_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@pourc_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@tx_om" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!--Affichage du premier PEV lorsqu'il y en a plusieurs (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) &gt; 1">
-                                          <xsl:for-each select="Mj_Pev">
-                                             <xsl:if test="position()=1">
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@nat_exo" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </xsl:if>
-                                          </xsl:for-each>
-                                       </xsl:if>
-                                    </fo:table-row>
-
-<!--Affichage des PEV suivants (lignes suivantes) -->
-                                    <xsl:if test="count(Mj_Pev) &gt; 1">
-                                       <xsl:for-each select="Mj_Pev">
-                                          <xsl:if test="position()&gt;1">
-                                             <fo:table-row>
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@nat_exo" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@tx_om" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </xsl:if>
-                                       </xsl:for-each>
-                                    </xsl:if>
-
-<!--Affichage des Lot_Local s'il y en a -->
-                                    <xsl:if test="count(Mj_Lot_Local) &gt; 0">
-                                       <xsl:for-each select="Mj_Lot_Local">
-                                          <fo:table-row>
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-left="0.4cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@lot" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-                                          </fo:table-row>
-                                       </xsl:for-each>
-                                    </xsl:if>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table table-layout="fixed" border-collapse="collapse" width="28.7cm" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1.8cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="6.9cm" />
-
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       <fo:table-row>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_com_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_dep_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_reg_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">DEP</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">R</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_dep_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_reg_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.5cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="7.9cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.4cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.1cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="2cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.5cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-<!-- Affichage de l'en-tête des proprietes non baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="23" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES NON BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="6" border="0.5pt solid black">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="17" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des proprietes non baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLIs</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">N°PARC PRIM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FP DP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SUF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">GR/SS GR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CLASSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT CULT</fo:block>
-                                    </fo:table-cell>
-
-<!-- Creation d'une table pour afficher le titre de colonne (CONTENANCE HA A CA) -->
-                                    <fo:table-cell number-columns-spanned="3" border="0.5pt solid black">
-                                       <fo:table table-layout="fixed" border-collapse="collapse" font-size="6pt" width="100%">
-                                          <fo:table-body>
-                                             <fo:table-row>
-                                                <fo:table-cell number-columns-spanned="3" padding-top="0.05cm">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CONTENANCE</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">HA</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">A</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CA</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </fo:table-body>
-                                       </fo:table>
-                                    </fo:table-cell>
-
-<!-- Suite de l'affichage des titres des colonnes des proprietes non baties -->
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COLL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN RET</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FRACTION RC EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">% EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">POS</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="3" border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-bottom="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des donnees des proprietes non baties -->
-							<fo:table-body>
-								<fo:table-row>
-									<fo:table-cell>
-										<fo:block></fo:block>
-									</fo:table-cell>
-								</fo:table-row>
-
-								<xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Parcelle | Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-									<xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-									<fo:table-row>
-										<xsl:choose>
-											<xsl:when test="Mj_Suf/@num_voirie = '*****' ">
-												<!-- Premiere ligne si la parcelle est concernées par un lot en Biens Non délimités -->
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@date" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@section" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_plan" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_voirie" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@adresse" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-left="0.1cm">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@code_rivoli" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_parc_prim" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@fp_dp" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="right" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm"></fo:block>
-												</fo:table-cell>
-											</xsl:when>
-											<xsl:otherwise>
-												<!-- Premiere ligne si la parcelle n'est pas concernée par un lot en Biens Non délimités -->
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@date" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@section" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_plan" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_voirie" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@adresse" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell padding-left="0.1cm">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@code_rivoli" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@num_parc_prim" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@fp_dp" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@s_tar" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@suf" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@grss_gr" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@clas" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@nat_cult" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@ha" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@a" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell>
-													<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-														<xsl:value-of select="@ca" />
-													</fo:block>
-												</fo:table-cell>
-												<!-- Affichage de la colonne revenu cadastral lorsqu'il a une seule suf -->
-												<xsl:if test="count(Mj_Suf)=1">
-													<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-														<fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-															<xsl:value-of select="@revenu_cadastral" />
-														</fo:block>
-													</fo:table-cell>
-												</xsl:if>
-												<!-- Affichage de la colonne revenu cadastral lorsqu'il a plusieurs sufs -->
-												<xsl:if test="count(Mj_Suf) &gt; 1">
-													<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-														<fo:block text-align="right" vertical-align="middle" line-height="0.5cm"></fo:block>
-													</fo:table-cell>
-												</xsl:if>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-														<xsl:value-of select="Mj_Suf/@nat_exo" />
-													</fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-												</fo:table-cell>
-												<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-													<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-												</fo:table-cell>
-											</xsl:otherwise>
-										</xsl:choose>
-									</fo:table-row>
-<!-- Suite de l'affichage des donnees des proprietes non baties - Affichage des SUF-->
-									<xsl:if test="count(Mj_Suf) > 0">
-										<xsl:choose>
-											<xsl:when test="count(Mj_Suf) = 1">
-												<xsl:if test="count(Mj_Suf/Mj_Exon_Suf) > 0">
-													<xsl:for-each select="Mj_Suf/Mj_Exon_Suf">
-														<fo:table-row>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="right" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@ccolloc" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@nat_exo" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@pexn div 100" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@rcexnba div 100" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-														</fo:table-row>
-													</xsl:for-each>
-												</xsl:if>
-											</xsl:when>
-											<xsl:otherwise>
-<!-- Affichage des Suf lorsqu'il y en a plusieurs -->
-												<xsl:if test="count(Mj_Suf) &gt; 1">
-													<xsl:for-each select="Mj_Suf">
-														<fo:table-row>
-															<xsl:choose>
-																<xsl:when test="@num_voirie = '*****' ">
-																	<!-- La SUF est concernée par un lot en Biens Non délimités -->
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-																			<xsl:value-of select="../@date" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-																			<xsl:value-of select="../@section" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-																			<xsl:value-of select="../@num_plan" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-																			<xsl:value-of select="@num_voirie" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block vertical-align="middle" line-height="0.25cm">
-																			<xsl:text>&#160;</xsl:text><xsl:value-of select="@dnupdl" /> LOT <xsl:value-of select="@dnulot" /><xsl:text>&#160;</xsl:text><xsl:value-of select="@dnumql" />/<xsl:value-of select="@ddenql" />
-																		</fo:block>
-																	</fo:table-cell>
-																</xsl:when>
-																<xsl:otherwise>
-																	<!-- La SUF n'est pas concernée par un lot en Biens Non délimités -->
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																</xsl:otherwise>
-															</xsl:choose>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@s_tar" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@suf" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@grss_gr" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@clas" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@nat_cult" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@ha" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@a" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell>
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@ca" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@revenu_cadastral" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																	<xsl:value-of select="@nat_exo" />
-																</fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-															<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-															</fo:table-cell>
-														</fo:table-row>
-														<!-- Affichage des Exon_Suf lorsqu'il y en a -->
-														<xsl:if test="count(Mj_Exon_Suf) &gt; 0">
-															<xsl:for-each select="Mj_Exon_Suf">
-																<fo:table-row>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell>
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell>
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell>
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell>
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell>
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="right" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																			<xsl:value-of select="@ccolloc" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																			<xsl:value-of select="@nat_exo" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																			<xsl:value-of select="@pexn div 100" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-																			<xsl:value-of select="@rcexnba div 100" />
-																		</fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																	<fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-																		<fo:block text-align="center" vertical-align="middle" line-height="0.25cm"></fo:block>
-																	</fo:table-cell>
-																</fo:table-row>
-															</xsl:for-each>
-														</xsl:if>
-													</xsl:for-each>
-												</xsl:if>
-											</xsl:otherwise>
-										</xsl:choose>
-									</xsl:if>
-								</xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table width="26.6cm" table-layout="fixed" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" border-collapse="collapse" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="3.9cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2.3cm" />
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">HA</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">A</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">CA</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_com_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_tax_ad_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">CONT</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-									      <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">TAXE AD</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell padding-right="0.8cm">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">MAJ POS</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ha" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@a" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ca" />
-                                             </fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_tax_ad_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-
-<!-- Fin de la table du pied du tableau des propiétés non baties -->
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Fin du corps du tableau global -->
-                  </fo:table-body>
-
-<!-- Fin du tableau global -->
-               </fo:table>
-
-               <fo:block id="theEnd" />
-            </fo:flow>
-         </fo:page-sequence>
-      </fo:root>
-   </xsl:template>
-</xsl:stylesheet>
-
diff --git a/web_service/class/majic_lib/xsl/Mj_fo_Restreint.xsl b/web_service/class/majic_lib/xsl/Mj_fo_Restreint.xsl
deleted file mode 100755
index 995c9dec18d223052c51cd70615ef2ae056c63c8..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_fo_Restreint.xsl
+++ /dev/null
@@ -1,1791 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-   <xsl:template match="/">
-      <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-         <fo:layout-master-set>
-            <fo:simple-page-master master-name="simple" page-height="21cm" page-width="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-               <fo:region-body margin="0.5cm 0 0.5cm 0" />
-            </fo:simple-page-master>
-         </fo:layout-master-set>
-
-         <fo:page-sequence master-reference="simple" font-family="Times">
-<!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-            <fo:flow flow-name="xsl-region-body">
-               <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                  <fo:table-column column-width="28.7" />
-
-<!-- Début de l'en-tête qui se retrouvera sur chaque page du RP -->
-                  <fo:table-header>
-				  <fo:table-row>
-                  <fo:table-cell>
-                  <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-				  <fo:table-column column-width="1.2cm" />
-
-                  <fo:table-column column-width="0.6cm" />
-
-                  <fo:table-column column-width="0.6cm" />
-
-                  <fo:table-column column-width="0.9cm" />
-
-                  <fo:table-column column-width="0.9cm" />
-
-                  <fo:table-column column-width="6.4cm" />
-
-                  <fo:table-column column-width="15.4cm" />
-
-                  <fo:table-column column-width="1.8cm" />
-
-                  <fo:table-column column-width="0.9cm" />
-				  <fo:table-body>
-                     <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                        <fo:table-row>
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">ANNEE DE MAJ</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@annee_de_maj" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">DEP DIR</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@dep_dir" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">COM</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" padding-left="0.1cm" border-width="0.5pt">
-                              <fo:block line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@com" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell>
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle" font-size="16pt" font-style="italic">RELEVE DE PROPRIETE ( 
-                              <fo:page-number />
-
-                              / 
-                              <fo:page-number-citation ref-id="theEnd" />
-
-                              )</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-right="hidden" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">NUMERO COMMUNAL</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="substring(@numero_communal,6)" />
-                              </fo:block>
-                           </fo:table-cell>
-                        </fo:table-row>
-                     </xsl:for-each>
-					 </fo:table-body>
-					 </fo:table>
-					 </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage de la ligne titre "PROPRIETAIRE" -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="28.7cm" />
-
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell padding-top="0.5cm" padding-bottom="0.1cm">
-                                       <fo:block font-size="8pt" text-align="center">PROPRIETAIRE</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du tableau proprietaire -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" border-color="black" border="0.5pt" border-style="solid" border-collapse="collapse" width="100%" font-size="8pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                              <fo:table-column column-width="28.7cm" />
-
-                              
-
-                              <fo:table-body>
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Proprietaire | Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                                    <fo:table-row>
-                                       <fo:table-cell>
-                                          <fo:block>
-                                          <xsl:value-of select="@l_ccodro" />
-
-                                            
-                                          <xsl:value-of select="@l_ccodem" />
-
-                                            
-                                          <xsl:value-of select="@dnuper" />
-
-                                            
-                                          <xsl:value-of select="@proprietaire_nom_tiers" />
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-
-                                    <fo:table-row>
-                                       <fo:table-cell padding-left="0.3cm">
-                                          <fo:block>
-                                             <xsl:value-of select="@proprietaire_adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-                  </fo:table-header>
-
-<!-- Fin de l'en-tête -->
-<!-- Début du corps du tableau global -->
-                  <fo:table-body>
-<!-- Affichage des poprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="11.3cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.8cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="2.4cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-<!-- Affichage de l'en-tête des propriétés baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="20" border-left="hidden" border-right="hidden" border-top="hidden" border-bottom="hidden" border-width="0.5pt" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="7" border-right="hidden" border-bottom="hidden" border-width="0.5pt">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="5" border-left="hidden" border-bottom="hidden" border-right="hidden" border-width="0.5pt">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">IDENTIFICATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="8" border-left="hidden" border-bottom="hidden" border-width="0.5pt">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des propriétés baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLI</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">BAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ENT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NIV</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PORTE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°INVAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">M EVAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NAT LOC</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">TX OM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COEF</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des données des propriétés baties -->
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell>
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Bati | Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-								  <xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-                                    <fo:table-row>
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@date" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@section" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_plan" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@cp" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@voirie" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-left="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@code_rivoli" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@bat" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ent" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@niv" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_de_porte" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_invar" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-<!--Affichage du PEV lorsqu'il n'y en a qu'un (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) = 1">
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@s_tar" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@m_eva" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@af" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@nat_loc" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@cat" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@revenu_cadastral" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@tx_om" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!--Affichage du premier PEV lorsqu'il y en a plusieurs (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) &gt; 1">
-                                          <xsl:for-each select="Mj_Pev">
-                                             <xsl:if test="position()=1">
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </xsl:if>
-                                          </xsl:for-each>
-                                       </xsl:if>
-                                    </fo:table-row>
-
-<!--Affichage des PEV suivants (lignes suivantes) -->
-                                    <xsl:if test="count(Mj_Pev) &gt; 1">
-                                       <xsl:for-each select="Mj_Pev">
-                                          <xsl:if test="position()&gt;1">
-                                             <fo:table-row>
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@tx_om" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </xsl:if>
-                                       </xsl:for-each>
-                                    </xsl:if>
-
-<!--Affichage des Lot_Local s'il y en a -->
-                                    <xsl:if test="count(Mj_Lot_Local) &gt; 0">
-                                       <xsl:for-each select="Mj_Lot_Local">
-                                          <fo:table-row>
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-left="0.4cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@lot" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-                                          </fo:table-row>
-                                       </xsl:for-each>
-                                    </xsl:if>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table table-layout="fixed" border-collapse="collapse" width="28.7cm" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1.8cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="6.9cm" />
-
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">DEP</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">R</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_dep_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_reg_bati_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.5cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="12.1cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.4cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.1cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="2cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-<!-- Affichage de l'en-tête des proprietes non baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="18" border-right="hidden" border-bottom="hidden" border-left="hidden" border-top="hidden" border-width="0.5pt" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES NON BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="6" border-right="hidden" border-bottom="hidden" border-width="0.5pt">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-style="solid" number-columns-spanned="12" border-left="hidden" border-bottom="hidden" border-width="0.5pt">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des proprietes non baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLI</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">N°PARC PRIM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FP DP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SUF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">GR/SS GR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CLASSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT CULT</fo:block>
-                                    </fo:table-cell>
-
-<!-- Creation d'une table pour afficher le titre de colonne (CONTENANCE HA A CA) -->
-                                    <fo:table-cell number-columns-spanned="3" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:table table-layout="fixed" border-collapse="collapse" font-size="6pt" width="100%">
-                                          <fo:table-body>
-                                             <fo:table-row>
-                                                <fo:table-cell number-columns-spanned="3" padding-top="0.05cm">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CONTENANCE</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">HA</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">A</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CA</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </fo:table-body>
-                                       </fo:table>
-                                    </fo:table-cell>
-
-<!-- Suite de l'affichage des titres des colonnes des proprietes non baties -->
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">POS</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="3" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des donnees des proprietes non baties -->
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell>
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Parcelle | Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-								  <xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-                                    <fo:table-row>
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@date" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@section" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_plan" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_voirie" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@code_rivoli" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_parc_prim" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@fp_dp" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@s_tar" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@suf" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@grss_gr" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@clas" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@nat_cult" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ha" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@a" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ca" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-<!-- Affichage de la colonne revenu cadastral lorsqu'il a une seule suf -->
-                                       <xsl:if test="count(Mj_Suf)=1">
-                                          <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@revenu_cadastral" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!-- Affichage de la colonne revenu cadastral lorsqu'il a plusieurs sufs -->
-                                       <xsl:if test="count(Mj_Suf) &gt; 1">
-                                          <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!-- Suite de l'affichage des donnees des proprietes non baties -->
-                                       <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-
-<!-- Affichage des Suf lorsqu'il y en a plusieurs -->
-                                    <xsl:if test="count(Mj_Suf) &gt; 1">
-                                       <xsl:for-each select="Mj_Suf">
-                                          <fo:table-row>
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@s_tar" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@suf" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@grss_gr" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@clas" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@nat_cult" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@ha" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@a" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@ca" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-right="0.1cm" border-color="black" border-width="0.5pt" border-style="solid" border-right="hidden" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@revenu_cadastral" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border-color="black" border-width="0.5pt" border-style="solid" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-                                          </fo:table-row>
-                                       </xsl:for-each>
-                                    </xsl:if>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table width="26.6cm" table-layout="fixed" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" border-collapse="collapse" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1cm" />
-
-                                 <fo:table-column column-width="1cm" />
-
-                                 <fo:table-column column-width="1cm" />
-
-                                 <fo:table-column column-width="1cm" />
-
-                                 <fo:table-column column-width="3.9cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.3cm" />
-
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">HA</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">A</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">CA</fo:block>
-                                          </fo:table-cell>
-										  
-										  
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">CONT</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-									      <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">TAXE AD</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell >
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.8cm">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">MAJ POS</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ha" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@a" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ca" />
-                                             </fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_tax_ad_par_float" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-											</fo:block>
-                                          </fo:table-cell>
-										  
-										  <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-
-<!-- Fin de la table du pied du tableau des propiétés non baties -->
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Fin du corps du tableau global -->
-                  </fo:table-body>
-
-<!-- Fin du tableau global -->
-               </fo:table>
-
-               <fo:block id="theEnd" />
-            </fo:flow>
-         </fo:page-sequence>
-      </fo:root>
-   </xsl:template>
-</xsl:stylesheet>
-
diff --git a/web_service/class/majic_lib/xsl/Mj_fo_tiers.xsl b/web_service/class/majic_lib/xsl/Mj_fo_tiers.xsl
deleted file mode 100755
index cd17f9b12e26db5237f4f795c440754ef83974fb..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/Mj_fo_tiers.xsl
+++ /dev/null
@@ -1,2037 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-   <xsl:template match="/">
-      <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-         <fo:layout-master-set>
-            <fo:simple-page-master master-name="simple" page-height="21cm" page-width="29.7cm" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.5cm">
-               <fo:region-body margin="0.5cm 0 0.5cm 0" />
-            </fo:simple-page-master>
-         </fo:layout-master-set>
-
-         <fo:page-sequence master-reference="simple" font-family="Times">
-<!-- Tableau global basé sur la structure de la première ligne du relevé de propriété -->
-            <fo:flow flow-name="xsl-region-body">
-               <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                  <fo:table-column column-width="28.7" />
-
-<!-- Début de l'en-tête qui se retrouvera sur chaque page du RP -->
-                  <fo:table-header>
-				  <fo:table-row>
-                  <fo:table-cell>
-                  <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-				  <fo:table-column column-width="1.2cm" />
-                  <fo:table-column column-width="0.6cm" />
-                  <fo:table-column column-width="0.6cm" />
-                  <fo:table-column column-width="0.9cm" />
-                  <fo:table-column column-width="0.9cm" />
-                  <fo:table-column column-width="6.4cm" />
-                  <fo:table-column column-width="15.4cm" />
-                  <fo:table-column column-width="1.8cm" />
-                  <fo:table-column column-width="0.9cm" />
-				  <fo:table-body>
-                     <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                        <fo:table-row>
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">ANNEE DE MAJ</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@annee_de_maj" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">DEP DIR</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@dep_dir" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">COM</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" padding-left="0.1cm" border-width="0.5pt">
-                              <fo:block line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@com" />
-                              </fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell>
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle" font-size="16pt" font-style="italic">RELEVE DE PROPRIETE ( 
-                              <fo:page-number />
-
-                              / 
-                              <fo:page-number-citation ref-id="theEnd" />
-
-                              )</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border="0.5pt solid black">
-                              <fo:block text-align="center" line-height="0.25cm" vertical-align="middle">NUMERO COMMUNAL</fo:block>
-                           </fo:table-cell>
-
-                           <fo:table-cell border-color="black" border-style="solid" border-width="0.5pt">
-                              <fo:block text-align="center" line-height="0.5cm" vertical-align="middle">
-                                 <xsl:value-of select="@numero_communal" />
-                              </fo:block>
-                           </fo:table-cell>
-                        </fo:table-row>
-                     </xsl:for-each>
-					 </fo:table-body>
-					 </fo:table>
-					 </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage de la ligne titre "PROPRIETAIRE" -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="28.7cm" />
-
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell padding-top="0.5cm" padding-bottom="0.1cm">
-                                       <fo:block font-size="8pt" text-align="center">PROPRIETAIRE</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du tableau proprietaire -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" border-color="black" border="0.5pt" border-style="solid" border-collapse="collapse" width="100%" font-size="8pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                              <fo:table-column column-width="21.7cm" />
-
-                              <fo:table-column column-width="7cm" />
-
-                              <fo:table-body>
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Proprietaire | Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                                    <fo:table-row>
-                                       <fo:table-cell>
-                                          <fo:block>
-                                          <!-- <xsl:value-of select="@l_ccodro" /> -->
-
-                                            
-                                          <!-- <xsl:value-of select="@l_ccodem" /> -->
-
-                                            
-                                          <xsl:value-of select="@dnuper" />
-
-<!-- Modification tiers par rapport au xsl par défaut-->
-                                            
-                                          <xsl:value-of select="@proprietaire_nom_tiers" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.3cm">
-                                          <fo:block>
-<!-- Modification tiers par rapport au xsl par défaut-->
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-
-                                    <fo:table-row>
-                                       <fo:table-cell padding-left="0.3cm">
-                                          <fo:block>
-                                             <xsl:value-of select="@proprietaire_adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell>
-                                          <fo:block>
-<!-- Modification tiers par rapport au xsl par défaut-->
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-                  </fo:table-header>
-
-<!-- Fin de l'en-tête -->
-<!-- Début du corps du tableau global -->
-                  <fo:table-body>
-<!-- Affichage des poprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="6.4cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.8cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.4cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="2.4cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.8cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-<!-- Affichage de l'en-tête des propriétés baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="26" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="7" border="0.5pt solid black">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="5" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">IDENTIFICATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="14" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION DU LOCAL</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des propriétés baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLI</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">BAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ENT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NIV</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PORTE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°INVAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">M EVAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">NAT LOC</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CAT</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COLL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN RET</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN DEB</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FRACTION RC EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">% EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">TX OM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COEF</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des données des propriétés baties -->
-                              <fo:table-body>
-                                 <fo:table-row>
-                                    <fo:table-cell>
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Bati | Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-								 <xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-                                    <fo:table-row>
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@date" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@section" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_plan" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@cp" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@voirie" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-left="hidden" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@code_rivoli" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@bat" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ent" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@niv" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_de_porte" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_invar" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-<!--Affichage du PEV lorsqu'il n'y en a qu'un (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) = 1">
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@s_tar" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@m_eva" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@af" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@nat_loc" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@cat" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@revenu_cadastral" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@coll" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/@nat_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@an_ret" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@fraction_rc_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="Mj_Pev/Mj_Exone_Pev/@pourc_exo" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@tx_om" />
-                                             </fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!--Affichage du premier PEV lorsqu'il y en a plusieurs (même ligne) -->
-                                       <xsl:if test="count(Mj_Pev) &gt; 1">
-                                          <xsl:for-each select="Mj_Pev">
-                                             <xsl:if test="position()=1">
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                      <xsl:value-of select="@nat_exo" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </xsl:if>
-                                          </xsl:for-each>
-                                       </xsl:if>
-                                    </fo:table-row>
-
-<!--Affichage des PEV suivants (lignes suivantes) -->
-                                    <xsl:if test="count(Mj_Pev) &gt; 1">
-                                       <xsl:for-each select="Mj_Pev">
-                                          <xsl:if test="position()&gt;1">
-                                             <fo:table-row>
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@s_tar" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@m_eva" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@af" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@nat_loc" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@cat" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="@nat_exo" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@revenu_cadastral" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                      <xsl:value-of select="../@tx_om" />
-                                                   </fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                   </fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </xsl:if>
-                                       </xsl:for-each>
-                                    </xsl:if>
-
-<!--Affichage des Lot_Local s'il y en a -->
-                                    <xsl:if test="count(Mj_Lot_Local) &gt; 0">
-                                       <xsl:for-each select="Mj_Lot_Local">
-                                          <fo:table-row>
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-left="0.4cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block vertical-align="middle" line-height="0.25cm">
-                                                   <xsl:value-of select="@lot" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="right" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-                                          </fo:table-row>
-                                       </xsl:for-each>
-                                    </xsl:if>
-                                 </xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table table-layout="fixed" border-collapse="collapse" width="28.7cm" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1.8cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="2.5cm" />
-
-                                 <fo:table-column column-width="1.5cm" />
-
-                                 <fo:table-column column-width="2cm" />
-
-                                 <fo:table-column column-width="6.9cm" />
-
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       <fo:table-row>
-										  <fo:table-cell number-columns-spanned="4">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_com_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_dep_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_reg_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="3">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">DEP</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="3">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">R</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-
-                                       <fo:table-row>
-										  <fo:table-cell number-columns-spanned="4">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_dep_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_reg_bati" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:table table-layout="fixed" width="100%" border-collapse="collapse" font-size="7pt">
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.5cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="1.2cm" />
-
-                              <fo:table-column column-width="5.8cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.4cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="1.1cm" />
-
-                              <fo:table-column column-width="1cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="0.7cm" />
-
-                              <fo:table-column column-width="2cm" />
-
-                              <fo:table-column column-width="0.9cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="1.5cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-                              <fo:table-column column-width="0.6cm" />
-
-<!-- Affichage de l'en-tête des proprietes non baties -->
-                              <fo:table-header>
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="23" padding-top="1cm" padding-bottom="0.1cm">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">PROPRIETES NON BATIES</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-                                 <fo:table-row>
-                                    <fo:table-cell number-columns-spanned="6" border="0.5pt solid black">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">DESIGNATION DES PROPRIETES</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="17" border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" font-size="8pt" line-height="0.5cm" vertical-align="middle">EVALUATION</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-
-<!-- Affichage des titres des colonnes des proprietes non baties -->
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                      <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">AN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SECTION</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N°PLAN</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">N° Voirie</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">ADRESSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CODE RIVOLI</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">N°PARC PRIM</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FP DP</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black" border-left="hidden">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">S TAR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">SUF</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">GR/SS GR</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">CLASSE</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT CULT</fo:block>
-                                    </fo:table-cell>
-
-<!-- Creation d'une table pour afficher le titre de colonne (CONTENANCE HA A CA) -->
-                                    <fo:table-cell number-columns-spanned="3" border="0.5pt solid black">
-                                       <fo:table table-layout="fixed" border-collapse="collapse" font-size="6pt" width="100%">
-                                          <fo:table-body>
-                                             <fo:table-row>
-                                                <fo:table-cell number-columns-spanned="3" padding-top="0.05cm">
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CONTENANCE</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-
-                                             <fo:table-row>
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">HA</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">A</fo:block>
-                                                </fo:table-cell>
-
-                                                <fo:table-cell>
-                                                   <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">CA</fo:block>
-                                                </fo:table-cell>
-                                             </fo:table-row>
-                                          </fo:table-body>
-                                       </fo:table>
-                                    </fo:table-cell>
-
-<!-- Suite de l'affichage des titres des colonnes des proprietes non baties -->
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">REVENU CADASTRAL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">COLL</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">NAT EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">AN RET</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">FRACTION RC EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">% EXO</fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">POS</fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-header>
-
-                              <fo:table-footer>
-                                 <fo:table-row>
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block>
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell number-columns-spanned="3" border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.25cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-
-                                    <fo:table-cell border="0.5pt solid black">
-                                       <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                       </fo:block>
-                                    </fo:table-cell>
-                                 </fo:table-row>
-                              </fo:table-footer>
-
-<!-- Affichage des donnees des proprietes non baties -->
-							<fo:table-body>
-								<fo:table-row>
-									<fo:table-cell>
-										<fo:block></fo:block>
-									</fo:table-cell>
-								</fo:table-row>
-
-								<xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Parcelle | Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-									<xsl:sort select="@section" />
-									<xsl:sort select="@num_plan" data-type="number"/>
-									<fo:table-row>
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@date" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-right="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="right" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@section" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_plan" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_voirie" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@adresse" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell padding-left="0.1cm" border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@code_rivoli" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@num_parc_prim" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@fp_dp" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@s_tar" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@suf" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@grss_gr" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@clas" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@nat_cult" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ha" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@a" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="@ca" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-<!-- Affichage de la colonne revenu cadastral lorsqu'il a une seule suf -->
-                                       <xsl:if test="count(Mj_Suf)=1">
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                <xsl:value-of select="@revenu_cadastral" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!-- Affichage de la colonne revenu cadastral lorsqu'il a plusieurs sufs -->
-                                       <xsl:if test="count(Mj_Suf) &gt; 1">
-                                          <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                             <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                       </xsl:if>
-
-<!-- Suite de l'affichage des donnees des proprietes non baties -->
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                             <xsl:value-of select="Mj_Suf/@nat_exo" />
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-
-                                       <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                          <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                          </fo:block>
-                                       </fo:table-cell>
-                                    </fo:table-row>
-
-<!-- Affichage des Suf lorsqu'il y en a plusieurs -->
-                                    <xsl:if test="count(Mj_Suf) &gt; 1">
-                                       <xsl:for-each select="Mj_Suf">
-                                          <fo:table-row>
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@s_tar" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@suf" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@grss_gr" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@clas" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@nat_cult" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@ha" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@a" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden" border-left="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@ca" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@revenu_cadastral" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                   <xsl:value-of select="@nat_exo" />
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-
-                                             <fo:table-cell border="0.5pt solid black" border-bottom="hidden" border-top="hidden">
-                                                <fo:block text-align="center" vertical-align="middle" line-height="0.5cm">
-                                                </fo:block>
-                                             </fo:table-cell>
-                                          </fo:table-row>
-                                       </xsl:for-each>
-									</xsl:if>
-								</xsl:for-each>
-                              </fo:table-body>
-                           </fo:table>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Affichage du pied du tableau des proprietes non baties -->
-                     <fo:table-row>
-                        <fo:table-cell>
-                           <fo:block keep-together="always" keep-with-previous="always">
-                              <fo:table width="26.6cm" table-layout="fixed" border-color="black" border-right="0.5pt" border-left="0.5pt" border-top="0pt" border-bottom="0.5pt" border-style="solid" border-collapse="collapse" font-size="6pt" padding-top="0.2cm" padding-bottom="0.1cm">
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1cm" />
-                                 <fo:table-column column-width="1.8cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="1.5cm" />
-                                 <fo:table-column column-width="2cm" />
-                                 <fo:table-column column-width="2.3cm" />
-                                 <fo:table-body>
-                                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle"></fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">HA</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">A</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">CA</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="4">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_com_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_dep_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">R EXO</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" margin-top="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@exo_reg_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="left" line-height="0.60cm" vertical-align="middle">CONT</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="4">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">REV IMPOSABLE</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">COM</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="3">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">DEP</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="3">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">R</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell number-columns-spanned="3" padding-right="0.8cm">
-                                             <fo:block text-align="right" line-height="0.60cm" vertical-align="middle">MAJ POS</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                       <fo:table-row>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ha" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@a" />
-                                             </fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="center" line-height="0.20cm" vertical-align="middle">
-                                                <xsl:value-of select="@ca" />
-                                             </fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="4">
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_com_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_dep_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-										  <fo:table-cell number-columns-spanned="2">
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">R IMP</fo:block>
-                                          </fo:table-cell>
-                                          <fo:table-cell>
-                                             <fo:block text-align="right" line-height="0.20cm" vertical-align="middle">
-                                             <xsl:value-of select="@rev_impo_reg_par" />
-
-                                             EUR</fo:block>
-                                          </fo:table-cell>
-                                       </fo:table-row>
-                                    </xsl:for-each>
-                                 </fo:table-body>
-
-<!-- Fin de la table du pied du tableau des propiétés non baties -->
-                              </fo:table>
-                           </fo:block>
-                        </fo:table-cell>
-                     </fo:table-row>
-
-<!-- Fin du corps du tableau global -->
-                  </fo:table-body>
-
-<!-- Fin du tableau global -->
-               </fo:table>
-
-               <fo:block id="theEnd" />
-            </fo:flow>
-         </fo:page-sequence>
-      </fo:root>
-   </xsl:template>
-</xsl:stylesheet>
-
diff --git a/web_service/class/majic_lib/xsl/RP.xslt b/web_service/class/majic_lib/xsl/RP.xslt
deleted file mode 100755
index 0dae5920b7c5ea243e24c24766bed273d10c901b..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/RP.xslt
+++ /dev/null
@@ -1,3036 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE xsl:stylesheet [
-  <!ENTITY nbsp "&#160;">
-]>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
-  <xsl:template match="/">
-    <xsl:param name="poste"/>
-    <xsl:param name="type"/>
-
-    <html xmlns="http://www.w3.org/1999/xhtml"
-      lang="fr"
-      >
-      <body>
-        <table  table-layout="fixed" width="100%" CELLSPACING="0" CELLPADDING="0">
-          
-          <!-- Début de l'en-tête qui se retrouvera sur chaque page du RP -->
-          
-          <thead>
-            <tr> 
-              <td width="100%">
-                
-                <table style="text-align: center; font-size: 10pt;line-height: 0.8cm;" width="100%" CELLSPACING="0" CELLPADDING="1" >
-                  <tbody>
-                    <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                      <tr>
-                        <td  style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" width="4.14%">
-                          <div style="vertical-align: middle; line-height: 0.3cm; text-align: center;">ANNEE DE MAJ</div>
-                        </td>
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" width="2.07%">
-                          <div style="vertical-align: middle; line-height: 0.6cm; text-align: center;">
-                            <xsl:value-of select="@annee_de_maj"/>
-                          </div>
-                        </td>
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" width="2.07%">
-                          <div style="vertical-align: middle; line-height: 0.3cm; text-align: center;">DEP DIR</div>
-                        </td>                       
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" width="3.11%">
-                          <div style="vertical-align: middle; line-height: 0.6cm; text-align: center;">
-                            <xsl:value-of select="@dep_dir"/>
-                          </div>
-                        </td>                        
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" whidth="3.11%">
-                          <div style="vertical-align: middle; line-height: 0.6cm; text-align: center;">COM</div>
-                        </td>
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black;" whidth="22.08%">
-                          <div style="vertical-align: middle; line-height: 0.6cm; text-align: center;">
-                            <xsl:value-of select="@com"/>
-                          </div>
-                        </td>
-                        <td whidth="53.13%">
-                          <div style="font-style: italic; font-size: 16pt; vertical-align: middle; line-height: 0.5cm; text-align: center;">
-                            RELEVE DE PROPRIETE
-                          </div>
-                        </td>                        
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black; border-right: hidden;" whidth="6.21%">
-                          <div style="vertical-align: middle; line-height: 0.3cm; text-align: center;">NUMERO COMMUNAL</div>
-                        </td>                      
-                        <td style="border-width: 0.5pt; border-style: solid; border-color: black;" whidth="3.11%">
-                          <div style="vertical-align: middle; line-height: 0.6cm; text-align: center;">
-                            <xsl:value-of select="substring(@numero_communal,6)"/>
-                          </div>
-                        </td>
-                      </tr>
-                    </xsl:for-each>
-                  </tbody>
-                </table>
-              </td>
-            </tr>
-            <!-- Affichage de la ligne titre "PROPRIETAIRE" -->
-            <tr>             
-              <td width="100%"> 
-                <table style="text-align: center;" width="100%">
-                  <tbody> 
-                    <tr>
-                      <td padding-top="0.5cm" padding-bottom="0.1cm">
-                        <div style="font-size: 10pt; text-align: center;">PROPRIETAIRE</div>
-                      </td>
-                    </tr>
-                  </tbody>
-                </table>
-              </td>
-            </tr>
-            <!-- Affichage du tableau proprietaire -->
-            
-            <tr>
-              
-              <td>
-                
-                <table style="text-align: left; table-layout: fixed; border-color: black; border: 0.5pt; border-style: solid; border-collapse: collapse; font-size: 10pt; padding-top: 0.2cm; padding-bottom: 0.1cm;" width="100%" >                 
-                  
-                  
-                  <tbody>
-                    
-                    <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Proprietaire | Mj/Mj_Compte_Communal_Parcelle/Mj_Proprietaire">
-                      
-                      <tr>
-                        <xsl:if test="$type='complet'">
-                          <td width="75%" style="padding-left: 0.3cm;">
-                            <div>
-                              <xsl:value-of select="@l_ccodro"/>&nbsp;<xsl:value-of select="@l_ccodem"/>&nbsp;<xsl:value-of select="@dnuper"/>&nbsp;<xsl:value-of select="@proprietaire_nom"/>
-                            </div>
-                          </td>
-
-                          <td width="25%" style="padding-left: 0.3cm;">
-                            <div>
-                              <xsl:value-of select="@jdatnss"/>
-                            </div>
-                          </td>
-                        </xsl:if>
-                        <xsl:if test="not($type='complet')">
-                          <td width="100%" style="padding-left: 0.3cm;">
-                            <div>
-                              <xsl:value-of select="@l_ccodro"/>&nbsp;<xsl:value-of select="@l_ccodem"/>&nbsp;<xsl:value-of select="@dnuper"/>&nbsp;<xsl:value-of select="@proprietaire_nom_tiers"/>
-                            </div>
-                          </td>
-                        </xsl:if>
-                      </tr>
-                      
-                      <tr>
-                        <td style="padding-left: 0.3cm;">
-                          <div>
-                            <xsl:value-of select="@proprietaire_adresse"/>
-                          </div>
-                        </td>
-                        <xsl:if test="$type='complet'">
-                          <td>
-                            <div>
-                              <xsl:value-of select="@dldnss"/>
-                            </div>
-                          </td>
-                        </xsl:if>
-                      </tr>
-                    </xsl:for-each>
-                  </tbody>
-                </table>
-              </td>
-            </tr>
-          </thead>
-          <!-- Fin de l'en-tête -->
-          <!-- Début du corps du tableau global -->
-          
-          <tbody>
-            <!-- Affichage des poprietes baties -->
-            
-            <tr>
-
-              <td width="100%">
-                
-                <table width="100%" style="text-align: center; font-size: 10pt;" CELLSPACING="0" CELLPADDING="0"  >
-                  
-                  <!-- Affichage de l'en-tête des propriétés baties -->
-                  
-                  <thead width="100%">
-                    
-                    <tr >
-                      <xsl:if test="$type='complet'">
-                        <td style="text-align: center; border-color: black; border-style: solid; border-left: hidden; border-right: hidden; border-top: hidden; border-bottom: hidden; border-width: 0.5pt; padding-top: 1cm; padding-bottom: 0.1cm;" valign="top" colspan="26" >
-                          <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >PROPRIETES BATIES</div>
-                        </td>
-                      </xsl:if>
-                      <xsl:if test="not($type='complet')">
-                        <td style="text-align: center; border-color: black; border-style: solid; border-left: hidden; border-right: hidden; border-top: hidden; border-bottom: hidden; border-width: 0.5pt; padding-top: 1cm; padding-bottom: 0.1cm;" valign="top" colspan="20" >
-                          <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >PROPRIETES BATIES</div>
-                        </td>
-                      </xsl:if>
-                    </tr>
-                    
-                    <tr>
-                      
-                      <td style="border-color: black; border-style: solid; border-right: hidden; border-bottom: hidden; border-width: 0.5pt;" valign="top" colspan="7">
-                        <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >DESIGNATION DES PROPRIETES</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-style: solid; border-left: hidden; border-bottom: hidden; border-right: hidden; border-width: 0.5pt;" valign="top" colspan="5">
-                        <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >IDENTIFICATION DU LOCAL</div>
-                      </td>
-                      <xsl:if test="$type='complet'">
-                        <td style="border-color: black; border-style: solid; border-left: hidden; border-bottom: hidden; border-width: 0.5pt;" valign="top" colspan="14">
-                          <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >EVALUATION DU LOCAL</div>
-                        </td>
-                      </xsl:if>
-                      <xsl:if test="not($type='complet')">
-                        <td style="border-color: black; border-style: solid; border-left: hidden; border-bottom: hidden; border-width: 0.5pt;" valign="top" colspan="8">
-                          <div style ="text-align: center; font-size: 8pt; line-height: 0.5cm; vertical-align: middle;" >EVALUATION DU LOCAL</div>
-                        </td>
-                      </xsl:if>
-                    </tr>
-                    
-                    <!-- Affichage des titres des colonnes des propriétés baties -->
-                    
-                    <tr>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">AN</div>
-                      </td>
-                      
-                      <td width="4.14%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">SECTION</div>
-                      </td>
-
-                      <td width="3.45%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N°PLAN</div>
-                      </td>
-
-                      <td width="1.38%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">CP</div>
-                      </td>
-
-                      <td width="4.14%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N° Voirie</div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td width="22.08%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">ADRESSE</div>
-                        </td>
-                      </xsl:if>
-                      <xsl:if test="not($type='complet')">
-                        <td width="38.99%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">ADRESSE</div>
-                        </td>
-                      </xsl:if>
-
-                      <td width="3.11%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-left: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">CODE RIVOLI</div>
-                      </td>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">BAT</div>
-                      </td>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">ENT</div>
-                      </td>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">NIV</div>
-                      </td>
-
-                      <td width="4.14%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N°PORTE</div>
-                      </td>
-
-                      <td width="6.21%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N°INVAR</div>
-                      </td>
-
-                      <td width="2.42%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">S TAR</div>
-                      </td>
-
-                      <td width="2.42%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">M EVAL</div>
-                      </td>
-
-                      <td width="1.38%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">AF</div>
-                      </td>
-
-                      <td width="4.14%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">NAT LOC</div>
-                      </td>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">CAT</div>
-                      </td>
-
-                      <td width="8.28%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">REVENU CADASTRAL</div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td width="2.42%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">COLL</div>
-                        </td>
-
-                        <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">NAT EXO</div>
-                        </td>
-
-                        <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">AN RET</div>
-                        </td>
-
-                        <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">AN DEB</div>
-                        </td>
-
-                        <td width="6.21%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">FRACTION RC EXO</div>
-                        </td>
-
-                        <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">% EXO</div>
-                        </td>
-                      </xsl:if>
-
-                      <td width="2.07%" style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden;" valign="top">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">TX OM</div>
-                      </td>
-
-                      <td width="2.42%" style="border-style: solid; border-width: 0.5pt; border-color: black;" valign="top">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">COEF</div>
-                      </td>
-                    </tr>
-                  </thead>
-                  
-                  <tfoot>
-                    
-                    <tr>
-
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                          <div>
-                          </div>
-                        </td>
-                      </xsl:if>
-                        
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-left: hidden;" valign="top">
-                        <div>
-                        </div>
-                      </td>
-                    </tr>
-                  </tfoot>
-                  <!-- Affichage des données des propriétés baties -->
-                  
-                  <tbody>
-                    
-                    <tr>
-                      
-                      <td>
-                        <div>
-                        </div>
-                      </td>
-                    </tr>
-                    
-                    <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Bati | Mj/Mj_Compte_Communal_Parcelle/Mj_Bati">
-						 <xsl:sort select="substring(@num_invar,1,3)" />
-
-                      <xsl:sort select="@section" />
-						<xsl:sort select="@num_plan" data-type="number"/>
-                      <tr>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@date"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-right: 0.1cm;border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div text-align="right" vertical-align="middle" line-height="0.5cm">
-                            <xsl:value-of select="@section"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@num_plan"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@cp"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@voirie"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-left: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div vertical-align="middle" line-height="0.5cm">
-                            <xsl:value-of select="@adresse"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@code_rivoli"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@bat"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@ent"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@niv"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@num_de_porte"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-left: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;">
-                          
-                          <div vertical-align="middle" line-height="0.5cm">
-                            <xsl:value-of select="@num_invar"/>
-                          </div>
-                        </td>
-                        
-                        <!-- Affichage du PEV lorsqu'il n'y en a qu'un (même ligne) -->
-                        
-                        <xsl:if test="count(Mj_Pev) = 1">
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@s_tar"/>
-                            </div>
-                          </td>
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@m_eva"/>
-                            </div>
-                          </td>
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@af"/>
-                            </div>
-                          </td>
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@nat_loc"/>
-                            </div>
-                          </td>
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@cat"/>
-                            </div>
-                          </td>
-                          
-                          <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div text-align="right" vertical-align="middle" line-height="0.5cm">
-                              <xsl:value-of select="@revenu_cadastral"/>
-                            </div>
-                          </td>
-
-                          <xsl:if test="$type='complet'">
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                              <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                
-                              </div>
-                            </td>
-
-                            <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                              <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                
-                              </div>
-                            </td>
-
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                              <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                
-                              </div>
-                            </td>
-
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              </div>
-                            </td>
-
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                              <div text-align="right" vertical-align="middle" line-height="0.5cm">
-                               
-                              </div>
-                            </td>
-
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                              <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                
-                              </div>
-                            </td>
-                          </xsl:if>
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@tx_om"/>
-                            </div>
-                          </td>
-                          
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-                        </xsl:if>
-                        
-                        <!--Affichage du premier PEV lorsqu'il y en a plusieurs (même ligne) -->
-                        
-                        <xsl:if test="count(Mj_Pev) > 1">
-                          
-                          <xsl:for-each select="Mj_Pev">
-                            
-                            <xsl:if test="position()=1">
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  <xsl:value-of select="@s_tar"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  <xsl:value-of select="../@m_eva"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  <xsl:value-of select="@af"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  <xsl:value-of select="../@nat_loc"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  <xsl:value-of select="@cat"/>
-                                </div>
-                              </td>
-                              
-                              <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div text-align="right" vertical-align="middle" line-height="0.5cm">
-                                  <xsl:value-of select="@revenu_cadastral"/>
-                                </div>
-                              </td>
-
-                              <xsl:if test="$type='complet'">
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                    <xsl:value-of select="@nat_exo"/>
-                                  </div>
-                                </td>
-                              
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                  <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              </xsl:if>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </xsl:if>
-                          </xsl:for-each>
-                        </xsl:if>
-                      </tr>
-                      <!--Affichage des PEV suivants (lignes suivantes) -->
-                      
-                        
-                        <xsl:for-each select="Mj_Pev">
-                          
-                          <xsl:if test="position()>1">
-                            
-                            <tr>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="@s_tar"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="../@m_eva"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="@af"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="../@nat_loc"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="@cat"/>
-                                </div>
-                              </td>
-                              
-                              <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div text-align="right" vertical-align="middle" line-height="0.3cm">
-                                  <xsl:value-of select="@revenu_cadastral"/>
-                                </div>
-                              </td>
-                              <xsl:if test="$type='complet'">
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                    <xsl:value-of select="@nat_exo"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              </xsl:if>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </tr>
-                            
-                            <tr>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div text-align="right" vertical-align="middle" line-height="0.3cm">
-                                  <xsl:value-of select="../@revenu_cadastral"/>
-                                </div>
-                              </td>
-                              <xsl:if test="$type='complet'">
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  </div>
-                                </td>
-                              </xsl:if>
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="../@tx_om"/>
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </tr>
-<xsl:if test="count(Mj_Exone_Pev) &gt; 0">
-							 <xsl:for-each select="Mj_Exone_Pev">
-							<tr>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div text-align="right" vertical-align="middle" line-height="0.3cm">
-                                 
-                                </div>
-                              </td>
-                              <xsl:if test="$type='complet'">
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									 <xsl:value-of select="@coll"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@nat_exo"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@an_ret"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								   <xsl:value-of select="@an_deb"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@fraction_rc_exo"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									 <xsl:value-of select="@pourc_exo"/>
-                                  </div>
-                                </td>
-                              </xsl:if>
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </tr>
-							</xsl:for-each>
-							</xsl:if>
-                          </xsl:if>
-						  <xsl:if test="position() = 1">
-							<xsl:if test="count(Mj_Exone_Pev) &gt; 0">
-							 <xsl:for-each select="Mj_Exone_Pev">
-							<tr>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                              
-                              <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div text-align="right" vertical-align="middle" line-height="0.3cm">
-                                 
-                                </div>
-                              </td>
-                              <xsl:if test="$type='complet'">
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									 <xsl:value-of select="@coll"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@nat_exo"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@an_ret"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								   <xsl:value-of select="@an_deb"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-								  <xsl:value-of select="@fraction_rc_exo"/>
-                                  </div>
-                                </td>
-
-                                <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									 <xsl:value-of select="@pourc_exo"/>
-                                  </div>
-                                </td>
-                              </xsl:if>
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  
-                                </div>
-                              </td>
-                              
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </tr>
-							</xsl:for-each>
-							</xsl:if>
-							</xsl:if>
-                        </xsl:for-each>
-                      <!--Affichage des Lot_Local s'il y en a -->
-                      
-                      <xsl:if test="count(Mj_Lot_Local) > 0">
-                        
-                        <xsl:for-each select="Mj_Lot_Local">
-                          
-                          <tr>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="padding-left: 0.4cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              
-                              <div vertical-align="middle" line-height="0.3cm">
-                                <xsl:value-of select="@lot"/>
-                              </div>
-                            </td>
-                           
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top" >
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div text-align="right" vertical-align="middle" line-height="0.3cm">
-                              </div>
-                            </td>
-                            <xsl:if test="$type='complet'">
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </xsl:if>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-right: hidden; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                            
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                          </tr>
-                        </xsl:for-each>
-                      </xsl:if>
-                    </xsl:for-each>
-                  </tbody>
-                </table>
-              </td>
-            </tr>
-            
-            <!-- Affichage du pied du tableau des proprietes baties -->
-            
-            <tr>
-              
-              <td>
-                
-                <div keep-together="always" keep-with-previous="always">
-                  
-                  <table  table-layout="fixed" width="100%" style="border-collapse: collapse; border-color: black; border-right: 0.5pt; border-left: 0.5pt; border-top: 0pt; border-bottom: 0.5pt; border-style: solid; font-size: 8pt; padding-top: 0.2cm; padding-bottom: 0.1cm;" >
-                    <td width="6.21%" />
-                    <td width="6.9%" />
-                    <td width="8.63%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="8.63%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="8.63%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="23.81%" />
-                    
-                    <tbody>
-                      
-                      <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                        
-                        <tr>
-                          <xsl:if test="$type='complet'">
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R EXO</div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                                <xsl:value-of select="@exo_com_bati_float"/>
-
-
-                                EUR
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R EXO</div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                                <xsl:value-of select="@exo_dep_bati_float"/>
-
-
-                                EUR
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R EXO</div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                                <xsl:value-of select="@exo_reg_bati_float"/>
-
-
-                                EUR
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-                          </xsl:if>
-                        </tr>
-                        
-                        <tr>
-                          
-                          <td>
-                             <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">REV IMPOSABLE</div>
-                          </td>
-                          
-                          <td>
-
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_bati_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">COM</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">DEP</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">R</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                        </tr>
-                        
-                        <tr>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R IMP</div>
-                          </td>
-                          
-                          <td>
-
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_com_bati_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R IMP</div>
-                          </td>
-                          
-                          <td>
-
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_dep_bati_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R IMP</div>
-                          </td>
-                          
-                          <td>
-
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_reg_bati_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                        </tr>
-                      </xsl:for-each>
-                    </tbody>
-                  </table>
-                </div>
-              </td>
-            </tr>
-            <!-- Affichage des proprietes non baties -->
-            
-            <tr>
-              
-              <td>
-                
-                <table table-layout="fixed" width="100%" style="border-collapse: collapse; font-size: 10pt;" CELLSPACING="0" CELLPADDING="0">
-                  <tr>
-                    <td width="2.07%"/>
-                    <td width="5.18%"/>
-                    <td width="4.14%"/>
-                    <td width="4.14%"/>
-                    <xsl:if test="$type='complet'">
-                      <td width="27.26%"/>
-                    </xsl:if>
-                    <xsl:if test="not($type='complet')">
-                      <td width="41.76%"/>
-                    </xsl:if>
-                    <td width="3.11%"/>
-                    <td width="4.83%"/>
-                    <td width="2.07%"/>
-                    <td width="2.07%"/>
-                    <td width="3.11%"/>
-                    <td width="3.80%"/>
-                    <td width="3.45%"/>
-                    <td width="3.11%"/>
-                    <td width="2.42%"/>
-                    <td width="2.42%"/>
-                    <td width="2.42%"/>
-                    <td width="6.9%0"/>
-                    <xsl:if test="$type='complet'">
-                      <td width="3.11%"/>
-                      <td width="2.07%"/>
-                      <td width="2.07%"/>
-                      <td width="5.18%"/>
-                      <td width="2.07%"/>
-                    </xsl:if>
-                    <td width="2.07%"/>
-                  </tr>
-                  <!-- Affichage de l'en-tête des proprietes non baties -->
-                  
-                  <thead>
-                    
-                    <tr>
-                      <xsl:if test="$type='complet'">
-                        <td colspan="23" style="border-color: black; border-style: solid; border-right: hidden; border-left: hidden; border-top: hidden; border-width: 0.5pt; padding-top: 1cm; padding-bottom: 0.1cm;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">PROPRIETES NON BATIES</div>
-                        </td>
-                      </xsl:if>
-                      <xsl:if test="not($type='complet')">
-                        <td colspan="18" style="border-color: black; border-style: solid; border-right: hidden; border-left: hidden; border-top: hidden; border-width: 0.5pt; padding-top: 1cm; padding-bottom: 0.1cm;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">PROPRIETES NON BATIES</div>
-                        </td>
-                      </xsl:if>
-                    </tr>
-                    
-                    <tr>
-                      
-                      <td colspan="6" style="border-color: black; border-style: solid; border-right: hidden; border-width: 0.5pt;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">DESIGNATION DES PROPRIETES</div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td colspan="17" style="border-color: black; border-style: solid; border-left: hidden; border-width: 0.5pt;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">EVALUATION</div>
-                        </td>
-                      </xsl:if>
-                      <xsl:if test="not($type='complet')">
-                        <td colspan="12" style="border-color: black; border-style: solid; border-left: hidden; border-width: 0.5pt;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">EVALUATION</div>
-                        </td>
-                      </xsl:if>
-                    </tr>
-                    
-                    <!-- Affichage des titres des colonnes des proprietes non baties -->
-                    
-                    <tr>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">AN</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">SECTION</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N°PLAN</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">N° Voirie</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">ADRESSE</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">CODE RIVOLI</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">N°PARC PRIM</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">FP DP</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">S TAR</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">SUF</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">GR/SS GR</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">CLASSE</div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">NAT CULT</div>
-                      </td>
-                      
-                      <!-- Creation d'une table pour afficher le titre de colonne (CONTENANCE HA A CA) -->
-                      
-                      <td colspan="3" style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        
-                        <table table-layout="fixed" style="font-size: 8pt; border-collapse: collapse;" width="100%">
-                          <tbody>
-                            
-                            <tr>
-                              <td colspan="3" style="padding-top: 0.05cm;">
-                                <div style="text-align: center; vertical-align: middle; line-height: 0.3cm;">CONTENANCE</div>
-                              </td>
-                            </tr>
-                            
-                            <tr>
-                              
-                              <td width="33%">
-                                <div style="text-align: center; vertical-align: middle; line-height: 0.3cm;">HA</div>
-                              </td>
-                              
-                              <td width="33%">
-                                <div style="text-align: center; vertical-align: middle; line-height: 0.3cm;">A</div>
-                              </td>
-                              
-                              <td width="33%">
-                                <div style="text-align: center; vertical-align: middle; line-height: 0.3cm;">CA</div>
-                              </td>
-                            </tr>
-                          </tbody>
-                        </table>
-                      </td>
-                      
-                      <!-- Suite de l'affichage des titres des colonnes des proprietes non baties -->
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">REVENU CADASTRAL</div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">COLL</div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">NAT EXO</div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">AN RET</div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">FRACTION RC EXO</div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">% EXO</div>
-                        </td>
-                      </xsl:if>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">POS</div>
-                      </td>
-                    </tr>
-                  </thead>
-                  
-                  <tfoot>
-                    
-                    <tr>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div>
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td colspan="3" style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                        </div>
-                      </td>
-
-                      <xsl:if test="$type='complet'">
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                          </div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                          </div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                          </div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                          </div>
-                        </td>
-
-                        <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden; border-left: hidden;">
-                          <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                          </div>
-                        </td>
-                      </xsl:if>
-                      
-                      <td style="border-color: black; border-width: 0.5pt; border-style: solid; border-right: hidden;  border-left: hidden;">
-                        <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                        </div>
-                      </td>
-                    </tr>
-                  </tfoot>
-                  <!-- Affichage des donnees des proprietes non baties -->
-                  
-                  <tbody>
-                    
-                    <tr>
-                      
-                      <td>
-                        <div>
-                        </div>
-                      </td>
-                    </tr>
-                    
-                    <xsl:for-each select="Mj/Mj_Compte_Communal/Mj_Parcelle | Mj/Mj_Compte_Communal_Parcelle/Mj_Parcelle">
-						<xsl:sort select="@section" />
-						<xsl:sort select="@num_plan" data-type="number"/>
-                      <tr>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@date"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-right:0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@section"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@num_plan"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@num_voirie"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-left:0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div vertical-align="middle" line-height="0.5cm">
-                            <xsl:value-of select="@adresse"/>
-                          </div>
-                        </td>
-                        
-                        <td style="padding-left:0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@code_rivoli"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@num_parc_prim"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@fp_dp"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@s_tar"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@suf"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@grss_gr"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@clas"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@nat_cult"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@ha"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@a"/>
-                          </div>
-                        </td>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-                          
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            <xsl:value-of select="@ca"/>
-                          </div>
-                        </td>
-                        
-                        <!-- Affichage de la colonne revenu cadastral lorsqu'il a une seule suf -->
-                        
-                        <xsl:if test="count(Mj_Suf)=1">
-                          
-                          <td style="padding-right:0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="@revenu_cadastral"/>
-                            </div>
-                          </td>
-						   <xsl:if test="$type='complet'">
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                  <xsl:value-of select="Mj_Suf/@nat_exo"/>
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-
-                              <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                                <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                                </div>
-                              </td>
-                            </xsl:if>
-                            <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-                              <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-                              </div>
-                            </td>
-                        </xsl:if>
-                        
-                        <!-- Affichage de la colonne revenu cadastral lorsqu'il a plusieurs sufs -->
-                        
-                        <xsl:if test="count(Mj_Suf) > 1">
-                          
-                          <td style="padding-right:0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-						  <xsl:if test="$type='complet'">
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                              <xsl:value-of select="Mj_Suf/@nat_exo"/>
-                            </div>
-                          </td>
-
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-
-                          <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-                            <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                            </div>
-                          </td>
-                        </xsl:if>
-                        
-                        <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-                          <div style="text-align: center; line-height: 0.5cm; vertical-align: middle;">
-                          </div>
-                        </td>
-                        </xsl:if>
-                        
-                        <!-- Suite de l'affichage des donnees des proprietes non baties -->
-                        
-                      </tr>
-					
-                      <!-- Affichage des Suf lorsqu'il y en a plusieurs -->
-                      <xsl:choose>
-							<xsl:when test="count(Mj_Suf) > 1">
-                        
-								<xsl:for-each select="Mj_Suf">
-								  
-								  <tr>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@s_tar"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@suf"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@grss_gr"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@clas"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@nat_cult"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@ha"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@a"/>
-									  </div>
-									</td>
-									
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden; border-left: hidden;" valign="top">
-									  
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										<xsl:value-of select="@ca"/>
-									  </div>
-									</td>
-									
-									<td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-									  
-									  <div style="text-align: center;line-height: 0.3cm; vertical-align: middle;" >
-										<xsl:value-of select="@revenu_cadastral"/>
-									  </div>
-									</td>
-									<xsl:if test="$type='complet'">
-									  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-										<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										</div>
-									  </td>
-
-									  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-
-										<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										  <xsl:value-of select="@nat_exo"/>
-										</div>
-									  </td>
-
-									  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-										<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										</div>
-									  </td>
-
-									  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-										<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										</div>
-									  </td>
-
-									  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-										<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-										</div>
-									  </td>
-									</xsl:if>
-									<td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-									  <div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-									  </div>
-									</td>
-								  </tr>
-								  <xsl:if test="$type='complet'">
-									<!-- Affichage des Exon_Suf lorsqu'il y en a -->
-									<xsl:if test="count(Mj_Exon_Suf) &gt; 0">
-									  <xsl:for-each select="Mj_Exon_Suf">
-										<tr>
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-right: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-right: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-rigth: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-rigth: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;border-right: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@ccolloc" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@nat_exo" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@pexn div 100" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@rcexnba div 100" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-										</tr>
-									  </xsl:for-each>
-									</xsl:if>
-								  </xsl:if>
-								</xsl:for-each>
-							  </xsl:when>
-							  <xsl:when test="count(Mj_Suf)>0">
-								<xsl:if test="$type='complet'">
-								 <xsl:for-each select="Mj_Suf">
-									<!-- Affichage des Exon_Suf lorsqu'il y en a -->
-									<xsl:if test="count(Mj_Exon_Suf) &gt; 0">
-									  <xsl:for-each select="Mj_Exon_Suf">
-										<tr>
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-right: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-right: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-rigth: hidden; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-rigth: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;border-right: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-left: hidden; padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;border-left: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="padding-right: 0.1cm; border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;" valign="top">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@ccolloc" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@nat_exo" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@pexn div 100" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											  <xsl:value-of select="@rcexnba div 100" />
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-
-										  <td style="border-style: solid; border-width: 0.5pt; border-color: black; border-bottom: hidden; border-top: hidden;">
-											<div style="text-align: center; line-height: 0.3cm; vertical-align: middle;">
-											</div>
-										  </td>
-										</tr>
-									  </xsl:for-each>
-									</xsl:if>
-									</xsl:for-each>
-									</xsl:if>
-								 </xsl:when>
-						</xsl:choose>
-                    </xsl:for-each>
-                  </tbody>
-                </table>
-              </td>
-            </tr>
-            
-            <!-- Affichage du pied du tableau des proprietes non baties -->
-            
-            <tr>
-              
-              <td>
-                
-                <div keep-together="always" keep-with-previous="always">
-                  
-                  <table width="100%" table-layout="fixed" style="border-color: black; border-right: 0.5pt; border-left: 0.5pt; border-top: 0pt; border-bottom: 0.5pt; border-style: solid; border-collapse: collapse; font-size: 8pt; padding-top: 0.2cm; padding-bottom: 0.1cm;">
-
-                    <td width="3.45%" />
-                    <td width="3.45%" />
-                    <td width="3.45%" />
-                    <td width="3.45%" />
-                    <td width="13.46%" />
-                    <td width="6.9%" />
-                    <td width="6.9%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="6.9%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="6.9%" />
-                    <td width="5.18%" />
-                    <td width="6.9%" />
-                    <td width="7.94%" />
-                    
-                    <tbody>
-                      
-                      <xsl:for-each select="Mj/Mj_Compte_Communal | Mj/Mj_Compte_Communal_Parcelle">
-                        
-                        <tr>
-
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">HA</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">A</div>
-                          </td>
-
-                          <td>
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">CA</div>
-                          </td>
-                          <xsl:if test="$type='complet'">
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R EXO</div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                                <xsl:value-of select="@exo_com_par_float"/>
-
-
-                                EUR
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R EXO</div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                                <xsl:value-of select="@exo_tax_ad_par_float"/>
-
-
-                                EUR
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"></div>
-                            </td>
-
-                            <td>
-
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              </div>
-                            </td>
-
-                            <td>
-                              <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                            </td>
-                          </xsl:if>
-                        </tr>
-                        
-                        <tr>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">CONT</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">REV IMPOSABLE</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_par_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">COM</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">TAXE AD</div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;"></div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td padding-right="0.8cm">
-                            <div style="text-align: right; line-height: 0.60cm; vertical-align: middle;">MAJ POS</div>
-                          </td>
-                        </tr>
-                        
-                        <tr>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                            </div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@ha"/>
-                            </div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@a"/>
-                            </div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: center; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@ca"/>
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R IMP</div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_com_par_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">R IMP</div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                              <xsl:value-of select="@rev_impo_taxe_ad_par_float"/>
-
-
-                              EUR
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"></div>
-                          </td>
-                          
-                          <td>
-                            
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;">
-                            </div>
-                          </td>
-                          
-                          <td>
-                            <div style="text-align: right; line-height: 0.20cm; vertical-align: middle;"/>
-                          </td>
-                        </tr>
-                      </xsl:for-each>
-                    </tbody>
-                    
-                    <!-- Fin de la table du pied du tableau des propiétés non baties -->
-                  </table>
-                </div>
-              </td>
-            </tr>
-            <!-- Fin du corps du tableau global -->
-          </tbody>
-          <!-- Fin du tableau global -->
-        </table>
-      </body>
-    </html>
-  </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/commande_fo2html.txt b/web_service/class/majic_lib/xsl/commande_fo2html.txt
deleted file mode 100755
index 53435cedf0c3491c0f763b8f7f306295eecc22fe..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/commande_fo2html.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-fop -xml monxml.xml -xsl mj_fo.xsl -foout res.fo
-fop -xml res.fo -xsl fo2html.xsl -foout res.html
-
-
-C:\serveurs\fop-0.93\fop -xml C:\serveurs\Apache2\htdocs\rgd\fp\2010\complet\740011000AR0497.xml -xsl C:\serveurs\Apache2\htdocs\lib\majic_lib\xsl\FP_fo_Complet.xsl -pdf C:\serveurs\Apache2\htdocs\rgd\fp\2010\complet\740011000AR0497.pdf
\ No newline at end of file
diff --git a/web_service/class/majic_lib/xsl/fo2html.xsl b/web_service/class/majic_lib/xsl/fo2html.xsl
deleted file mode 100755
index a4ca0b5740c2d846731cbd7d9ae1e55b5641b8bc..0000000000000000000000000000000000000000
--- a/web_service/class/majic_lib/xsl/fo2html.xsl
+++ /dev/null
@@ -1,643 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- =============================================================== -->
-<!--                                                                 -->
-<!-- Convert XSL FO (as in REC 2001-10-15) to HTML                    -->
-<!--                                                                 -->
-<!-- © RenderX 2000-2001                                             -->
-<!-- Permission to copy and modify is granted, provided this notice  -->
-<!-- is included in all copies and/or derived work.                  -->
-<!--                                                                 -->
-<!-- Author: Nikolai Grigoriev, grig@renderx.com                     -->
-<!--                                                                 -->
-<!-- =============================================================== -->
-<!DOCTYPE xsl:stylesheet [
-  <!ENTITY anchor "<xsl:apply-templates select='@id' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>">
-  <!ENTITY add-style "<xsl:call-template name='add-style-attribute' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>">
-]>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
-
-<xsl:output method="html" version="4.0" encoding="utf-8" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" indent="no"/>
-
-<!-- =============================================================== -->
-<!-- Root. Create the bone and call templates for each page sequence -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:root">
-  <html>
-    <head>
-      <title>
-        <xsl:choose>
-          <xsl:when test="descendant::fo:title[1]">
-            <xsl:value-of select="fo:title"/>
-          </xsl:when>
-          <xsl:otherwise>XSL FO Document</xsl:otherwise>
-        </xsl:choose>
-      </title>
-      <META http-equiv="Content-Style-Type" content="text/css"/>
-      <style type="text/css">
-        a { color: black; border: none; text-decoration: none; }
-        img { border: none; }
-      </style>
-    </head>
-
-    <body bgcolor="white" marginwidth="6" marginheight="6" leftmargin="6" topmargin="6">
-      <xsl:apply-templates select="fo:page-sequence"/>
-    </body>
-  </html>
-
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:page-sequence. Draws a header before and a footer after.     -->
-<!-- Sidebars are skipped: there's no way to rotate the text in HTML -->
-<!-- and horizontal text in the sidebars eats up too much space.     -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:page-sequence">
-
-    <xsl:variable name="current-master"><xsl:value-of select="@master-reference"/></xsl:variable>
-
-    <!-- One page master will be used for the whole page sequence -->
-    <xsl:variable name="page-master-name">
-      <xsl:choose>
-        <xsl:when test="../fo:layout-master-set/fo:simple-page-master[@master-name=$current-master]">
-          <!-- specified master is a page master: use it -->
-          <xsl:value-of select="$current-master"/>
-        </xsl:when>
-        <xsl:otherwise>
-          <!-- specified master is a page sequence master: -->
-          <!-- find master name for the first page -->
-          <xsl:apply-templates select="../fo:layout-master-set/fo:page-sequence-master[@master-name=$current-master]"/>
-        </xsl:otherwise>
-      </xsl:choose>
-    </xsl:variable>
-
-    <!-- Load the page master into a variable. No problem if it's null; should work the same ;-) -->
-    <xsl:variable name="page-master" select="../fo:layout-master-set/fo:simple-page-master[@master-name=$page-master-name]"/>
-
-
-    <!-- Start real drawing -->
-    <br/>  <!-- make an offset before each page sequence -->
-
-    <!-- Header -->
-    <xsl:variable name="header-region" select="$page-master/fo:region-before"/>
-    <xsl:apply-templates select="fo:static-content[@flow-name = $header-region/@region-name                               or (@flow-name='xsl-region-before' and not($header-region/@region-name))]">
-      <xsl:with-param name="region" select="$header-region"/>
-    </xsl:apply-templates>
-
-    <!-- Body -->
-    <xsl:apply-templates select="fo:flow">
-      <xsl:with-param name="region" select="$page-master/fo:region-body"/>
-    </xsl:apply-templates>
-
-    <!-- Footer -->
-    <xsl:variable name="footer-region" select="$page-master/fo:region-after"/>
-    <xsl:apply-templates select="fo:static-content[@flow-name = $footer-region/@region-name                               or (@flow-name='xsl-region-after' and not($footer-region/@region-name))]">
-      <xsl:with-param name="region" select="$footer-region"/>
-    </xsl:apply-templates>
-
-    <br/>  <!-- make an offset after each page sequence -->
-
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:block                                                        -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:block">
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><div><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates mode="check-for-pre"/></div>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:inline-sequence                                              -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:inline | fo:wrapper">
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><span><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates/></span>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:list-block                                                   -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:list-block">
-  <xsl:variable name="label-separation">
-    <xsl:choose>
-      <xsl:when test="@provisional-label-separation">
-        <xsl:apply-templates select="@provisional-label-separation" mode="convert-to-pixels"/>
-      </xsl:when>
-      <xsl:otherwise>8</xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
-  <xsl:variable name="body-offset">
-    <xsl:choose>
-      <xsl:when test="@provisional-distance-between-starts">
-        <xsl:apply-templates select="@provisional-distance-between-starts" mode="convert-to-pixels"/>
-      </xsl:when>
-      <xsl:otherwise>32</xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
-  <div><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <table width="100%">
-      <xsl:apply-templates select="fo:list-item | fo:list-item-label">
-        <xsl:with-param name="label-width" select="$body-offset - $label-separation"/>
-        <xsl:with-param name="gap-width" select="$label-separation"/>
-      </xsl:apply-templates>
-    </table>
-  </div>
-
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:list-item                                                    -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:list-item">
-  <xsl:param name="label-width"/>
-  <xsl:param name="gap-width"/>
-
-  <tr><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates select="fo:list-item-label" mode="draw-cell">
-       <xsl:with-param name="width" select="$label-width"/>
-    </xsl:apply-templates>
-    <xsl:if test="$gap-width &gt; 0">
-      <td width="{$gap-width}"> </td>
-    </xsl:if>
-
-    <xsl:apply-templates select="fo:list-item-body" mode="draw-cell"/>
-  </tr>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:list-item-label - itemless lists                             -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:list-block/fo:list-item-label">
-  <xsl:param name="label-width"/>
-  <xsl:param name="gap-width"/>
-
-  <tr>
-    <xsl:apply-templates select="." mode="draw-cell">
-       <xsl:with-param name="width" select="$label-width"/>
-    </xsl:apply-templates>
-    <xsl:if test="$gap-width &gt; 0">
-      <td width="{$gap-width}"> </td>
-    </xsl:if>
-
-    <xsl:apply-templates select="following-sibling::fo:list-item-body[1]" mode="draw-cell"/>
-  </tr>
-</xsl:template>
-
-
-<!-- =============================================================== -->
-<!-- fo:list-item-body - itemless lists                              -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:list-item-label | fo:list-item-body" mode="draw-cell">
-  <xsl:param name="width" select="'auto'"/>
-  <td valign="top"><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:if test="$width != 'auto'">
-      <xsl:attribute name="width">
-        <xsl:value-of select="$width"/>
-      </xsl:attribute>
-    </xsl:if>
-
-    <xsl:apply-templates mode="check-for-pre"/>
-  </td>
-</xsl:template>
-
-
-<!-- =============================================================== -->
-<!-- fo:table and its components                                     -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:table">
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-  <table><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:if test="not(@display-align)">
-      <xsl:attribute name="valign">top</xsl:attribute>
-	  <xsl:attribute name="width">100%</xsl:attribute>
-	  <xsl:attribute name="CELLSPACING">0</xsl:attribute>
-	  <xsl:attribute name="CELLPADDING">0</xsl:attribute>
-    </xsl:if>
-
-    <xsl:apply-templates/>
-  </table>
-</xsl:template>
-
-<xsl:template match="fo:table-header">
-  <thead><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates/>
-  </thead>
-</xsl:template>
-
-<xsl:template match="fo:table-footer">
-  <tfoot><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates/>
-  </tfoot>
-</xsl:template>
-
-<xsl:template match="fo:table-body">
-  <tbody><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates/>
-  </tbody>
-</xsl:template>
-
-<xsl:template match="fo:table-row">
-  <tr><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates mode="display"/>
-  </tr>
-</xsl:template>
-
-<xsl:template match="fo:table-cell" mode="display">
-  <td><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:if test="not(@display-align)">
-      <xsl:attribute name="valign">top</xsl:attribute>
-	  <!-- <xsl:attribute name="style">border-right:true</xsl:attribute>-->
-    </xsl:if>
-	
-    <xsl:apply-templates select="@*" mode="get-table-attributes"/>
-    <xsl:apply-templates mode="check-for-pre"/>
-  </td>
-</xsl:template>
-
-<xsl:template match="fo:table-cell" priority="-1"/>
-
-<!-- This template accounts for "rowless" tables -->
-<xsl:template priority="1" match="fo:table-cell[not(parent::fo:table-row)]               [not(preceding-sibling::fo:table-cell) or @starts-row='true'                or preceding-sibling::fo:table-cell[1][@ends-row='true']]">
-  <tr>
-    <xsl:call-template name="enumerate-rowless-cells"/>
-  </tr>
-</xsl:template>
-
-<xsl:template name="enumerate-rowless-cells">
-  <xsl:apply-templates select="." mode="display"/>
-  <xsl:if test="not(@ends-row='true')">
-    <xsl:for-each select="following-sibling::fo:table-cell[1]                           [not(@starts-row='true')]">
-      <xsl:call-template name="enumerate-rowless-cells"/>
-    </xsl:for-each>
-  </xsl:if>
-</xsl:template>
-
-
-<!-- =============================================================== -->
-<!-- fo:inline-graphic                                               -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:external-graphic">
-  <xsl:variable name="cleaned-url">
-    <xsl:apply-templates select="@src" mode="unbracket-url"/>
-  </xsl:variable>
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><img src="{$cleaned-url}"><xsl:apply-templates select="@height|@width|@*[starts-with(name(),'border')]"/></img>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- fo:basic-link                                                  -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:basic-link[@external-destination]">
-
-  <xsl:variable name="cleaned-url">
-    <xsl:apply-templates select="@external-destination" mode="unbracket-url"/>
-  </xsl:variable>
-
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><a href="{$cleaned-url}"><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates/></a>
-</xsl:template>
-
-<xsl:template match="fo:basic-link[@internal-destination]">
-  <xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><a href="#{@internal-destination}"><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates/></a>
-</xsl:template>
-
-
-<!-- =============================================================== -->
-<!-- fo:marker/fo:retrieve-marker                                    -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:marker"/>
-<xsl:template match="fo:marker" mode="retrieve-marker">
-  <xsl:apply-templates/>
-</xsl:template>
-
-<xsl:template match="fo:retrieve-marker">
-
-  <xsl:variable name="class-name" select="@retrieve-class-name"/>
-  <xsl:variable name="matching-markers" select="ancestor::fo:page-sequence/descendant::fo:marker[@marker-class-name=$class-name]"/>
-
-  <xsl:choose>
-    <xsl:when test="@retrieve-position='last-starting-within-page'                  or @retrieve-position='last-ending-within-page'">
-      <xsl:apply-templates select="$matching-markers[position()=last()]" mode="retrieve-marker"/>
-    </xsl:when>
-    <xsl:otherwise>
-      <xsl:apply-templates select="$matching-markers[1]" mode="retrieve-marker"/>
-    </xsl:otherwise>
-  </xsl:choose>
-
-</xsl:template>
-
-
-
-
-
-<!-- *************************************************************** -->
-<!-- Treatment of attributes that are either identical to their CSS1 -->
-<!-- counterparts, of find an equivalent expression there            -->
-
-<!-- =============================================================== -->
-<!-- Default rule: copy CSS1 attributes and suppress all other       -->
-<!-- =============================================================== -->
-
-<xsl:template match="@*" priority="-2" mode="collect-style-attributes"/>
-
-<xsl:template match="@color |                      @background |                      @background-color |                      @background-image |                      @background-position |                      @background-repeat |                      @padding |                      @padding-top |                      @padding-bottom |                      @padding-right |                      @padding-left |                      @margin |                      @margin-top |                      @margin-bottom |                      @margin-right |                      @margin-left |                      @border |                     @border-width |                      @border-top-width |                      @border-bottom-width |                      @border-right-width |                      @border-left-width |                      @border-color |                      @border-top-color |                      @border-bottom-color |                      @border-right-color |                      @border-left-color |                      @border-style |                      @border-top-style |                      @border-bottom-style |                      @border-right-style |                      @border-left-style |                      @letter-spacing |                      @word-spacing |                      @line-height |                      @font |                      @font-family |                      @font-size |                      @font-weight |                      @font-style |                      @font-variant |                      @vertical-align |                      @text-decoration |                      @text-indent |                      @text-transform" mode="collect-style-attributes">
-  <xsl:value-of select="name()"/>
-  <xsl:text>: </xsl:text>
-  <xsl:value-of select="."/>
-  <xsl:text>; </xsl:text>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Some attributes deserve special treatment -->
-
-<xsl:template match="@text-align" mode="collect-style-attributes">
-  <xsl:text>text-align: </xsl:text>
-  <xsl:choose>
-    <xsl:when test=".='start' or .='inside'">left</xsl:when>
-    <xsl:when test=".='end' or .='outside'">right</xsl:when>
-    <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
-  </xsl:choose>
-  <xsl:text>; </xsl:text>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Handling writing-mode in borders, padding, and margins          -->
-<!-- This version presumes lr-tb writing mode only.                  -->
-
-<xsl:template match="@space-before.optimum |                      @space-before [not (../@space-before.optimum)] |                      @space-before.minimum [not (../@space-before.optimum) and not (../@space-before)] |                      @space-before.maximum [not (../@space-before.optimum) and not (../@space-before) and not (../@space-before.minimum)] |                      @space-after.optimum |                      @space-after [not (../@space-after.optimum)] |                      @space-after.minimum [not (../@space-after.optimum) and not (../@space-after)] |                      @space-after.maximum [not (../@space-after.optimum) and not (../@space-after) and not (../@space-after.minimum)] |                      @space-start.optimum |                      @space-start [not (../@space-start.optimum)] |                      @space-start.minimum [not (../@space-start.optimum) and not (../@space-start)] |                      @space-start.maximum [not (../@space-start.optimum) and not (../@space-start) and not (../@space-start.minimum)] |                      @space-end.optimum |                      @space-end [not (../@space-end.optimum)] |                      @space-end.minimum [not (../@space-end.optimum) and not (../@space-end)] |                      @space-end.maximum [not (../@space-end.optimum) and not (../@space-end) and not (../@space-end.minimum)] |                      @start-indent[not(parent::fo:list-item-body)] |                      @end-indent[not(parent::fo:list-item-label)] |                      @padding-before |                      @padding-before.length |                      @margin-before |                      @border-before |                      @border-before-width |                      @border-before-width.length |                      @border-before-color |                      @border-before-style |                      @padding-after |                      @padding-after.length |                      @margin-after |                      @border-after |                      @border-after-width |                      @border-after-width.length |                      @border-after-color |                      @border-after-style |                      @padding-start |                      @padding-start.length |                      @margin-start |                      @border-start |                      @border-start-width |                      @border-start-width.length |                      @border-start-color |                      @border-start-style |                      @padding-end |                      @padding-end.length |                      @margin-end |                      @border-end |                      @border-end-width |                      @border-end-width.length |                      @border-end-color |                      @border-end-style" mode="collect-style-attributes">
-
-  <xsl:variable name="property">
-    <xsl:choose>
-      <xsl:when test="starts-with(name(), 'border')">border</xsl:when>
-      <xsl:when test="starts-with(name(), 'padding')">padding</xsl:when>
-      <xsl:when test="starts-with(name(), 'margin')">margin</xsl:when>
-      <xsl:when test="starts-with(name(), 'space')">margin</xsl:when>
-      <xsl:when test="contains(name(), '-indent')">margin</xsl:when>
-    </xsl:choose>
-  </xsl:variable>
-
-  <xsl:variable name="side">
-    <xsl:choose>
-      <xsl:when test="contains(name(), '-before') or contains(name(), '-top')">-top</xsl:when>
-      <xsl:when test="contains(name(), '-after') or contains(name(), '-bottom')">-bottom</xsl:when>
-      <xsl:when test="contains(name(), '-start') or starts-with(name(), 'start-') or contains(name(), '-left')">-left</xsl:when>
-      <xsl:when test="contains(name(), '-end') or starts-with(name(), 'end-') or contains(name(), '-right')">-right</xsl:when>
-    </xsl:choose>
-  </xsl:variable>
-
-  <xsl:variable name="parameter">
-    <xsl:choose>
-      <xsl:when test="contains(name(), '-width')">-width</xsl:when>
-      <xsl:when test="contains(name(), '-color')">-color</xsl:when>
-      <xsl:when test="contains(name(), '-style')">-style</xsl:when>
-    </xsl:choose>
-  </xsl:variable>
-
-  <xsl:value-of select="concat($property, $side, $parameter)"/>
-  <xsl:text>: </xsl:text>
-  <xsl:value-of select="."/>
-  <xsl:text>; </xsl:text>
-</xsl:template>
-
-<xsl:template match="*" mode="check-for-pre" priority="-1">
-  <xsl:apply-templates select="."/>
-</xsl:template>
-
-<xsl:template match="*[@white-space-collapse='false'                     or @linefeed-treatment='preserve'                     or @wrap-option='no-wrap'                     or @white-space='pre']" mode="check-for-pre">
-  <pre><xsl:apply-templates select="."/></pre>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Recalculate a length to pixels. 1 in = 96 px, 1 em = 1 pc;      -->
-<!-- this gives reasonable results for 800x600 and 1024x768 screens  -->
-<!-- =============================================================== -->
-
-<xsl:template match="@*" mode="convert-to-pixels">
-  <xsl:variable name="scaling-factor">
-    <xsl:choose>
-      <xsl:when test="contains (., 'pt')">1.33</xsl:when>
-      <xsl:when test="contains (., 'px')">1</xsl:when>
-      <xsl:when test="contains (., 'pc')">16</xsl:when>
-      <xsl:when test="contains (., 'in')">96</xsl:when>
-      <xsl:when test="contains (., 'cm')">37.8</xsl:when>
-      <xsl:when test="contains (., 'mm')">3.78</xsl:when>
-      <xsl:when test="contains (., 'em')">16</xsl:when> <!-- guess: 1em = 12pt -->
-      <xsl:otherwise>1</xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
-  <xsl:variable name="numeric-value" select="translate (., '-0123456789.ptxcinme', '-0123456789.')"/>
-  <xsl:value-of select="$numeric-value * $scaling-factor"/>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Remove brackets & quotes around URLs                            -->
-<!-- =============================================================== -->
-
-<xsl:template match="@*" mode="unbracket-url">
-  <xsl:variable name="href" select="normalize-space(.)"/>
-
-  <xsl:choose>
-    <xsl:when test="(starts-with($href, 'url(') or starts-with($href, 'url ('))                      and substring ($href, string-length($href)) = ')'">
-      <!-- Remove 'url' from the beginning -->
-      <xsl:variable name="bracketed" select="normalize-space(substring($href, 4))"/>
-      <!-- Remove brackets -->
-      <xsl:variable name="quoted" select="normalize-space(substring($bracketed, 2, string-length ($bracketed) - 2 ))"/>
-
-      <xsl:variable name="q" select="'&quot;'"/>
-      <xsl:variable name="a" select="&quot;'&quot;"/>
-      <!-- Remove optional quotes -->
-      <xsl:choose>
-        <xsl:when test="( substring($quoted, 1, 1) = $q and                           substring($quoted, string-length($quoted), 1) = $q )                      or ( substring($quoted, 1, 1) = $a and                           substring($quoted, string-length($quoted), 1) = $a )">
-          <xsl:value-of select="substring($quoted, 2, string-length($quoted) - 2)"/>
-        </xsl:when>
-        <xsl:otherwise><xsl:value-of select="$quoted"/></xsl:otherwise>
-      </xsl:choose>
-    </xsl:when>
-    <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Page number - replace by a bullet                               -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:page-number | fo:page-number-citation">
-  <span><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:text>&#8226;</xsl:text></span>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Leader - replace by a space                                     -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:leader">
-  <xsl:text>     </xsl:text>
-</xsl:template>
-
-
-
-<!-- =============================================================== -->
-<!-- Static content - add a <hr/> before or after it                 -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:flow | fo:static-content">
-  <xsl:param name="region"/>
-
-  <div><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates select="$region"/>
-    <xsl:apply-templates/>
-    <xsl:if test=".//fo:footnote">
-      <br/><hr/>
-      <xsl:apply-templates select=".//fo:footnote" mode="after-text"/>
-    </xsl:if>
-  </div>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Footnotes                                                       -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:footnote">
-  <xsl:apply-templates select="fo:inline"/>
-</xsl:template>
-
-<xsl:template match="fo:footnote" mode="after-text">
-  <div><xsl:call-template name="add-style-attribute" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/><xsl:apply-templates select="@id" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
-    <xsl:apply-templates select="fo:footnote-body"/>
-  </div>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Copy all CSS1-compatible attributes to "style" property         -->
-<!-- =============================================================== -->
-
-<xsl:template name="add-style-attribute">
-  <xsl:param name="orientation" select="0"/>
-  <xsl:variable name="style">
-    <xsl:apply-templates select="@*" mode="collect-style-attributes"/>
-  </xsl:variable>
-
-  <xsl:if test="string-length($style) &gt; 0">
-    <xsl:attribute name="style"><xsl:value-of select="normalize-space($style)"/></xsl:attribute>
-  </xsl:if>
-</xsl:template>
-
-<!-- =============================================================== -->
-<!-- Create an anchor                                                -->
-<!-- =============================================================== -->
-
-<xsl:template match="@id"><a name="{.}"/></xsl:template>
-
-<!-- =============================================================== -->
-<!-- Table cell geometry                                             -->
-<!-- =============================================================== -->
-
-<xsl:template match="@*" mode="get-table-attributes" priority="-1"/>
-
-<xsl:template match="@number-columns-spanned" mode="get-table-attributes">
-  <xsl:attribute name="colspan"><xsl:value-of select="."/></xsl:attribute>
-</xsl:template>
-
-<xsl:template match="@number-rows-spanned" mode="get-table-attributes">
-  <xsl:attribute name="rowspan"><xsl:value-of select="."/></xsl:attribute>
-</xsl:template>
-
-
-
-<!-- =============================================================== -->
-<!-- Page layout: determine master name for the first page           -->
-<!-- =============================================================== -->
-
-<xsl:template match="fo:page-sequence-master">
-  <xsl:apply-templates select="*[1]"/>
-</xsl:template>
-
-<xsl:template match="fo:single-page-master-reference                    | fo:repeatable-page-master-reference">
-  <xsl:value-of select="@master-reference"/>
-</xsl:template>
-
-<xsl:template match="fo:repeatable-page-master-alternatives">
-  <xsl:choose>
-    <xsl:when test="fo:conditional-page-master-reference[@page-position='first']">
-      <xsl:value-of select="fo:conditional-page-master-reference[@page-position='first'][1]/@master-reference"/>
-    </xsl:when>
-    <xsl:when test="fo:conditional-page-master-reference[@odd-or-even='odd' and not (@blank-or-not-blank='blank')]">
-      <xsl:value-of select="fo:conditional-page-master-reference[@odd-or-even='odd' and not (@blank-or-not-blank='blank')][1]/@master-reference"/>
-    </xsl:when>
-    <xsl:when test="fo:conditional-page-master-reference[not(@odd-or-even='even') and not (@blank-or-not-blank='blank')]">
-      <xsl:value-of select="fo:conditional-page-master-reference[not(@odd-or-even='even') and not (@blank-or-not-blank='blank')][1]/@master-reference"/>
-    </xsl:when>
-    <xsl:otherwise> <!-- cannot guess; take the first -->
-      <xsl:value-of select="fo:conditional-page-master-reference[1]/@master-reference"/>
-    </xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-
-<!-- =============================================================== -->
-<!-- Header/footer properties                                        -->
-<!-- =============================================================== -->
-
-
-<xsl:template match="@extent">
-  <xsl:attribute name="width"><xsl:apply-templates select="." mode="convert-to-pixels"/></xsl:attribute>
-</xsl:template>
-
-<xsl:template match="@width | @height">
-  <xsl:attribute name="{name()}"><xsl:apply-templates select="." mode="convert-to-pixels"/></xsl:attribute>
-</xsl:template>
-
-<xsl:template match="fo:region-before | fo:region-after">
-  <xsl:call-template name="get-area-attributes"/>
-
-  <!-- For header and footer, we suppress margins and padding -->
-  <xsl:variable name="style">
-    <xsl:apply-templates select="@*[not (starts-with (name(), 'margin')                           or starts-with (name(), 'space')                           or starts-with (name(), 'padding'))]" mode="collect-style-attributes">
-      <xsl:with-param name="orientation" select="@reference-orientation"/>
-    </xsl:apply-templates>
-  </xsl:variable>
-
-  <xsl:if test="string-length($style) &gt; 0">
-    <xsl:attribute name="style"><xsl:value-of select="normalize-space($style)"/></xsl:attribute>
-  </xsl:if>
-
-</xsl:template>
-
-<xsl:template match="fo:region-body">
-  <xsl:call-template name="get-area-attributes"/>
-
-  <!-- For region-body, we suppress margin attributes -->
-  <xsl:variable name="style">
-    <xsl:apply-templates select="@*[not (starts-with (name(), 'margin')                           or starts-with (name(), 'space'))]" mode="collect-style-attributes">
-      <xsl:with-param name="orientation" select="@reference-orientation"/>
-    </xsl:apply-templates>
-  </xsl:variable>
-
-  <xsl:if test="string-length($style) &gt; 0">
-    <xsl:attribute name="style"><xsl:value-of select="normalize-space($style)"/></xsl:attribute>
-  </xsl:if>
-</xsl:template>
-
-<xsl:template match="fo:region-start | fo:region-end"/>
-
-<xsl:template name="get-area-attributes">
-  <xsl:attribute name="valign">
-    <xsl:choose>
-      <xsl:when test="@display-align"><xsl:value-of select="@display-align"/></xsl:when>
-      <xsl:otherwise>top</xsl:otherwise>
-    </xsl:choose>
-  </xsl:attribute>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/web_service/conf/properties.inc b/web_service/conf/properties.inc
new file mode 100755
index 0000000000000000000000000000000000000000..f21d672f35ce9422a3c58ad6d0234300c1e02950
--- /dev/null
+++ b/web_service/conf/properties.inc
@@ -0,0 +1,20 @@
+<?php
+$properties["fop_root_dir"] = $properties['vas_home'].'/server/fop';
+$properties['phantomjs_root_path'] = $properties['vas_home'].'/server/phantomjs/bin/phantomjs';
+$properties['printserver_alias'] = 'printserver[ENV]';
+$properties["api_veremap"] = '';
+$properties["vmap"]["wmsTilesWidth"] = 512;
+$properties["vmap"]["wmsTilesHeight"] = 512;
+$properties['popup']['style'] = 'max-height: 350px;<return>max-width: 350px;<return>min-height: 100px;<return>min-width: 200px;';
+$properties["vmap"]["layers_collapsed"] = false;
+$properties["vmap"]["layerstree_collapsed"] = false;
+$properties["vmap"]["layersorder_collapsed"] = true;
+$properties["vmap"]["legend_collapsed"] = false;
+$properties['controls']['active_controls'] = 'Attribution|MousePosition|CurrentProjection|MapName|Scale|ScaleLine|OverviewMap|Zoom|ZoomSlider|RefreshSocket';
+$properties["selection"]["limit_popup"] = 1;
+$properties["selection"]["limit_list"] = 50;
+$properties['snapping']['defaut_limit'] = 2000;
+$properties['snapping']['defaut_tolerance'] = 15;
+$properties['snapping']['defaut_visibility'] = false;
+$properties['snapping']['defaut_snapp_mode'] = 'segment_edge_node';
+?>
diff --git a/web_service/conf/properties_server.inc b/web_service/conf/properties_server.inc
new file mode 100644
index 0000000000000000000000000000000000000000..5daa05566dab4546372c352ed9b8dba1d965ac3b
--- /dev/null
+++ b/web_service/conf/properties_server.inc
@@ -0,0 +1,18 @@
+<?php
+$properties['schema_vmap'] = 's_vmap';
+$properties['use_proxy_for_tiles'] = false;
+$properties["cadastre"]["api"] = "cadastreV2";
+$properties['print']['equality_timeout'] = 1000;
+$properties['print']['tile_size'] = 1024;
+$properties['print']['features_zoom'] = 100;
+$properties['print']['quality'] = 100;
+$properties["use_veremap_api"] = false;
+$properties["use_vm4ms_api"] = true;
+$properties["owner_login"] = $properties["vitis_owner_login"];
+$properties["owner_pass"] = $properties["vitis_owner_pass"];
+$properties['vmap_log_dir'] = "{$properties['vas_home']}/log/vmap";
+$properties['vmap_map_log_file'] = $properties['vmap_log_dir'] . '/map/' . date($properties["log_period"]) . '/map.log';
+$properties['vmap_geocoders'] = '{"osm":{"title":"OpenStreetMap","url":"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&limit=[limit]&extratags=1&namedetails=1&polygon_geojson=1&countrycodes=fr&q=[search]","data_field":"data","title_field":"display_name","geojson_field":"geojson","summary_fields":[{"key":"address.country","label":"Pays"},{"key":"address.state","label":"Région"},{"key":"address.postcode","label":"Code postal"},{"key":"extratags.population","label":"Population"}]},"national_adresse":{"title":"Base nationale","url":"https://api-adresse.data.gouv.fr/search/?q=[search]&limit=[limit]","data_field":"data.features","title_field":"properties.label","geojson_field":"geometry","summary_fields":[{"key":"properties.context","label":"Département"},{"key":"properties.city","label":"Ville"},{"key":"properties.postcode","label":"Code postal"}]}}';
+$properties['vmap_default_geocoders'] = 'osm';
+$properties['vmap_history_timer'] = 0;
+?>
diff --git a/web_service/conf/selected_properties.inc b/web_service/conf/selected_properties.inc
new file mode 100644
index 0000000000000000000000000000000000000000..51094a4a35be058e5f8ebbbbce0e2d02330c0f6c
--- /dev/null
+++ b/web_service/conf/selected_properties.inc
@@ -0,0 +1,46 @@
+<?php
+
+$aAdminFields = Array(
+    'fop_root_dir',
+    'phantomjs_root_path',
+    'schema_vmap',
+    'printserver_alias',
+    'api_veremap',
+    'use_veremap_api',
+    'use_vm4ms_api',
+    'vmap.*',
+    'popup.*',
+    'controls.*',
+    'selection.*',
+    'snapping.*',
+    'print.*',
+    'cadastre.api',
+    'vmap_geocoders',
+    'vmap_default_geocoders',
+    'use_proxy_for_tiles',
+    'vmap_export.*',
+    'vmap_history_timer'
+);
+$aUserFields = Array(
+    'phantomjs_root_path',
+    'printserver_alias',
+    'api_veremap',
+    'use_veremap_api',
+    'use_vm4ms_api',
+    'vmap.*',
+    'popup.*',
+    'controls.*',
+    'selection.*',
+    'snapping.*',
+    'print.*',
+    'cadastre.api',
+    'vmap_geocoders',
+    'vmap_default_geocoders',
+    'use_proxy_for_tiles',
+    'vmap_export.*',
+    'vmap_history_timer'
+);
+
+$properties['aAdminFields'] = array_merge($properties['aAdminFields'], $aAdminFields);
+$properties['aUserFields'] = array_merge($properties['aUserFields'], $aUserFields);
+?>
diff --git a/web_service/conf/version.inc b/web_service/conf/version.inc
index eedb3a0e0513a5ef8b2349e807e833b9c2611598..b9368c689a0a383e84b4056d5413b8f3907ca79a 100755
--- a/web_service/conf/version.inc
+++ b/web_service/conf/version.inc
@@ -1,5 +1,5 @@
 <?php
-// Numéro de la version de cadastre
+// Numéro de la version de Vmap
 define ("VM_VERSION", "[VERSION]");
 define ("VM_BUILD", "[BUILD]");
 define ("VM_MONTH_YEAR", "[MONTH_YEAR]");
diff --git a/web_service/public/images/imagettes/aerial-with-labels.png b/web_service/public/images/imagettes/aerial-with-labels.png
new file mode 100755
index 0000000000000000000000000000000000000000..43b8fc657822000799f3135d01f75d2c40579634
Binary files /dev/null and b/web_service/public/images/imagettes/aerial-with-labels.png differ
diff --git a/web_service/public/images/imagettes/aerial.png b/web_service/public/images/imagettes/aerial.png
new file mode 100755
index 0000000000000000000000000000000000000000..884dd82c67b2a9250f6e5e838b3a04421d67cb69
Binary files /dev/null and b/web_service/public/images/imagettes/aerial.png differ
diff --git a/web_service/public/images/imagettes/cadastre.jpg b/web_service/public/images/imagettes/cadastre.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..6987ff7c7c80fa60b375e42d7317fdf1b467fd83
Binary files /dev/null and b/web_service/public/images/imagettes/cadastre.jpg differ
diff --git a/web_service/public/images/imagettes/landscape-294.png b/web_service/public/images/imagettes/landscape-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..061dfe711dce62dd394bebebea1b86c255e01f8c
Binary files /dev/null and b/web_service/public/images/imagettes/landscape-294.png differ
diff --git a/web_service/public/images/imagettes/opencyclemap.png b/web_service/public/images/imagettes/opencyclemap.png
new file mode 100755
index 0000000000000000000000000000000000000000..7c6b126883d984cfac4276e9fdca99e73dc99c43
Binary files /dev/null and b/web_service/public/images/imagettes/opencyclemap.png differ
diff --git a/web_service/public/images/imagettes/osm.png b/web_service/public/images/imagettes/osm.png
new file mode 100755
index 0000000000000000000000000000000000000000..10ffb41190a4f008634eb1043912e078ed1720ec
Binary files /dev/null and b/web_service/public/images/imagettes/osm.png differ
diff --git a/web_service/public/images/imagettes/outdoors-294.png b/web_service/public/images/imagettes/outdoors-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..d006a4ea4bc7a4918bec8321275cc79a286139a6
Binary files /dev/null and b/web_service/public/images/imagettes/outdoors-294.png differ
diff --git a/web_service/public/images/imagettes/road.png b/web_service/public/images/imagettes/road.png
new file mode 100755
index 0000000000000000000000000000000000000000..82b3f1af24e842d09306464eca1c067871fd72db
Binary files /dev/null and b/web_service/public/images/imagettes/road.png differ
diff --git a/web_service/public/images/imagettes/seamap.png b/web_service/public/images/imagettes/seamap.png
new file mode 100755
index 0000000000000000000000000000000000000000..bf90482bebf8cf33326b5649f3f63d34a8abdc60
Binary files /dev/null and b/web_service/public/images/imagettes/seamap.png differ
diff --git a/web_service/public/images/imagettes/transport-294.png b/web_service/public/images/imagettes/transport-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..289d73f438b99d74fc45f42d0d5208ecf5b326f5
Binary files /dev/null and b/web_service/public/images/imagettes/transport-294.png differ
diff --git a/web_service/public/images/imagettes/transport-dark-294.png b/web_service/public/images/imagettes/transport-dark-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..5cf337d0c5775524bcbddbda2c9e5b087b5294e7
Binary files /dev/null and b/web_service/public/images/imagettes/transport-dark-294.png differ
diff --git a/web_service/sql/sqlQueries.xml b/web_service/sql/sqlQueries.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e96354f4c9b16f78e67a075817424635d108985e
--- /dev/null
+++ b/web_service/sql/sqlQueries.xml
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<sqlQueries>
+	<title>Scripts d'installation et de mises à jour de la base du VAS</title>
+	<queriesCollection>
+		<query>
+			<type>init</type>
+			<version>2016.01.00</version>
+			<code>
+				<![CDATA[
+				select s_vitis.create_role_if_not_exists('vmap_user', 'NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION');
+				select s_vitis.create_role_if_not_exists('vmap_admin', 'NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION');
+				GRANT vmap_user TO vmap_admin;
+				CREATE SCHEMA s_vmap AUTHORIZATION u_vitis;
+				GRANT ALL ON SCHEMA s_vmap TO u_vitis;
+				GRANT USAGE ON SCHEMA s_vmap TO vmap_admin;
+				GRANT USAGE ON SCHEMA s_vmap TO vmap_user;
+				CREATE SEQUENCE s_vmap.seq_common INCREMENT BY 1 MINVALUE 1 NO MAXVALUE START WITH 1;
+				ALTER TABLE s_vmap.seq_common OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.seq_common TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.seq_common TO vmap_user;
+				CREATE TABLE s_vmap.version(   version character varying(10) NOT NULL,    build integer NOT NULL,    date timestamp with time zone NOT NULL,    active boolean,  CONSTRAINT pk_version PRIMARY KEY (version));
+				ALTER TABLE s_vmap.version  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.version TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.version TO vmap_user;
+				CREATE TABLE s_vmap.rt_service_type (service_type_id varchar(30) NOT NULL, CONSTRAINT rt_service_type_pkey PRIMARY KEY (service_type_id));
+				ALTER TABLE s_vmap.rt_service_type  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.rt_service_type TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.rt_service_type TO vmap_user;
+				COMMENT ON COLUMN s_vmap.rt_service_type.service_type_id IS 'tilewms, bing, osm etc...';
+				CREATE TABLE s_vmap.service (service_id int4 DEFAULT nextval('s_vmap.seq_common') NOT NULL, service_type_id varchar(30) NOT NULL, name varchar(100), description text, url text, "key" varchar(255), service_type_version varchar(20), thumbnail text, lang varchar(100), imagery varchar(100), CONSTRAINT service_pkey PRIMARY KEY (service_id));
+				ALTER TABLE s_vmap.service  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.service TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.service TO vmap_user;
+				COMMENT ON COLUMN s_vmap.service.service_id IS 'service name';
+				COMMENT ON COLUMN s_vmap.service.service_type_id IS 'tilewms, bing, osm etc...';
+				COMMENT ON COLUMN s_vmap.service.description IS 'service description';
+				COMMENT ON COLUMN s_vmap.service.url IS 'service url';
+				COMMENT ON COLUMN s_vmap.service."key" IS 'service key (bing maps, geoportail etc..)';
+				COMMENT ON COLUMN s_vmap.service.service_type_version IS 'wms version (ex: "1.1.0")';
+				CREATE TABLE s_vmap.rt_crs (crs_id varchar(20) NOT NULL, name varchar(100), CONSTRAINT rt_crs_pkey PRIMARY KEY (crs_id));
+				ALTER TABLE s_vmap.rt_crs  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.rt_crs TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.rt_crs TO vmap_user;
+				COMMENT ON COLUMN s_vmap.rt_crs.crs_id IS 'EPSG system code (ex EPSG:2154)';
+				COMMENT ON COLUMN s_vmap.rt_crs.name IS 'name of the projection system (ex: lambert 93)';
+				CREATE TABLE s_vmap.layertheme (layertheme_id int4 DEFAULT nextval('s_vmap.seq_common') NOT NULL, name varchar(100), description text, CONSTRAINT theme_pkey PRIMARY KEY (layertheme_id));
+				ALTER TABLE s_vmap.layertheme  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.layertheme TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.layertheme TO vmap_user;
+				COMMENT ON COLUMN s_vmap.layertheme.layertheme_id IS 'theme name';
+				COMMENT ON COLUMN s_vmap.layertheme.description IS 'theme description';
+				CREATE TABLE s_vmap.map_group (map_id int4 NOT NULL, group_id int4 NOT NULL, CONSTRAINT map_group_pkey PRIMARY KEY (map_id, group_id));
+				ALTER TABLE s_vmap.map_group  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.map_group TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.map_group TO vmap_user;
+				CREATE TABLE s_vmap.map_layer (map_id int4 NOT NULL, layer_id int4 NOT NULL, layer_index int4 DEFAULT 0, layer_visible bool DEFAULT 'true', layer_opacity int4 DEFAULT 100, CONSTRAINT map_layer_pkey PRIMARY KEY (map_id, layer_id));
+				ALTER TABLE s_vmap.map_layer  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.map_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.map_layer TO vmap_user;
+				COMMENT ON COLUMN s_vmap.map_layer.layer_index IS 'Allows to manage the layer order in to the map';
+				COMMENT ON COLUMN s_vmap.map_layer.layer_visible IS 'Allows to manage the visibility of the layer in to the map';
+				COMMENT ON COLUMN s_vmap.map_layer.layer_opacity IS 'Allows to manage the opacity of the layer in to the map';
+				CREATE TABLE s_vmap.layer (layer_id int4 DEFAULT nextval('s_vmap.seq_common') NOT NULL, layertheme_id int4, service_id int4 NOT NULL, name varchar(100), description text, layer_list text, crs_list text, bo_id varchar(100), is_dynamic boolean, is_filtered boolean, CONSTRAINT layer_pkey PRIMARY KEY (layer_id));
+				ALTER TABLE s_vmap.layer  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.layer TO vmap_user;
+				COMMENT ON COLUMN s_vmap.layer.layer_id IS 'layer name';
+				COMMENT ON COLUMN s_vmap.layer.layertheme_id IS 'theme id';
+				COMMENT ON COLUMN s_vmap.layer.service_id IS 'service name';
+				COMMENT ON COLUMN s_vmap.layer.description IS 'layer description';
+				COMMENT ON COLUMN s_vmap.layer.layer_list IS 'wms, bing etc.. layer list, can be multiple for wms services only (ex: "zone_activite_audelor,za_terrain_audelor")';
+				COMMENT ON COLUMN s_vmap.layer.crs_list IS 'getCapabilities CRS (ex: "EPSG:2154|EPSG:3857|CRS:84"). Available coordinates systems for the layer';
+				COMMENT ON COLUMN s_vmap.layer.bo_id IS 'id of the business object';
+				COMMENT ON COLUMN s_vmap.layer.is_dynamic IS 'true to avoid caches';
+				COMMENT ON COLUMN s_vmap.layer.is_filtered IS 'true to use layer filter';
+				CREATE TABLE s_vmap.event (event_id varchar(50) NOT NULL, description text, PRIMARY KEY (event_id));
+				ALTER TABLE s_vmap.event  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.event TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.event TO vmap_user;
+				CREATE TABLE s_vmap.layer_event (layer_id int4 NOT NULL, event_id varchar(50) NOT NULL, PRIMARY KEY (layer_id, event_id));
+				ALTER TABLE s_vmap.layer_event  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.layer_event TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.layer_event TO vmap_user;
+				CREATE TABLE s_vmap.maptheme (maptheme_id  SERIAL NOT NULL, name varchar(100), description text, PRIMARY KEY (maptheme_id));
+				ALTER TABLE s_vmap.maptheme  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.maptheme TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.maptheme TO vmap_user;
+				COMMENT ON COLUMN s_vmap.maptheme.name IS 'theme name';
+				COMMENT ON COLUMN s_vmap.maptheme.description IS 'theme description';
+				CREATE TABLE s_vmap.map (map_id int4 DEFAULT nextval('s_vmap.seq_common') NOT NULL, crs_id varchar(20) NOT NULL, name varchar(100) NOT NULL, description text, extent varchar(225) NOT NULL, catalog_index int4, thumbnail text, maptheme_id int4, CONSTRAINT map_pkey PRIMARY KEY (map_id));
+				ALTER TABLE s_vmap.map  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.map TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.map TO vmap_user;
+				COMMENT ON COLUMN s_vmap.map.map_id IS 'map name';
+				COMMENT ON COLUMN s_vmap.map.crs_id IS 'EPSG system code (ex EPSG:2154)';
+				COMMENT ON COLUMN s_vmap.map.description IS 'map description';
+				COMMENT ON COLUMN s_vmap.map.extent IS 'extent of the map';
+				COMMENT ON COLUMN s_vmap.map.catalog_index IS 'index in the catalog';
+				COMMENT ON COLUMN s_vmap.map.maptheme_id IS 'theme';
+				CREATE TABLE s_vmap.module (module_id varchar(50) NOT NULL, description text, label varchar(50), rolname varchar(100) NOT NULL, PRIMARY KEY (module_id));
+				ALTER TABLE s_vmap.module  OWNER TO u_vitis;
+				COMMENT ON TABLE s_vmap.module IS 'La gestion des droits sur chacun des modules se fait grâce aux privilèges.Les privilèges sont les roles groupes de Postgres';
+				GRANT SELECT ON TABLE s_vmap.map TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.map TO vmap_user;
+				CREATE TABLE s_vmap.printtemplate (printtemplate_id  SERIAL NOT NULL, name varchar(100) NOT NULL UNIQUE, rt_format_id varchar(2) NOT NULL, rt_orientation_id varchar(8) NOT NULL, definition text NOT NULL, outputformats_id varchar(255) NOT NULL, sql text, ressource_id varchar(100), business_object_id varchar(50), PRIMARY KEY (printtemplate_id));
+				ALTER TABLE s_vmap.printtemplate  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.printtemplate TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.printtemplate TO vmap_user;
+				CREATE TABLE s_vmap.printtemplate_group (printtemplate_id int4 NOT NULL, group_id int4 NOT NULL, PRIMARY KEY (printtemplate_id, group_id));
+				ALTER TABLE s_vmap.printtemplate_group  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.printtemplate_group TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.printtemplate_group TO vmap_user;
+				CREATE TABLE s_vmap.rt_format (rt_format_id varchar(2) NOT NULL, PRIMARY KEY (rt_format_id));
+				ALTER TABLE s_vmap.rt_format  OWNER TO u_vitis;
+				GRANT SELECT ON TABLE s_vmap.rt_format TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.rt_format TO vmap_user;
+				CREATE TABLE s_vmap.rt_orientation (rt_orientation_id varchar(8) NOT NULL, PRIMARY KEY (rt_orientation_id));
+				ALTER TABLE s_vmap.rt_orientation  OWNER TO u_vitis;
+				GRANT SELECT ON TABLE s_vmap.rt_orientation TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.rt_orientation TO vmap_user;
+				CREATE TABLE s_vmap.printparameter (printparameter_id  SERIAL NOT NULL, printtemplate_id int4 NOT NULL, name varchar(100) NOT NULL, editable bool, label varchar(100), placeholder text, defaultvalue text, PRIMARY KEY (printparameter_id));
+				ALTER TABLE s_vmap.printparameter  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.printparameter TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.printparameter TO vmap_user;
+				CREATE TABLE s_vmap.rt_outputformats (outputformats_id varchar(255) NOT NULL, PRIMARY KEY (outputformats_id));
+				ALTER TABLE s_vmap.rt_outputformats  OWNER TO u_vitis;
+				GRANT SELECT ON TABLE s_vmap.rt_outputformats TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.rt_outputformats TO vmap_user;
+				CREATE TABLE s_vmap.printstyle (printstyle_id  SERIAL NOT NULL, name varchar(100) NOT NULL UNIQUE, definition text, PRIMARY KEY (printstyle_id));
+				ALTER TABLE s_vmap.printstyle  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.printstyle TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.printstyle TO vmap_user;
+				CREATE TABLE s_vmap.user_printstyle (printstyle_id int4 NOT NULL, user_id int4 NOT NULL, PRIMARY KEY (printstyle_id, user_id));
+				ALTER TABLE s_vmap.user_printstyle  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.user_printstyle TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.user_printstyle TO vmap_user;
+				CREATE TABLE s_vmap.business_object (business_object_id character varying(50) NOT NULL, title character varying(100), id_field character varying(30), database character varying(30), schema character varying(30), "table" character varying(30), sql_summary text, sql_list text, sorted_by character varying(100), geom_column character varying(30), search_field character varying(50), result_field character varying(50), search_use_strict character varying(30), event_id character varying(50));
+				ALTER TABLE s_vmap.business_object OWNER TO u_vitis;
+				COMMENT ON TABLE s_vmap.business_object IS 'contains the parameters of elements to show when making a layer query';
+				COMMENT ON COLUMN s_vmap.business_object.business_object_id IS 'ex: "veremes_cadastre_commune"';
+				COMMENT ON COLUMN s_vmap.business_object.id_field IS 'unique id field of the table';
+				COMMENT ON COLUMN s_vmap.business_object.database IS 'database where find the data of the business object';
+				COMMENT ON COLUMN s_vmap.business_object.schema IS 'schema where find the data of the business object';
+				COMMENT ON COLUMN s_vmap.business_object."table" IS 'table where find the data of the business object';
+				COMMENT ON COLUMN s_vmap.business_object.sql_summary IS 'sql request to get the infos showed on first (example popup)';
+				COMMENT ON COLUMN s_vmap.business_object.sql_list IS 'sql request to get the infos to show on detail mode';
+				COMMENT ON COLUMN s_vmap.business_object.sorted_by IS 'sorted_by sql attr';
+				REVOKE ALL ON TABLE s_vmap.business_object FROM PUBLIC;
+				REVOKE ALL ON TABLE s_vmap.business_object FROM u_vitis;
+				GRANT ALL ON TABLE s_vmap.business_object TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.business_object TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.business_object TO vmap_user;
+				COMMENT ON COLUMN s_vmap.business_object.geom_column IS 'column witch contains the geometry of the BO';
+				CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.business_object.title AS bo_title, s_vmap.business_object.id_field AS bo_id_field, s_vmap.business_object."database" AS bo_database, s_vmap.business_object."schema" AS bo_schema, s_vmap.business_object."table" AS bo_table, s_vmap.business_object.sql_summary AS bo_sql_summary, s_vmap.business_object.sql_list AS bo_sql_list, s_vmap.business_object.sorted_by AS bo_sorted_by, s_vmap.business_object.geom_column AS bo_geom_column, s_vmap.business_object.search_field AS bo_search_field, s_vmap.business_object.result_field AS bo_result_field, s_vmap.business_object.search_use_strict AS bo_search_use_strict, s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.bo_id, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered FROM s_vmap.layer LEFT JOIN s_vmap.business_object ON s_vmap.layer.bo_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id;
+				GRANT ALL ON TABLE s_vmap.v_layer TO vitis_admin;
+				GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_layer TO vitis_user;
+				GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+				CREATE VIEW s_vmap.v_map AS SELECT s_vmap.maptheme.name AS theme_name, s_vmap.maptheme.description AS theme_description, s_vmap.rt_crs.name AS crs_name, s_vmap.map.map_id, s_vmap.map.crs_id, s_vmap.map.name, s_vmap.map.description, s_vmap.map.extent, s_vmap.map.catalog_index, s_vmap.map.thumbnail, s_vmap.map.maptheme_id FROM s_vmap.maptheme RIGHT JOIN s_vmap.map ON s_vmap.maptheme.maptheme_id = s_vmap.map.maptheme_id INNER JOIN s_vmap.rt_crs ON s_vmap.map.crs_id = s_vmap.rt_crs.crs_id;
+				GRANT ALL ON TABLE s_vmap.v_map TO vitis_admin;
+				GRANT ALL ON TABLE s_vmap.v_map TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_map TO vitis_user;
+				GRANT SELECT ON TABLE s_vmap.v_map TO vmap_user;
+				CREATE UNIQUE INDEX maptheme_name ON s_vmap.maptheme (name);
+				CREATE UNIQUE INDEX service_name ON s_vmap.service (name);
+				CREATE UNIQUE INDEX rt_crs_name ON s_vmap.rt_crs (name);
+				CREATE UNIQUE INDEX theme_name ON s_vmap.layertheme (name);
+				CREATE UNIQUE INDEX layer_name ON s_vmap.layer (name);
+				CREATE UNIQUE INDEX map_name ON s_vmap.map (name);
+				ALTER TABLE s_vmap.map ADD CONSTRAINT fk_map_rt_crs FOREIGN KEY (crs_id) REFERENCES s_vmap.rt_crs (crs_id) ON UPDATE Cascade ON DELETE Restrict;
+				ALTER TABLE s_vmap.layer ADD CONSTRAINT fk_layer_service FOREIGN KEY (service_id) REFERENCES s_vmap.service (service_id) ON UPDATE Cascade ON DELETE Restrict;
+				ALTER TABLE s_vmap.service ADD CONSTRAINT fk_rt_service_service_type FOREIGN KEY (service_type_id) REFERENCES s_vmap.rt_service_type (service_type_id) ON UPDATE Cascade ON DELETE Restrict;
+				ALTER TABLE s_vmap.map_layer ADD CONSTRAINT fk_map_layer_layer FOREIGN KEY (layer_id) REFERENCES s_vmap.layer (layer_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.map_layer ADD CONSTRAINT fk_map_layer_map FOREIGN KEY (map_id) REFERENCES s_vmap.map (map_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.map_group ADD CONSTRAINT fk_map_group_group FOREIGN KEY (group_id) REFERENCES s_vitis."group" (group_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.map_group ADD CONSTRAINT fk_map_group_map FOREIGN KEY (map_id) REFERENCES s_vmap.map (map_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.map ADD CONSTRAINT fk_map_maptheme FOREIGN KEY (maptheme_id) REFERENCES s_vmap.maptheme (maptheme_id) ON UPDATE Cascade ON DELETE Restrict;
+				ALTER TABLE s_vmap.module ADD CONSTRAINT fk_module_privilege FOREIGN KEY (rolname) REFERENCES s_vitis.privileges (rolname) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.printtemplate_group ADD CONSTRAINT fk_printtemplate_group_group FOREIGN KEY (group_id) REFERENCES s_vitis."group" (group_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE ONLY s_vmap.business_object ADD CONSTRAINT business_object_pkey PRIMARY KEY (business_object_id);
+				ALTER TABLE s_vmap.user_printstyle ADD CONSTRAINT fk_user_printstyle_user FOREIGN KEY (user_id) REFERENCES s_vitis."user" (user_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.printtemplate_group ADD CONSTRAINT FKprinttempl72315 FOREIGN KEY (printtemplate_id) REFERENCES s_vmap.printtemplate (printtemplate_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.printtemplate ADD CONSTRAINT FKprinttempl680758 FOREIGN KEY (rt_format_id) REFERENCES s_vmap.rt_format (rt_format_id);
+				ALTER TABLE s_vmap.printtemplate ADD CONSTRAINT FKprinttempl340779 FOREIGN KEY (rt_orientation_id) REFERENCES s_vmap.rt_orientation (rt_orientation_id);
+				ALTER TABLE s_vmap.printparameter ADD CONSTRAINT FKprintparam828463 FOREIGN KEY (printtemplate_id) REFERENCES s_vmap.printtemplate (printtemplate_id) ON UPDATE Cascade ON DELETE Cascade;
+				ALTER TABLE s_vmap.printtemplate ADD CONSTRAINT FKprinttempl395374 FOREIGN KEY (outputformats_id) REFERENCES s_vmap.rt_outputformats (outputformats_id);
+				ALTER TABLE s_vmap.user_printstyle ADD CONSTRAINT FKuser_print429318 FOREIGN KEY (printstyle_id) REFERENCES s_vmap.printstyle (printstyle_id);
+				ALTER TABLE s_vmap.layer_event ADD CONSTRAINT FKlayer_even735484 FOREIGN KEY (layer_id) REFERENCES s_vmap.layer (layer_id);
+				ALTER TABLE s_vmap.layer_event ADD CONSTRAINT FKlayer_even639107 FOREIGN KEY (event_id) REFERENCES s_vmap.event (event_id);
+				GRANT SELECT ON TABLE public.geometry_columns TO vitis_user;
+				GRANT SELECT ON TABLE public.geometry_columns TO vitis_admin;
+				INSERT INTO s_vitis.vm_module (module_id, description, version, label) VALUES ('vmap', 'module vmap', 0.1, 'vmap');
+				INSERT INTO s_vitis.vm_mode (mode_id, module_id) VALUES ('vmap', 'vmap');
+				INSERT INTO s_vitis.vm_mode (mode_id, module_id) VALUES ('vmap_business_object', 'vmap');
+				INSERT INTO s_vitis.privileges(rolname, description) VALUES ('vmap_user', 'utilisateur vmap');
+				INSERT INTO s_vitis.privileges(rolname, description) VALUES ('vmap_admin', 'administrateur vmap');
+				INSERT INTO s_vitis.vm_mode_rolname(index, mode_id, rolname) VALUES (0, 'vmap', 'vmap_user');
+				INSERT INTO s_vitis.vm_mode_rolname(index, mode_id, rolname) VALUES (45, 'vmap_business_object', 'vmap_admin');
+				INSERT INTO s_vitis.vm_tab(tab_id, event, index, mode_id, label_id, name) VALUES ((SELECT nextval('s_vitis.seq_vm'::regclass)), 'javascript:loadVmap();', 0, 'vmap', 'vitis_1', 'vmap_map');
+				INSERT INTO s_vitis.vm_section(section_id, label_id, name, index, event, tab_id, template, module) VALUES ((SELECT nextval('s_vitis.seq_vm'::regclass)), 'vitis_1', 'general', 1, 'Javascript:reloadSectionForm', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_map'), 'modules/vmap/index-vitis.html', 'vmap');
+				INSERT INTO s_vitis.vm_mode (mode_id, module_id) VALUES ('vmap_admin_map', 'vmap');
+				INSERT INTO s_vitis.vm_mode_rolname (rolname, mode_id, "index") VALUES ('vmap_admin', 'vmap_admin_map', 40);
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Chaine de caractère nulle', 'vmap_1');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Cartes" du mode "vmap"', 'vmap_2');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Services" du mode "vmap"', 'vmap_3');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Calques" du mode "vmap"', 'vmap_4');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_map', 'vmap_5');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_map', 'vmap_6');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ map_id de l''onglet vmap_map', 'vmap_7');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_map"', 'vmap_8');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ catalog_index de l''onglet vmap_map', 'vmap_9');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_map', 'vmap_10');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ theme_name de l''onglet vmap_map', 'vmap_11');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ crs_name de l''onglet vmap_map', 'vmap_12');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_map', 'vmap_13');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ thumbnail de l''onglet vmap_map', 'vmap_14');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_service"', 'vmap_15');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_service', 'vmap_16');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_service', 'vmap_17');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ service_id de l''onglet vmap_service', 'vmap_18');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_service', 'vmap_19');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ service_type_id de l''onglet vmap_service', 'vmap_20');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_service', 'vmap_21');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ url de l''onglet vmap_service', 'vmap_22');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ service_type_version de l''onglet vmap_service', 'vmap_23');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ thumbnail de l''onglet vmap_service', 'vmap_24');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_layer"', 'vmap_25');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_layer', 'vmap_26');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_layer', 'vmap_27');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ layer_id de l''onglet vmap_layer', 'vmap_28');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_layer', 'vmap_29');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_layer', 'vmap_30');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ layertheme_name de l''onglet vmap_layer', 'vmap_31');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_1', 'fr', NULL);
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_1', 'en', NULL);
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_2', 'fr', 'Cartes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_2', 'en', 'Maps');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_3', 'fr', 'Services');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_3', 'en', 'Services');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_4', 'fr', 'Calques');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_4', 'en', 'Layers');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_5', 'fr', 'Ajouter une carte');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_5', 'en', 'Add map');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_6', 'fr', 'Supprimer les cartes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_6', 'en', 'Delete maps');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_7', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_7', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_8', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_8', 'en', 'General');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_9', 'fr', 'Ordre');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_9', 'en', 'Order');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_10', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_10', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_11', 'fr', 'Thème');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_11', 'en', 'Theme');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_12', 'fr', 'Système de coordonnées');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_12', 'en', 'Coordinate system');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_13', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_13', 'en', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_14', 'fr', 'Vignette');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_14', 'en', 'Thumbnail');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_15', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_15', 'en', 'General');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_16', 'fr', 'Ajouter un service');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_16', 'en', 'Add service');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_17', 'fr', 'Supprimer les services');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_17', 'en', 'Delete services');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_18', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_18', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_19', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_19', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_20', 'fr', 'Type');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_20', 'en', 'Type');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_21', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_21', 'en', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_22', 'fr', 'Lien');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_22', 'en', 'Link');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_23', 'fr', 'Version');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_23', 'en', 'Version');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_24', 'fr', 'Vignette');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_24', 'en', 'Thumbnail');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_25', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_25', 'en', 'General');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_26', 'fr', 'Ajouter un calque');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_26', 'en', 'Add layer');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_27', 'fr', 'Supprimer les calques');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_27', 'en', 'Delete layers');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_28', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_28', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_29', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_29', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_30', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_30', 'en', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_31', 'fr', 'Thème');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_31', 'en', 'Theme');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Section vmap de l''onglet framework_group', 'vmap_32');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_32', 'fr', 'vMap');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_32', 'en', 'vMap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ service_name de l''onglet vmap_layer', 'vmap_33');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_33', 'fr', 'Service');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_33', 'en', 'Service');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ crs_list de l''onglet vmap_map', 'vmap_34');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_34', 'fr', 'Système de coordonnées');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_34', 'en', 'Coordinate system');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "calques de la carte" de l''onglet "vmap_map"', 'vmap_35');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_35', 'fr', 'Calques de la carte');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_35', 'en', 'Map layers');
+				CREATE OR REPLACE VIEW s_vmap.v_map_layer AS SELECT v_layer.layer_id,v_layer.name,v_layer.theme_name,map_layer.layer_visible,map_layer.map_id,map_layer.layer_index,map_layer.layer_opacity,v_layer.layertheme_id,v_layer.service_id FROM s_vmap.v_layer,s_vmap.map_layer WHERE v_layer.layer_id=map_layer.layer_id;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Thèmes des calques" du mode "vmap"', 'vmap_36');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_layer_theme"', 'vmap_37');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_layer_theme', 'vmap_38');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_layer_theme', 'vmap_39');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ layertheme_id de l''onglet vmap_layer_theme', 'vmap_40');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_layer_theme', 'vmap_41');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_layer_theme', 'vmap_42');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_36', 'fr', 'Thèmes des calques');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_36', 'en', 'Themes layers');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_37', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_37', 'en', 'General');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_38', 'fr', 'Ajouter un thème');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_38', 'en', 'Add theme');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_39', 'fr', 'Supprimer les thèmes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_39', 'en', 'Delete themes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_40', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_40', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_41', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_41', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_42', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_42', 'en', 'Description');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Thèmes des cartes" du mode "vmap"', 'vmap_43');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_map_theme"', 'vmap_44');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_map_theme', 'vmap_45');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_map_theme', 'vmap_46');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ maptheme_id de l''onglet vmap_map_theme', 'vmap_47');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_map_theme', 'vmap_48');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_map_theme', 'vmap_49');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_43', 'fr', 'Thèmes des cartes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_43', 'en', 'Maps layers');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_44', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_44', 'en', 'General');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_45', 'fr', 'Ajouter un thème');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_45', 'en', 'Add theme');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_46', 'fr', 'Supprimer les thèmes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_46', 'en', 'Delete themes');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_47', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_47', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_48', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_48', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_49', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_49', 'en', 'Description');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_map', 'vmap_2', 'loadList()', 2, 'vmap/maps', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_admin_map');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_map', 'vmap_3', 'loadList()', 0, 'vmap/services', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_services');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_map', 'vmap_4', 'loadList()', 1, 'vmap/layers', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_layers');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_map', 'vmap_36', 'loadList()', 3, 'vmap/layerthemes', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_layer_theme');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_map', 'vmap_43', 'loadList()', 4, 'vmap/mapthemes', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_map_theme');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'AddSectionForm', 'vmap_5', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'deleteFlexigrid', 'DeleteSelection', 'vmap_6', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_16', 'vmap/services', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_services'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_17', 'vmap/services', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_services'));
+				INSERT INTO s_vitis.vm_table_button ( button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'AddSectionForm', 'vmap_26', 'vmap/layers', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_layers'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_27', 'vmap/layers', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_layers'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'AddSectionForm', 'vmap_38', 'vmap/layerthemes', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_layer_theme'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_39', 'vmap/layerthemes', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_layer_theme'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'AddSectionForm', 'vmap_45', 'vmap/mapthemes', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_map_theme'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_46', 'vmap/mapthemes', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_map_theme'));
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_8', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_15', 'general', 2, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, ressource_id, module) VALUES ('vmap_25', 'general', 3, 'showStudioIfLayerIsFiltered()', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layers'), nextval('s_vitis.seq_vm'), 'vmap/layers', 'vmap');
+				INSERT INTO s_vitis.vm_section (name, event, label_id, "index",  template, tab_id, section_id, ressource_id, module) VALUES ('vmap_group', 'loadVmapGroup()', 'vmap_32', 2, 'simpleFormTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vitis_group'), nextval('s_vitis.seq_vm'), 'vmap/vmapgroups', 'vmap');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, ressource_id, module) VALUES ('vmap_35', 'layers', 2, 'loadVmapMapLayers', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'), nextval('s_vitis.seq_vm'), 'vmap/maplayers', 'vmap');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, ressource_id, module) VALUES ('vmap_37', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer_theme'), nextval('s_vitis.seq_vm'), 'vmap/layerthemes', 'vmap');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, ressource_id, module) VALUES ('vmap_44', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_map_theme'), nextval('s_vitis.seq_vm'), 'vmap/mapthemes', 'vmap');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('map_id', true, true, 1,  30, 'right', 'vmap_7', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('name', true, true, 2,  200, 'left', 'vmap_10', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('catalog_index', true, true, 3,  40, 'right', 'vmap_9', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('theme_name', true, true, 4,  160, 'left', 'vmap_11', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('crs_name', true, true, 5,  160, 'left', 'vmap_12', 'vmap/maps', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('description', true, true, 6,  80, 'center', 'vmap_13', 'vmap/maps', '<div data-app-map-description-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('thumbnail', true, true, 7,  60, 'center', 'vmap_14', 'vmap/maps', '<div data-app-map-thumbnail-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_map'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'service_id', true, true, 1,  30, 'right', 'vmap_18', 'vmap/services' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'name', true, true, 2,  200, 'left', 'vmap_19', 'vmap/services' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'service_type_id', true, true, 3,  100, 'left', 'vmap_20', 'vmap/services' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'description', true, true, 4,  80, 'center', 'vmap_21', 'vmap/services', '<div data-app-service-description-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'url', true, true, 5,  60, 'center', 'vmap_22', 'vmap/services', '<div data-app-service-url-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'service_type_version', true, true, 6,  60, 'right', 'vmap_23', 'vmap/services' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'thumbnail', true, true, 7,  60, 'center', 'vmap_24', 'vmap/services', '<div data-app-service-thumbnail-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_services'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'layer_id', true, true, 1,  30, 'right', 'vmap_28', 'vmap/layers' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'name', true, true, 2,  200, 'left', 'vmap_29', 'vmap/layers' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'description', true, true, 3,  80, 'center', 'vmap_30', 'vmap/layers', '<div data-app-layer-description-column="{{row.entity[col.field]}}"></div>' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'theme_name', true, true, 4,  160, 'left', 'vmap_31', 'vmap/layers' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'service_name', true, true, 5, 160, 'left', 'vmap_33', 'vmap/layers' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'crs_list', true, true, 5,  160, 'left', 'vmap_34', 'vmap/layers', '<div data-app-crs-list-description-column=""></div>' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'layertheme_id', true, true, 1,  30, 'right', 'vmap_40', 'vmap/layerthemes' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer_theme'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ( 'name', true, true, 2,  200, 'left', 'vmap_41', 'vmap/layerthemes' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer_theme'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES ( 'description', true, true, 3,  80, 'center', 'vmap_42', 'vmap/layerthemes', '<div data-app-layer-theme-description-column=""></div>' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer_theme'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES( 'maptheme_id', true, true, 1,  30, 'right', 'vmap_47', 'vmap/mapthemes' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_map_theme'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES( 'name', true, true, 2,  200, 'left', 'vmap_48', 'vmap/mapthemes' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_map_theme'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES( 'description', true, true, 3,  80, 'center', 'vmap_49', 'vmap/mapthemes', '<div data-app-map-theme-description-column=""></div>' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_map_theme'));
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Business object', 'vmap_50');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_50', 'en', 'Business object');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_50', 'fr', 'Objet métier');
+				INSERT INTO s_vitis.vm_tab(event, index, mode_id, label_id, ressource_id, edit_column, show_column, sorted_by, sorted_dir, name)  VALUES ('loadList()', 0, 'vmap_business_object', 'vmap_50', 'vmap/businessobjects', 'editSectionForm', 'showSectionForm', 'business_object_id', 'ASC', 'vmap_business_object');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Title', 'vmap_51');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_51', 'en', 'Title');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_51', 'fr', 'Titre');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Database', 'vmap_52');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_52', 'en', 'Database');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_52', 'fr', 'Base de données');
+				INSERT INTO s_vitis.vm_section(label_id, name, index, event, tab_id, template, module)  VALUES ('vmap_50', 'general', 1, 'Javascript:loadSectionForm', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'workspaceListTpl.html', 'vmap');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id)  VALUES ('business_object_id', 'TRUE', 'TRUE', 1, 180, 'left', 'vmap_50', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('title', 'TRUE', 'TRUE', 2, 124, 'left', 'vmap_51', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('database', 'TRUE', 'TRUE', 3, 124, 'left', 'vmap_52', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Schema', 'vmap_53');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_53', 'en', 'Schema');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_53', 'fr', 'Schema');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('schema', 'TRUE', 'TRUE', 4, 124, 'left', 'vmap_53', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Table', 'vmap_54');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_54', 'en', 'Table');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_54', 'fr', 'Table');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('table', 'TRUE', 'TRUE', 4, 124, 'left', 'vmap_54', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Id field', 'vmap_55');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_55', 'en', 'Id field');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_55', 'fr', 'Champ identifiant');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('id_field', 'TRUE', 'TRUE', 5, 124, 'left', 'vmap_55', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('New business object', 'vmap_58');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_58', 'fr', 'Ajouter un objet métier');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_58', 'en', 'Add business object');
+				INSERT INTO s_vitis.vm_table_button(button_class, event, label_id, tab_id, ressource_id) VALUES ('add_smallFlexigrid', 'AddSectionForm', 'vmap_58', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Delete business object', 'vmap_59');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_59', 'fr', 'Supprimer les objets métier');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_59', 'en', 'Delete business object');
+				INSERT INTO s_vitis.vm_table_button( button_class, event, label_id, tab_id, ressource_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_59', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'vmap/businessobjects');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Forms', 'vmap_60');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation)  VALUES ('vmap_60', 'fr', 'Formulaires');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_60', 'en', 'Forms');
+				INSERT INTO s_vitis.vm_section(label_id, name, index, event, tab_id, template, module) VALUES ('vmap_60', 'studio', 2, 'loadStudioVmap(''business_object'')', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object'), 'modules/vmap/template/studio.html', 'vmap');
+				ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO vitis_admin;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_map_layer TO vitis_user;
+				GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+				ALTER TABLE s_vmap.v_map OWNER TO u_vitis;
+				ALTER TABLE s_vmap.v_map_layer  OWNER TO u_vitis;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Modules vMap" du mode "vmap"', 'vmap_61');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_admin_module"', 'vmap_62');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_61', 'fr', 'Modules vMap');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_61', 'en', 'vMap modules');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_62', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_62', 'en', 'General');
+				INSERT INTO s_vitis.vm_mode (mode_id, module_id) VALUES ('vmap_admin_module', 'vmap');
+				INSERT INTO s_vitis.vm_mode_rolname (rolname, mode_id, "index") VALUES ('vmap_admin', 'vmap_admin_module', 60);
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_module', 'vmap_61', 'loadList()', 0, 'vmap/modules', NULL, 'showSectionForm', 'label', 'ASC', 'vmap_admin_module');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_62', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_module'), nextval('s_vitis.seq_vm'), 'vmap');
+				GRANT ALL ON TABLE s_vmap.module TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.module TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.module TO vmap_user;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ module_id de l''onglet vmap_admin_module', 'vmap_63');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ label de l''onglet vmap_admin_module', 'vmap_64');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_admin_module', 'vmap_65');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_63', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_63', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_64', 'fr', 'Libellé');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_64', 'en', 'Label');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_65', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_65', 'en', 'Description');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('module_id', true, true, 1,  100, 'right', 'vmap_63', 'vmap/modules', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_module'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('label', true, true, 2,  200, 'left', 'vmap_64', 'vmap/modules', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_module'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('description', true, true, 3,  80, 'center', 'vmap_65', 'vmap/modules', '<div data-app-module-description-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_module'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Modèles" du mode "vmap_admin_template"', 'vmap_66');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_admin_template"', 'vmap_67');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_66', 'fr', 'Modèles');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_66', 'en', 'Templates');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_67', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_67', 'en', 'General');
+				INSERT INTO s_vitis.vm_mode (mode_id, module_id) VALUES ('vmap_admin_print', 'vmap');
+				INSERT INTO s_vitis.vm_mode_rolname (rolname, mode_id, "index") VALUES ('vmap_admin', 'vmap_admin_print', 50);
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_print', 'vmap_66', 'loadList()', 0, 'vmap/printtemplates', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_admin_template');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_67', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ printtemplate_id de l''onglet vmap_admin_template', 'vmap_68');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_admin_template', 'vmap_69');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_68', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_68', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_69', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_69', 'en', 'Name');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('printtemplate_id', true, true, 1,  30, 'right', 'vmap_68', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('name', true, true, 2,  200, 'left', 'vmap_69', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_admin_template', 'vmap_70');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_admin_template', 'vmap_71');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_70', 'fr', 'Ajouter un modèle');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_70', 'en', 'Add template');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_71', 'fr', 'Supprimer les modèles');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_71', 'en', 'Delete templates');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_70', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_templates'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_71', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_templates'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Styles" du mode "vmap_admin_print"', 'vmap_72');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_admin_template"', 'vmap_73');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_72', 'fr', 'Styles');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_72', 'en', 'Styles');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_73', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_73', 'en', 'General');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_print', 'vmap_72', 'loadList()', 0, 'vmap/printstyles', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_admin_style');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_73', 'general', 2, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_style'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ printstyle_id de l''onglet vmap_admin_style', 'vmap_74');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_admin_style', 'vmap_75');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_74', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_74', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_75', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_75', 'en', 'Name');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('printstyle_id', true, true, 1,  30, 'right', 'vmap_74', 'vmap/printstyles', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_style'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('name', true, true, 2,  200, 'left', 'vmap_75', 'vmap/printstyles', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_style'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_admin_style', 'vmap_76');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_admin_style', 'vmap_77');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_76', 'fr', 'Ajouter un style');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_76', 'en', 'Add style');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_77', 'fr', 'Supprimer les styles');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_77', 'en', 'Delete styles');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_76', 'vmap/printstyles', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_style'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_77', 'vmap/printstyles', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_style'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Section vmap de l''onglet vitis_users', 'vmap_78');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_78', 'fr', 'vMap');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_78', 'en', 'vMap');
+				INSERT INTO s_vitis.vm_section (name, event, label_id, "index",  template, tab_id, section_id, ressource_id, module) VALUES ('vmap_user', 'loadVmapUser()', 'vmap_78', 2, 'simpleFormTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vitis_users'), nextval('s_vitis.seq_vm'), 'vmap/vmapusers', 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Paramètres" du mode "vmap_admin_print"', 'vmap_79');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_admin_print_parameter"', 'vmap_80');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_79', 'fr', 'Paramètres');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_79', 'en', 'Parameters');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_80', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_80', 'en', 'General');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_admin_print', 'vmap_79', 'loadList()', 2, 'vmap/printparameters', 'editSectionForm', 'showSectionForm', 'name', 'ASC', 'vmap_admin_print_parameter');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_80', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_admin_print_parameter', 'vmap_81');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_admin_print_parameter', 'vmap_82');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_81', 'fr', 'Ajouter un paramètre');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_81', 'en', 'Add parameter');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_82', 'fr', 'Supprimer les paramètres');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_82', 'en', 'Delete parameters');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_81', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_82', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ printparameter_id de l''onglet vmap_admin_print_parameter', 'vmap_83');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ name de l''onglet vmap_admin_print_parameter', 'vmap_84');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_83', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_83', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_84', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_84', 'en', 'Name');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('printparameter_id', true, true, 1,  30, 'right', 'vmap_83', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('name', true, true, 2,  200, 'left', 'vmap_84', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				CREATE OR REPLACE VIEW s_vmap.v_print_parameter AS SELECT printparameter.printparameter_id, printparameter.printtemplate_id, printparameter.name, printparameter.editable, printparameter.label, printparameter.placeholder, printparameter.defaultvalue, printtemplate.name AS print_template FROM s_vmap.printparameter LEFT JOIN s_vmap.printtemplate ON printparameter.printtemplate_id = printtemplate.printtemplate_id;
+				ALTER TABLE s_vmap.v_print_parameter OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_print_parameter TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_print_parameter TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_print_parameter TO vmap_user;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ label de l''onglet vmap_admin_print_parameter', 'vmap_85');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ print_template de l''onglet vmap_admin_print_parameter', 'vmap_86');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ placeholder de l''onglet vmap_admin_print_parameter', 'vmap_87');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ defaultvalue de l''onglet vmap_admin_print_parameter', 'vmap_88');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ editable de l''onglet vmap_admin_print_parameter', 'vmap_89');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_85', 'fr', 'Libellé');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_85', 'en', 'Label');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_86', 'fr', 'Modèle');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_86', 'en', 'Template');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_87', 'fr', 'Placeholder');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_87', 'en', 'Placeholder');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_88', 'fr', 'Valeur par défaut');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_88', 'en', 'Default value');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_89', 'fr', 'Modifiable');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_89', 'en', 'Editable');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('label', true, true, 3,  200, 'left', 'vmap_85', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('print_template', true, true, 4,  200, 'left', 'vmap_86', 'vmap/printparameters', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('placeholder', true, true, 4,  80, 'center', 'vmap_87', 'vmap/printparameters', '<div data-app-print-parameter-placeholder-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('defaultvalue', true, true, 5,  110, 'center', 'vmap_88', 'vmap/printparameters', '<div data-app-print-parameter-default-value-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, template, tab_id) VALUES  ('editable', true, true, 6,  80, 'center', 'vmap_89', 'vmap/printparameters', '<div data-app-set-boolean-icon-column="{{row.entity[col.field]}}"></div>', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_print_parameter'));
+				CREATE OR REPLACE VIEW s_vmap.v_template AS SELECT printtemplate.printtemplate_id, printtemplate.name, printtemplate.rt_format_id, printtemplate.rt_orientation_id, printtemplate.definition, printtemplate.outputformats_id, printtemplate.sql, printtemplate.ressource_id, printtemplate.business_object_id, business_object.title AS business_object FROM s_vmap.printtemplate LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id = business_object.business_object_id;
+				ALTER TABLE s_vmap.v_template OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_template TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_template TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_template TO vmap_user;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ rt_format_id de l''onglet vmap_admin_template', 'vmap_90');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ rt_orientation_id de l''onglet vmap_admin_template', 'vmap_91');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ outputformats_id de l''onglet vmap_admin_template', 'vmap_92');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_90', 'fr', 'Format');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_90', 'en', 'Format');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_91', 'fr', 'Orientation');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_91', 'en', 'Orientation');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_92', 'fr', 'Format de sortie');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_92', 'en', 'Output format');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('rt_format_id', true, true, 3,  45, 'left', 'vmap_90', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('rt_orientation_id', true, true, 4,  65, 'left', 'vmap_91', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('outputformats_id', true, true, 5,  100, 'left', 'vmap_92', 'vmap/printtemplates', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_admin_template'));
+				INSERT INTO s_vmap.rt_service_type (service_type_id) VALUES ('tilewms');
+				INSERT INTO s_vmap.rt_service_type (service_type_id) VALUES ('imagewms');
+				INSERT INTO s_vmap.rt_service_type (service_type_id) VALUES ('bing');
+				INSERT INTO s_vmap.rt_service_type (service_type_id) VALUES ('osm');
+				INSERT INTO s_vmap.rt_crs (crs_id, name) VALUES ('EPSG:2154', 'Lambert 93');
+				INSERT INTO s_vmap.rt_crs (crs_id, name) VALUES ('EPSG:3857', 'WGS84 Spherical Mercator');
+				INSERT INTO s_vmap.rt_crs (crs_id, name) VALUES ('EPSG:4326', 'Longitude Latitude');
+				INSERT INTO s_vmap.layertheme (name, description) VALUES ('Géobretagne', 'services regroupant les couches géobretagne');
+				INSERT INTO s_vmap.layertheme (name, description) VALUES ('Open Street Maps', 'services regroupant les couches open street map');
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('tilewms', 'Géobretagne', 'services regroupant les couches géobretagne', 'http://geobretagne.fr/geoserver/audelor/wms?service=wms', '', '1.3.0', NULL, NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'Open Street Maps', 'services regroupant les couches osm', 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png', '', '1.3.0', 'images/imagettes/osm.png', NULL, NULL);
+				INSERT INTO s_vmap.service ( service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ( 'osm', 'OpenSeaMap', 'Phares et autres éléments maritimes', 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/seamap.png', NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'OpenCycleMap', 'Used by hundreds of applications and websites from around the globe, OpenCycleMap is an award-winning global map for cycling.', 'http://tile.thunderforest.com/cycle/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/opencyclemap.png', NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'Transport', 'Recently chosen by OpenStreetMap for their front page, this map shows public transportation in great detail.', 'http://tile.thunderforest.com/transport/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/transport-294.png', NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'Landscape', 'A global style focused on information about the natural world - great for rural context.', 'http://tile.thunderforest.com/landscape/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/landscape-294.png', NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'Outdoors', 'For all the outdoor enthusiasts - hiking, skiing and other activities.', 'http://tile.thunderforest.com/outdoors/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/outdoors-294.png', NULL, NULL);
+				INSERT INTO s_vmap.service (service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ('osm', 'Transport Dark', 'A dark variant of the Transport map.', 'http://tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png', NULL, NULL, 'images/imagettes/transport-dark-294.png', NULL, NULL);
+				INSERT INTO s_vmap.layer (layertheme_id, service_id, name, description, layer_list, crs_list, bo_id) VALUES ((SELECT layertheme_id FROM s_vmap.layertheme WHERE name = 'Géobretagne'), (SELECT service_id FROM s_vmap.service WHERE name = 'Géobretagne'), 'Liaisons vertes', 'Liaisons vertes de la région lorientaise', 'liaisons_vertes_audelor', 'EPSG:2154|CRS:84', NULL);
+				INSERT INTO s_vmap.layer (layertheme_id, service_id, name, description, layer_list, crs_list, bo_id) VALUES ((SELECT layertheme_id FROM s_vmap.layertheme WHERE name = 'Géobretagne'), (SELECT service_id FROM s_vmap.service WHERE name = 'Géobretagne'), 'Terrains zone d''activités', 'Terrains (Zones d''Activités du Pays de Lorient)', 'za_terrain_audelor', 'EPSG:2154|CRS:84', NULL);
+				INSERT INTO s_vmap.layer (layertheme_id, service_id, name, description, layer_list, crs_list, bo_id) VALUES ((SELECT layertheme_id FROM s_vmap.layertheme WHERE name = 'Géobretagne'), (SELECT service_id FROM s_vmap.service WHERE name = 'Géobretagne'), 'Zone d''activités audelor', 'Zones d''Activités du Pays de Lorient', 'zone_activite_audelor', 'EPSG:2154|CRS:84', NULL);
+				INSERT INTO s_vmap.layer (layertheme_id, service_id, name, description, layer_list, crs_list, bo_id) VALUES ((SELECT layertheme_id FROM s_vmap.layertheme WHERE name = 'Open Street Maps'), (SELECT service_id FROM s_vmap.service WHERE name = 'Open Street Maps'), 'Open Street Maps', 'Fond osm', NULL, 'EPSG:3857', NULL);
+				INSERT INTO s_vmap.maptheme (name, description) VALUES ('Thème Géobretagne', 'Cartes Géobretagne avec fond OSM');
+				INSERT INTO s_vmap.map (crs_id, name, description, extent, catalog_index, thumbnail, maptheme_id) VALUES ('EPSG:2154', 'Carte OSM Géobretagne', 'Carte Geobretagne avec un fond osm', '176015|6730574|282342|6792233', 2, 'images/imagettes/osm.png', (SELECT maptheme_id FROM s_vmap.maptheme WHERE name = 'Thème Géobretagne'));
+				INSERT INTO s_vmap.rt_format(rt_format_id) VALUES ('A4');
+				INSERT INTO s_vmap.rt_format(rt_format_id) VALUES ('A3');
+				INSERT INTO s_vmap.rt_format(rt_format_id) VALUES ('A2');
+				INSERT INTO s_vmap.rt_format(rt_format_id) VALUES ('A1');
+				INSERT INTO s_vitis."group" ("group_id", "name") VALUES ((SELECT nextval('s_vitis.seq_common'::regclass)), 'demo');
+				INSERT INTO s_vmap.map_group (map_id, group_id) VALUES ((SELECT map_id FROM s_vmap.map WHERE name = 'Carte OSM Géobretagne'), (SELECT group_id FROM s_vitis.group WHERE name = 'demo'));
+				INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES ((SELECT map_id FROM s_vmap.map WHERE name = 'Carte OSM Géobretagne'), (SELECT layer_id FROM s_vmap.layer WHERE name = 'Open Street Maps'), 1, true, 100);
+				INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES ((SELECT map_id FROM s_vmap.map WHERE name = 'Carte OSM Géobretagne'), (SELECT layer_id FROM s_vmap.layer WHERE name = 'Liaisons vertes'), 2, true, 100);
+				INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES ((SELECT map_id FROM s_vmap.map WHERE name = 'Carte OSM Géobretagne'), (SELECT layer_id FROM s_vmap.layer WHERE name = 'Terrains zone d''activités'), 3, true, 100);
+				INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES ((SELECT map_id FROM s_vmap.map WHERE name = 'Carte OSM Géobretagne'), (SELECT layer_id FROM s_vmap.layer WHERE name = 'Zone d''activités audelor'), 4, true, 100);
+				INSERT INTO s_vmap.rt_orientation(rt_orientation_id) VALUES ('portrait');
+				INSERT INTO s_vmap.rt_orientation(rt_orientation_id) VALUES ('paysage');
+				INSERT INTO s_vmap.rt_outputformats(outputformats_id) VALUES ('pdf');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section vmap_config', 'vmap_95');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_95', 'fr', 'Configuration vMap');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_95', 'en', 'vMap config');
+				INSERT INTO s_vitis.vm_mode_rolname (index, mode_id, rolname) VALUES (70, 'configuration', 'vmap_admin');
+				INSERT INTO s_vitis.vm_section (section_id, label_id, name, index, event, tab_id, template, ressource_id, module) VALUES ((select nextval('s_vitis.seq_vm'::regclass)), 'vmap_95', 'vmapConfig', 7, 'loadVmapConfig()', (select tab_id from s_vitis.vm_tab where name = 'vitis_configuration'), 'simpleFormTpl.html', NULL, 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Onglet "Evènements" du mode "vmap_business_object"', 'vmap_96');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Titre de la section "general" de l''onglet "vmap_business_object_event"', 'vmap_97');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_96', 'fr', 'Evènements');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_96', 'en', 'Events');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_97', 'fr', 'Général');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_97', 'en', 'General');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_business_object', 'vmap_96', 'loadList()', 2, 'vmap/businessobjectevents', 'editSectionForm', 'showSectionForm', 'event_id', 'ASC', 'vmap_business_object_event');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_97', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_event'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_business_object_event', 'vmap_98');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button de suppression de l''onglet vmap_business_object_event', 'vmap_99');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_98', 'fr', 'Ajouter un évènement');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_98', 'en', 'Add event');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_99', 'fr', 'Supprimer les évènements');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_99', 'en', 'Delete events');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_98', 'vmap/businessobjectevents', (select tab_id from s_vitis.vm_tab where name = 'vmap_business_object_event'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_99', 'vmap/businessobjectevents', (select tab_id from s_vitis.vm_tab where name = 'vmap_business_object_event'));
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ event_id de l''onglet vmap_business_object_event', 'vmap_100');
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ description de l''onglet vmap_business_object_event', 'vmap_101');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_100', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_100', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_101', 'fr', 'Description');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_101', 'en', 'Description');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES  ('event_id', true, true, 1,  150, 'right', 'vmap_83', 'vmap/businessobjectevents', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_event'));
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id, template) VALUES  ('description', true, true, 2,  80, 'left', 'vmap_101', 'vmap/businessobjectevents', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_event'), '<div data-app-business-object-event-description-column="{{row.entity[col.field]}}"></div>');
+				INSERT INTO s_vmap.printtemplate (name, rt_format_id, rt_orientation_id, definition, outputformats_id, sql, ressource_id, business_object_id) VALUES ('Modèle par défaut', 'A4', 'portrait', '<style>' || chr(13) || '    #A4_print_template {' || chr(13) || '        text-align: center;' || chr(13) || '        width: 21cm;' || chr(13) || '    }' || chr(13) || '    #map_legend {' || chr(13) || '        margin-left: 25px;' || chr(13) || '        text-align: left;' || chr(13) || '    }' || chr(13) || '    #map_image {' || chr(13) || '        background-color: #DFDFDF;' || chr(13) || '        height: 19cm;' || chr(13) || '        width: 14cm;' || chr(13) || '    }' || chr(13) || '    #map_overview {' || chr(13) || '        background-color: #DFDFDF;' || chr(13) || '        /* 4cm conseillé */' || chr(13) || '        height: 4cm;' || chr(13) || '        width: 4cm;' || chr(13) || '    }' || chr(13) || '    .map_image_container {' || chr(13) || '        /*margin: 25px 0px;*/' || chr(13) || '    }' || chr(13) || '    .absolute {' || chr(13) || '        position: absolute;' || chr(13) || '    }' || chr(13) || '' || chr(13) || '    #img1 {' || chr(13) || '        height: 1cm;' || chr(13) || '    }' || chr(13) || '</style>' || chr(13) || '<!-- A4 print Template -->' || chr(13) || '<div id="A4_print_template">' || chr(13) || '    <br>' || chr(13) || '    <br>' || chr(13) || '    <!--Logos-->' || chr(13) || '    <div class="row">' || chr(13) || '        <div class="col-sm-4"><img id="img1" src="images/logo-veremes.jpg"></div>' || chr(13) || '        <div class="col-sm-4">' || chr(13) || '            <h1 style="margin-bottom: 0px; padding-bottom: 0px;">{{title}}</h1></div>' || chr(13) || '        <div class="col-sm-4"><img id="img1" src="images/logo_departement_herault.jpg"></div>' || chr(13) || '    </div>' || chr(13) || '    <div>' || chr(13) || '        <i>{{headline}}</i>' || chr(13) || '    </div>' || chr(13) || '    <!--Carte-->' || chr(13) || '    <div style="margin: 25px 0px">' || chr(13) || '        <div class="row">' || chr(13) || '            <div class="col-sm-3">' || chr(13) || '                <!--Pour afficher la légende, donner à la div id="map_legend"-->' || chr(13) || '                <div id="map_legend"></div>' || chr(13) || '            </div>' || chr(13) || '            <div class="col-sm-9">' || chr(13) || '                <div class="map_image_container">' || chr(13) || '                    <!--Pour afficher la carte, donner à la div id="map_image"-->' || chr(13) || '                    <img id="map_image" src="images/transparent.png">' || chr(13) || '                </div>' || chr(13) || '            </div>' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '    <div class="row">' || chr(13) || '' || chr(13) || '        <!--On peut afficher l''overview en utilisant id="map_overview-->' || chr(13) || '        <div class="col-sm-4">' || chr(13) || '            <img id="map_overview">' || chr(13) || '        </div>' || chr(13) || '        <div class="col-sm-4">' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <label>{{footer}}</label>' || chr(13) || '        </div>' || chr(13) || '' || chr(13) || '        <!--On peut afficher l''échelle actuelle en utilisant {{map_scale}}-->' || chr(13) || '        <div class="col-sm-4">' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <br>' || chr(13) || '            <label>Echelle: {{map_scale}}</label><br>' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '    <br>' || chr(13) || '</div>', 'pdf', NULL, NULL, NULL);
+				INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut'), 'title', true, 'Titre', 'Titre du document', NULL);
+				INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut'), 'footer', false, NULL, NULL, 'Tout droits réservés');
+				INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut'), 'headline', true, 'Sous titre', 'Sous titre de la carte', NULL);
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Formulaire de filtre', 'vmap_102');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_102', 'fr', 'Formulaire de filtre');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_102', 'en', 'Layer filter');
+				INSERT INTO s_vitis.vm_section (section_id, label_id, name, index, event, tab_id, template, ressource_id, module) VALUES ((select nextval('s_vitis.seq_vm'::regclass)), 'vmap_102', 'studio', 4, 'loadStudioVmap(''layer_filter'')', (select tab_id from s_vitis.vm_tab where name = 'vmap_layers'), 'modules/vmap/template/studio.html', NULL, 'vmap');
+				CREATE OR REPLACE VIEW s_vmap.v_user_printstyle AS SELECT * FROM s_vmap.printstyle where printstyle_id = (SELECT printstyle_id FROM s_vmap.user_printstyle where user_id = (SELECT user_id FROM s_vitis.user where login = current_user));
+				ALTER TABLE s_vmap.v_user_printstyle  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_user_printstyle TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_user_printstyle TO vmap_user;
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2016.01.01</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2016.02.00</version>
+			<code>
+				<![CDATA[
+				DELETE FROM s_vmap.rt_format WHERE rt_format_id='A1';
+				DELETE FROM s_vmap.rt_format WHERE rt_format_id='A2';
+				UPDATE s_vmap.printtemplate SET definition='<style>' || chr(13) || '    #A4_print_template {' || chr(13) || '        width: 21cm;' || chr(13) || '        font-family: arial;' || chr(13) || '        position: absolute;' || chr(13) || '    }' || chr(13) || '    #map_legend{' || chr(13) || '        width: 3cm; ' || chr(13) || '        margin-top: 16px;' || chr(13) || '    }' || chr(13) || '    #map_image {' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '        height: 22cm;' || chr(13) || '        width: 14cm;' || chr(13) || '        border: 1px solid black;' || chr(13) || '    }' || chr(13) || '    #map_overview {' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '        height: 4cm;' || chr(13) || '        width: 4cm;' || chr(13) || '        border: 1px solid black;' || chr(13) || '    }' || chr(13) || '    .color_blue{' || chr(13) || '        color: #424A96 !important;' || chr(13) || '    }' || chr(13) || '    .logo {' || chr(13) || '        height: 2cm;' || chr(13) || '    }' || chr(13) || '    .container {' || chr(13) || '        position: absolute;' || chr(13) || '    }' || chr(13) || '    #header_container{' || chr(13) || '        width: 18cm;' || chr(13) || '        height: 2.5cm;' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '    }' || chr(13) || '    #footer_container{' || chr(13) || '        width: 18cm;' || chr(13) || '        height: 1cm;' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '    }' || chr(13) || '    .header_content{' || chr(13) || '        margin-left: 10px;' || chr(13) || '    }' || chr(13) || '    .title{' || chr(13) || '        display: block;' || chr(13) || '        font-size: 24pt;' || chr(13) || '        font-weight: bold;' || chr(13) || '        margin-top: 0.8em;' || chr(13) || '    }' || chr(13) || '    .headline{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 14pt;' || chr(13) || '    }' || chr(13) || '    .legend_headline{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 14pt;' || chr(13) || '        color: black;' || chr(13) || '    }' || chr(13) || '    .footer_text{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 10pt;' || chr(13) || '        margin: 0.3cm;' || chr(13) || '    }' || chr(13) || '' || chr(13) || '</style>' || chr(13) || '<div id="A4_print_template">' || chr(13) || '' || chr(13) || '    <div id="header_container" class="container" style="top: 1.2cm; left: 1.5cm;">' || chr(13) || '        <div class="container" style="top: -0.5cm; left: 0cm;">' || chr(13) || '            <div class="header_content title color_blue">{{title}}</div>' || chr(13) || '            <div class="header_content headline color_blue">{{headline}}</div>' || chr(13) || '        </div>' || chr(13) || '        <div class="container" style="top: 0.2cm; right: 10px;">' || chr(13) || '            <img class="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAABvCAMAAAC0A0wQAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH4AoaDB4SgWapiwAAAIpQTFRF5z+B61+W7W+h73+r8Y+285/A9a/L97/V+c/g+9/q/e/1////97/V9a/L97/V9a/L8Y+29a/L97/V9a/L3wBY3wFZ3wJZ4Ahe4Ale4Q9i4RNl4hVm4x9s4yBt4yNv5CZx5Clz5S935TN65z+B50CC6U+M6VOO6lmS61+W7Gic7W+h73+r8Y+285/AbLUkSgAAABR0Uk5TAAAAAAAAAAAAAAAAEBgrYIaUqrbZfjuKAAAE00lEQVRo3u2abZOcKBCAzW02y4vnxR1390jM5Tzihgj+/78XeRXUUUSn6j4MVVtxBB+bpulu2mTYaw/VRuvkKLY+ZsRle9gEDYNEdRM2H8bA6jZsKTa9DZvFiL2HTapa/dNWVTkM6cxddpjd5zlmpVw9zrVKiJ4BvK6bWLbQ93tOAa/ocAWqYRoUSL23nHN6RO6xjyvjFlWNkPoNsX5VApt0cvalz5aTYNwfj/s6hc0x4sLv41UuNYFw2HgCm+EZRGq5xngLvs2GU0apHqIz9sxgNtlz+XL5EOzmbEj2sfkckUuR84UODMguNpoTkGKXC2wM6x1sukRopXmDw3IvzRwL8zd/6S5953hPY5TsYCO8rwWmssHGexuksWyK97feKWadXZcJ8DzWvvfDR0PcYne72XXsWop0jWyxSb6bjWgkmyUsZaS+a4SPwNflTmDDro6SmyawQeRapuwcXNIodspSeqnzKrtpU9iwi1pLniS4TUM39g4+opWNvdMlsXPeRLAnqxlpkyjvInxVGM1BVKwANCVesqsGj+BCtN+Tn0C6EoMFBvIFPW9JCpuueNy+ajtCOOBpeVW+qu2S7M2/PRyq8/jUJIZd+0lTdDCLjMUmYKKu3Mrf9rO14KipyKZtk/1nkuH0J5qYtDPhvCNaZQIRKZZIOLuSmFSlO1IrQDdkE7SeG5MjNY48Mg1MYUPBr4gOOTymEyU6vJIDEi6OspvlGJfTM+pVbaSbSqqFLSvlFLmXUi3Iy7NqeJR19bVT3xn1QYCdsSNxcu2xa6pVTR+qmaqdRCnj1S3YEe3O/l+wi4cT2hX2ye3OvrOT2Q+zfWBDY3Ee2x4G3RejE9nCnZnOZ9vkgd2AbcNvcwO2SUxQlcb+Vz5yCQ4Bf5h6m/swdZGJW8guHgeX93H+Kjjc/9OkSpmivduub0pYU1tyxVNuflk24i5daw1e99oSZKvomZrvm29r/xmdyLc2LmXoRzZqZt+QNfviOkiv9P3uKUW8Kj1oNnBnEjWZkT3JTgrHJuHdTCnTKuWrnAMybGwfLFSdqfJ/yjv2PNI6tt9qZSdfnHxK0p/WTpR83CxwO7K15i+u4kg8Nv309EjtCXVg/3q1BqGugGNzUzZo1Tscm467ijmv41foWjOdzCzgD3lTzuAfZ99aW+bAVIxsFXGBLlKEbLPVkFaW2juNUYqc4ms/spF2V1A/P9k7oBCsrkI2D1wEzIwneh3c0i+9ko6tBBaquwnYUNBpRqIungz7sx4r2ehtuPqO8d/WYCybKbV12ohHdr/wVTFgP41sbeLw4h627F7psNFW4di9d4DbZkuLfRHyDV+xzwZuC8GRbVaKimeEn5fZOj8H2g9KA/n2prXusVUoY8YALPsvr6QlQvbnoFZofCx/CcoOjk29GGHZD1606xZtULuHxrBtPHzHIZt7sS1kI9+Q3d5h3veYzsaGH4Hrd+zCc0chW5ryczOxk0Fy9uljbcNK5gfbL3jCRlMrKzxX1cxscHLctTFNmvgLn7JNoKQ+GzfTuhOwvV5Pg0b2T//YPrLZuJcde/wExfS8Mtfb+OjlWPyYyaYipbpSy6CulHlA/cZ6cD0f7EgT09T/0KhqcSAfREVRhLWJcVZjz1m55lKGcWff2bNStWyTktlvZmREwIT2iEIAAAAASUVORK5CYII=">' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '' || chr(13) || '    <div class="container" style="top: 5cm; left: 1.5cm;">' || chr(13) || '        <label class="legend_headline">Légende</label>' || chr(13) || '        <!--Pour afficher la légende, utiliser id="map_legend"-->' || chr(13) || '        <div id="map_legend"></div>' || chr(13) || '    </div>' || chr(13) || '    <div class="container" style="top: 4cm; right: 1.1cm;">' || chr(13) || '        <!--Pour afficher la carte, utiliser id="map_image"-->' || chr(13) || '        <img id="map_image" src="images/transparent.png">' || chr(13) || '    </div>' || chr(13) || '' || chr(13) || '    <div class="container" style="top: 24.5cm; left: 1.7cm; z-index: 9;">' || chr(13) || '        <!-- Pour afficher l''overview utiliser id="map_overview-->' || chr(13) || '        <img id="map_overview">' || chr(13) || '    </div>' || chr(13) || '' || chr(13) || '' || chr(13) || '    <div id="footer_container" class="container" style="top: 26.7cm; left: 1.5cm">' || chr(13) || '        <div class="container" style="top: 0cm; right: 0cm;">' || chr(13) || '            <div class="footer_text">' || chr(13) || '                <label class="color_blue">Source(s):</label>' || chr(13) || '                ' || chr(13) || '                <label class="color_blue">{{sources}}</label>' || chr(13) || '            </div>' || chr(13) || '        </div>' || chr(13) || '        <div class="container" style="top: 0cm; left: 5.5cm;">' || chr(13) || '            <!-- Pour afficher l''échelle actuelle utiliser {{map_scale}}-->' || chr(13) || '            <div class="footer_text">' || chr(13) || '                <label class="color_blue"></label>' || chr(13) || '                ' || chr(13) || '                <label class="color_blue">Echelle: {{map_scale}}</label>' || chr(13) || '            </div>' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '</div>' WHERE name='Modèle par défaut';
+				INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut'), 'sources', true, 'Sources', 'Sources la carte', NULL);
+				UPDATE s_vitis.vm_translation SET translation='Éditable' WHERE translation='Modifiable';
+				CREATE OR REPLACE VIEW s_vmap.v_user_template AS  SELECT DISTINCT printtemplate.printtemplate_id,    printtemplate.name,    printtemplate.rt_format_id,    printtemplate.rt_orientation_id,    printtemplate.definition,    printtemplate.outputformats_id,    printtemplate.sql,    printtemplate.ressource_id,    printtemplate.business_object_id,    business_object.title AS business_object, group_id   FROM s_vmap.printtemplate   LEFT JOIN s_vmap.printtemplate_group on printtemplate.printtemplate_id = printtemplate_group.printtemplate_id   LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id::text = business_object.business_object_id::text;
+				ALTER TABLE s_vmap.v_user_template  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_user_template TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_user_template TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_user_template TO vmap_user;
+				-- PrintReport
+				CREATE TABLE s_vmap.printreport (printreport_id  SERIAL NOT NULL, name varchar(100) NOT NULL UNIQUE, rt_format_id varchar(2) NOT NULL, rt_orientation_id varchar(8) NOT NULL, outputformats_id varchar(255) NOT NULL, business_object_id varchar(100) NOT NULL, htmldefinition text NOT NULL, jsonobjects text NOT NULL, multiobject bool NOT NULL, PRIMARY KEY (printreport_id));
+				ALTER TABLE s_vmap.printreport ADD CONSTRAINT fk_printreport_rt_format FOREIGN KEY (rt_format_id) REFERENCES s_vmap.rt_format (rt_format_id);
+				ALTER TABLE s_vmap.printreport ADD CONSTRAINT fk_printreport_rt_orientation FOREIGN KEY (rt_orientation_id) REFERENCES s_vmap.rt_orientation (rt_orientation_id);
+				ALTER TABLE s_vmap.printreport ADD CONSTRAINT fk_printreport_rt_outputformats FOREIGN KEY (outputformats_id) REFERENCES s_vmap.rt_outputformats (outputformats_id);
+				ALTER TABLE s_vmap.printreport ADD CONSTRAINT fk_printreport_business_object FOREIGN KEY (business_object_id) REFERENCES s_vmap.business_object (business_object_id);
+				ALTER TABLE s_vmap.printreport  OWNER TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.printreport TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.printreport TO vmap_user;
+				CREATE VIEW s_vmap.v_printreport AS SELECT s_vmap.printreport.printreport_id, s_vmap.printreport.name, s_vmap.printreport.rt_format_id, s_vmap.printreport.rt_orientation_id, s_vmap.printreport.outputformats_id, s_vmap.printreport.business_object_id, s_vmap.printreport.htmldefinition, s_vmap.printreport.jsonobjects, s_vmap.printreport.multiobject, s_vmap.business_object.title AS business_object_title, s_vmap.business_object.id_field AS business_object_id_field, s_vmap.business_object."database" AS business_object_database, s_vmap.business_object."schema" AS business_object_schema, s_vmap.business_object."table" AS business_object_table, s_vmap.business_object.geom_column AS business_object_geom_column FROM s_vmap.business_object INNER JOIN s_vmap.printreport ON s_vmap.business_object.business_object_id = s_vmap.printreport.business_object_id INNER JOIN s_vmap.rt_orientation ON s_vmap.printreport.rt_orientation_id = s_vmap.rt_orientation.rt_orientation_id INNER JOIN s_vmap.rt_format ON s_vmap.printreport.rt_format_id = s_vmap.rt_format.rt_format_id INNER JOIN s_vmap.rt_outputformats ON s_vmap.printreport.outputformats_id = s_vmap.rt_outputformats.outputformats_id;
+				GRANT ALL ON TABLE s_vmap.v_printreport TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_printreport TO vmap_user;
+				INSERT INTO s_vmap.rt_outputformats(outputformats_id) VALUES ('doc');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Rapports', 'vmap_103');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_103', 'en', 'Reports');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_103', 'fr', 'Rapports');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('ID', 'vmap_104');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_104', 'en', 'ID');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_104', 'fr', 'ID');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Format', 'vmap_105');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_105', 'en', 'Format');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_105', 'fr', 'Format');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Orientation', 'vmap_106');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_106', 'en', 'Orientation');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_106', 'fr', 'Orientation');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Format de sortie', 'vmap_107');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_107', 'en', 'Output format');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_107', 'fr', 'Format de sortie');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Objet métier', 'vmap_108');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_108', 'en', 'Business object');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_108', 'fr', 'Objet métier');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Rapport', 'vmap_109');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_109', 'en', 'Report');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_109', 'fr', 'Rapport');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Add', 'vmap_110');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_110', 'en', 'Add report');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_110', 'fr', 'Ajouter un rapport');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Delete', 'vmap_111');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_111', 'en', 'Delete reports');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_111', 'fr', 'Supprimer les rapports');
+				INSERT INTO s_vitis.vm_string(string, string_id) VALUES ('Name', 'vmap_112');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_112', 'en', 'Name');
+				INSERT INTO s_vitis.vm_translation(translation_id, lang, translation) VALUES ('vmap_112', 'fr', 'Nom');
+				INSERT INTO s_vitis.vm_tab (mode_id, label_id, event, "index", ressource_id, edit_column, show_column, sorted_by, sorted_dir, name) VALUES ('vmap_business_object', 'vmap_103', 'loadList()', 1, 'vmap/printreports', 'editSectionForm', 'showSectionForm', 'printreport_id', 'ASC', 'vmap_business_object_printreport');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('printreport_id', 'TRUE', 'TRUE', 2, 124, 'left', 'vmap_104', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('name', 'TRUE', 'TRUE', 3, 124, 'left', 'vmap_112', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('rt_format_id', 'TRUE', 'TRUE', 4, 124, 'left', 'vmap_105', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('rt_orientation_id', 'TRUE', 'TRUE', 5, 124, 'left', 'vmap_106', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('outputformats_id', 'TRUE', 'TRUE', 6, 124, 'left', 'vmap_107', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_table_field(name, sortable, resizeable, index, width, align, label_id, tab_id, ressource_id) VALUES ('business_object_title', 'TRUE', 'TRUE', 7, 124, 'left', 'vmap_108', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), 'vmap/printreports');
+				INSERT INTO s_vitis.vm_section (label_id, name, index, event, template, tab_id, section_id, module) VALUES ('vmap_109', 'general', 1, '', 'workspaceListTpl.html', (SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_business_object_printreport'), nextval('s_vitis.seq_vm'), 'vmap');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ( 'add_smallFlexigrid', 'AddSectionForm', 'vmap_110', 'vmap/printreports', (select tab_id from s_vitis.vm_tab where name = 'vmap_business_object_printreport'));
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('deleteFlexigrid', 'DeleteSelection', 'vmap_111', 'vmap/printreports', (select tab_id from s_vitis.vm_tab where name = 'vmap_business_object_printreport'));
+				-- Fin PrintReport
+				INSERT INTO s_vitis."group" (group_id, name) VALUES ((SELECT nextval('s_vitis.seq_common')), 'Cadastre');
+				INSERT INTO s_vmap.layertheme (layertheme_id, name, description) VALUES ((SELECT nextval('s_vmap.seq_common')), 'Cadastre', NULL);
+				INSERT INTO s_vmap.maptheme (maptheme_id, name, description) VALUES ((SELECT nextval('s_vmap.seq_common')), 'Cadastre', NULL);
+				-- INSERT INTO s_vmap.service (service_id, service_type_id, name, description, url, key, service_type_version, thumbnail, lang, imagery) VALUES ((SELECT nextval('s_vmap.seq_common')), 'tilewms', 'Veremap', 'Cartes WMS Réseau électrique Mandelieu', 'http://[veremap_serveur]/cgi-bin/wmsmap?service=wms', NULL, '1.3.0', NULL, NULL, NULL);
+				-- INSERT INTO s_vmap.layer (layer_id, layertheme_id, service_id, name, description, layer_list, crs_list, bo_id, is_dynamic, is_filtered) VALUES ((SELECT nextval('s_vmap.seq_common')), (select layertheme_id from s_vmap.layertheme where name= 'Cadastre'), (select service_id from s_vmap.service where name= 'Veremap'), 'Cadastre', 'Ensemble des couches cadastrales fournies par défaut lors de l''installation du module cadastre de Veremap :' || chr(13) || '- Cadastre_batiment' || chr(13) || '- Cadastre_commune' || chr(13) || '- Cadastre_habillage_surfacique' || chr(13) || '- Cadastre_lieu_dit' || chr(13) || '- Cadastre_parcelle_text' || chr(13) || '- Cadastre_parcelle' || chr(13) || '- Cadastre_section', 'Cadastre_communes_vitis,Cadastre_parcelles_vitis,Cadastre_habillage_surfaciques_vitis,Cadastre_batiments_vitis,Cadastre_parcelle_texts_vitis,Cadastre_lieu_dits_vitis,Cadastre_sections_vitis', 'EPSG:2154', NULL, false, false);
+				-- INSERT INTO s_vmap.map (map_id, crs_id, name, description, extent, catalog_index, thumbnail, maptheme_id) VALUES (-1, 'EPSG:2154', 'Cadastre', 'Carte contenant le calque "Cadastre" et OSM', '-707041|6173507|2094580|7169553', NULL, 'images/imagettes/cadastre.jpg', (select maptheme_id from s_vmap.maptheme where name= 'Cadastre'));
+				-- INSERT INTO s_vmap.map_group (map_id, group_id) VALUES (-1, (select group_id from s_vitis."group" where name= 'Cadastre'));
+				-- INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES (-1, (select layer_id from s_vmap.layer where name= 'Cadastre'), 2, true, 100);
+				-- INSERT INTO s_vmap.map_layer (map_id, layer_id, layer_index, layer_visible, layer_opacity) VALUES (-1, (select layer_id from s_vmap.layer where name= 'Open Street Maps'), 1, true, 100);
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2016.03.00</version>
+			<code>
+				<![CDATA[
+				ALTER TABLE s_vmap.business_object ADD COLUMN index integer;
+				UPDATE s_vmap.service SET thumbnail='osm.png' WHERE thumbnail='images/imagettes/osm.png';
+				UPDATE s_vmap.service SET thumbnail='seamap.png' WHERE thumbnail='images/imagettes/seamap.png';
+				UPDATE s_vmap.service SET thumbnail='opencyclemap.png' WHERE thumbnail='images/imagettes/opencyclemap.png';
+				UPDATE s_vmap.service SET thumbnail='transport-294.png' WHERE thumbnail='images/imagettes/transport-294.png';
+				UPDATE s_vmap.service SET thumbnail='landscape-294.png' WHERE thumbnail='images/imagettes/landscape-294.png';
+				UPDATE s_vmap.service SET thumbnail='outdoors-294.png' WHERE thumbnail='images/imagettes/outdoors-294.png';
+				UPDATE s_vmap.service SET thumbnail='transport-dark-294.png' WHERE thumbnail='images/imagettes/transport-dark-294.png';
+				UPDATE s_vmap.map SET thumbnail='geobret.png' WHERE thumbnail='images/imagettes/osm.png';
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2016.03.01</version>
+			<code>
+				<![CDATA[
+				-- Utilisation du composant DocumentViewer (Vitis) pour l'apperçu des images dans les listes
+				UPDATE s_vitis.vm_table_field SET template='<div data-app-document-viewer data-path="signaletique/pictures" data-file="{{::row.entity[col.field]}}" data-max-popover="200" data-img-class="" data-popover-class="" ></div>' WHERE template='<div data-app-map-thumbnail-column="{{row.entity[col.field]}}"></div>';
+				UPDATE s_vitis.vm_table_field SET template='<div data-app-document-viewer data-path="signaletique/pictures" data-file="{{::row.entity[col.field]}}" data-max-popover="200" data-img-class="" data-popover-class="" ></div>' WHERE template='<div data-app-service-thumbnail-column="{{row.entity[col.field]}}"></div>';
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.01.00</version>
+			<code>
+				<![CDATA[
+				INSERT INTO s_vmap.rt_service_type(service_type_id) VALUES ('wmts');
+				ALTER TABLE s_vmap.service ADD COLUMN service_type_type varchar(30);
+				ALTER TABLE s_vmap.service ADD COLUMN service_options text;
+				ALTER TABLE s_vmap.layer ADD COLUMN matrix_set varchar(255);
+				ALTER TABLE s_vmap.layer ADD COLUMN layer_style varchar(255);
+				ALTER TABLE s_vmap.layer ADD COLUMN layer_format varchar(30);
+				ALTER TABLE s_vmap.layer ADD COLUMN layer_options text;
+				CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.business_object.title AS bo_title, s_vmap.business_object.id_field AS bo_id_field, s_vmap.business_object."database" AS bo_database, s_vmap.business_object."schema" AS bo_schema, s_vmap.business_object."table" AS bo_table, s_vmap.business_object.sql_summary AS bo_sql_summary, s_vmap.business_object.sql_list AS bo_sql_list, s_vmap.business_object.sorted_by AS bo_sorted_by, s_vmap.business_object.geom_column AS bo_geom_column, s_vmap.business_object.search_field AS bo_search_field, s_vmap.business_object.result_field AS bo_result_field, s_vmap.business_object.search_use_strict AS bo_search_use_strict, s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.bo_id, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.service.service_type_type, s_vmap.service.service_options FROM s_vmap.layer LEFT JOIN s_vmap.business_object ON s_vmap.layer.bo_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id;
+				GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+				INSERT INTO s_vmap.rt_service_type(service_type_id) VALUES ('xyz');
+				CREATE OR REPLACE VIEW s_vmap.v_map_layer AS SELECT v_layer.layer_id,v_layer.name,v_layer.theme_name,map_layer.layer_visible,map_layer.map_id,map_layer.layer_index,map_layer.layer_opacity,v_layer.layertheme_id,v_layer.service_id FROM s_vmap.v_layer,s_vmap.map_layer WHERE v_layer.layer_id=map_layer.layer_id;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO u_vitis;
+				GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+				GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+				ALTER TABLE s_vmap.v_map_layer  OWNER TO u_vitis;
+				-- Couche -> calque
+				UPDATE s_vitis.vm_string SET string = 'Onglet "Calques" du mode "vmap"' WHERE string_id = 'vmap_4';
+				UPDATE s_vitis.vm_string SET string = 'Titre de la section "calques de la carte" de l''onglet "vmap_map"' WHERE string_id = 'vmap_35';
+				UPDATE s_vitis.vm_string SET string = 'Onglet "Thèmes des calques" du mode "vmap"' WHERE string_id = 'vmap_36';
+				UPDATE s_vitis.vm_translation SET translation = 'Calques' WHERE translation_id = 'vmap_4' AND lang = 'fr';
+				UPDATE s_vitis.vm_translation SET translation = 'Ajouter un calque' WHERE translation_id = 'vmap_26' AND lang = 'fr';
+				UPDATE s_vitis.vm_translation SET translation = 'Supprimer les calques' WHERE translation_id = 'vmap_27' AND lang = 'fr';
+				UPDATE s_vitis.vm_translation SET translation = 'Calques de la carte' WHERE translation_id = 'vmap_35' AND lang = 'fr';
+				UPDATE s_vitis.vm_translation SET translation = 'Thèmes des calques' WHERE translation_id = 'vmap_36' AND lang = 'fr';
+				-- Armand le 30/01/2017 à 10:39
+				ALTER TABLE s_vmap.business_object ADD COLUMN add_form_size integer;
+				ALTER TABLE s_vmap.business_object ADD COLUMN edit_form_size integer;
+				ALTER TABLE s_vmap.business_object ADD COLUMN display_form_size integer;
+				UPDATE s_vmap.business_object SET add_form_size=1;
+				UPDATE s_vmap.business_object SET edit_form_size=1;
+				UPDATE s_vmap.business_object SET display_form_size=1;
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.02.00</version>
+			<code>
+				<![CDATA[
+				-- Armand le 01/03/2017
+				ALTER TABLE s_vmap.service ADD COLUMN service_vm4ms boolean;
+				-- Armand le 15/02/2017 à 17:31: ajout du bouton importer
+				UPDATE s_vitis.vm_table_field SET align='left', width=300 WHERE table_field_id=147;
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Button d''ajout de l''onglet vmap_map', 'vmap_113');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_113', 'fr', 'Importer');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_113', 'en', 'Import');
+				INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'importBusinessObject', 'vmap_113', 'vmap/businessobjects', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_business_object'));
+				-- Armand le 17/03/2017: libéllés des coordsys
+				UPDATE s_vmap.rt_crs SET name='[EPSG:2154]-RGF93.Lambert-93' WHERE crs_id='EPSG:2154';
+				UPDATE s_vmap.rt_crs SET name='[EPSG:3857]-WGS84.Spherical Mercator' WHERE crs_id='EPSG:3857';
+				UPDATE s_vmap.rt_crs SET name='[EPSG:4326]-WGS84.LL' WHERE crs_id='EPSG:4326';
+				UPDATE s_vitis.vm_table_field SET width='240' WHERE name='crs_name' and ressource_id='vmap/maps';
+				-- Armand le 31/03/2017: revoke grant vitis_user vitis_admin
+				REVOKE ALL PRIVILEGES ON s_vmap.v_map FROM vitis_admin;
+				REVOKE ALL PRIVILEGES ON s_vmap.v_map FROM vitis_user;
+				ALTER TABLE s_vmap.v_printreport  OWNER TO u_vitis;
+				-- Armand le 31/03/2017
+				DELETE FROM s_vitis.vm_table_field WHERE tab_id=97 AND name='last_update_date';
+				DELETE FROM s_vitis.vm_table_field WHERE tab_id=97 AND name='last_update_author';
+                                -- Frédéric le 03/04/2017 à 10:06
+				INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Champ bo_id de l''onglet vmap_layer', 'vmap_114');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_114', 'fr', 'Objet métier');
+				INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_114', 'en', 'Business object');
+				INSERT INTO s_vitis.vm_table_field (name, sortable, resizeable, "index", width, align, label_id, ressource_id, tab_id) VALUES ('bo_id', true, true, 7,  200, 'left', 'vmap_114', 'vmap/layers' ,(SELECT tab_id FROM s_vitis.vm_tab WHERE name='vmap_layer'));
+                                -- Frédéric le 07/04/2017 à 11:41
+				CREATE OR REPLACE VIEW s_vmap.v_user_printstyle AS SELECT * FROM s_vmap.printstyle where printstyle_id IN (SELECT printstyle_id FROM s_vmap.user_printstyle where user_id = (SELECT user_id FROM s_vitis.user where login = current_user));
+				-- Armand le 19/04/2016
+				UPDATE s_vmap.service SET url='https://geobretagne.fr/geoserver/audelor/wms' WHERE url='http://geobretagne.fr/geoserver/audelor/wms?service=wms';
+				-- UPDATE s_vmap.service SET url='http://[veremap_serveur]/cgi-bin/wmsmap' WHERE url='http://[veremap_serveur]/cgi-bin/wmsmap?service=wms';
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.02.01</version>
+			<code>
+				<![CDATA[
+					-- Sébastien le 05/05/2017
+					UPDATE s_vmap.maptheme SET maptheme_id = nextval('s_vmap.maptheme_maptheme_id_seq') WHERE name = 'Cadastre';
+					DELETE FROM s_vitis.vm_table_field WHERE "name" = 'crs_list' and ressource_id = 'vmap/layers';
+                    -- Frédéric le 08/06/2017 à 10:14
+                    DELETE FROM s_vitis.vm_table_field WHERE "name" = 'last_update_date' and ressource_id = 'vmap/businessobjects';
+                    DELETE FROM s_vitis.vm_table_field WHERE "name" = 'last_update_author' and ressource_id = 'vmap/businessobjects';
+                    DELETE FROM s_vitis.vm_translation WHERE translation_id IN ('vmap_56', 'vmap_57');
+                    DELETE FROM s_vitis.vm_string WHERE string_id IN ('vmap_56', 'vmap_57');
+                    -- Armand le 22/06/2017 à 16:46
+                    UPDATE s_vmap.layer SET bo_id = NULL WHERE bo_id IS NOT NULL AND NOT EXISTS(SELECT business_object_id FROM s_vmap.business_object WHERE business_object_id = bo_id);
+                    ALTER TABLE s_vmap.layer ADD CONSTRAINT fk_s_vmap_bo_layer FOREIGN KEY (bo_id) REFERENCES s_vmap.business_object (business_object_id);
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.03.00</version>
+			<code>
+				<![CDATA[
+					DROP VIEW s_vmap.v_template;
+					DROP VIEW s_vmap.v_user_template;
+					DROP VIEW s_vmap.v_printreport;
+					DROP VIEW s_vmap.v_map_layer;
+					DROP VIEW s_vmap.v_layer;
+					ALTER TABLE s_vmap.business_object   ALTER COLUMN "table" TYPE character varying(63);
+					ALTER TABLE s_vmap.business_object   ALTER COLUMN business_object_id TYPE character varying(100);
+					CREATE OR REPLACE VIEW s_vmap.v_layer AS  SELECT layertheme.name AS theme_name,    service.name AS service_name,    service.service_type_id,    service.url AS service_url,    service.key AS service_key,    service.service_type_version,    service.thumbnail AS service_thumbnail,    service.lang AS service_lang,    service.imagery AS service_imagery,    business_object.title AS bo_title,    business_object.id_field AS bo_id_field,    business_object.database AS bo_database,    business_object.schema AS bo_schema,   business_object."table" AS bo_table,    business_object.sql_summary AS bo_sql_summary,    business_object.sql_list AS bo_sql_list,    business_object.sorted_by AS bo_sorted_by,    business_object.geom_column AS bo_geom_column,    business_object.search_field AS bo_search_field,    business_object.result_field AS bo_result_field,  business_object.search_use_strict AS bo_search_use_strict,    layer.layer_id,    layer.layertheme_id,    layer.service_id,    layer.name,    layer.description,    layer.layer_list,    layer.crs_list,    layer.bo_id,    layer.is_dynamic,    layer.is_filtered,    layer.matrix_set,    layer.layer_style,    layer.layer_format,    layer.layer_options,    service.service_type_type,    service.service_options   FROM s_vmap.layer   LEFT JOIN s_vmap.business_object ON layer.bo_id::text = business_object.business_object_id::text   LEFT JOIN s_vmap.layertheme ON layer.layertheme_id = layertheme.layertheme_id   JOIN s_vmap.service ON layer.service_id = service.service_id;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vitis_admin;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vitis_user;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_map_layer AS  SELECT v_layer.layer_id,    v_layer.name,    v_layer.theme_name,    map_layer.layer_visible,    map_layer.map_id,    map_layer.layer_index,    map_layer.layer_opacity,    v_layer.layertheme_id,    v_layer.service_id   FROM s_vmap.v_layer,    s_vmap.map_layer  WHERE v_layer.layer_id = map_layer.layer_id;
+					ALTER TABLE s_vmap.v_map_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_map_layer TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+					GRANT ALL ON TABLE s_vmap.v_map_layer TO vitis_admin;
+					GRANT SELECT ON TABLE s_vmap.v_map_layer TO vitis_user;
+					CREATE OR REPLACE VIEW s_vmap.v_printreport AS SELECT printreport.printreport_id,    printreport.name,    printreport.rt_format_id,    printreport.rt_orientation_id,    printreport.outputformats_id,    printreport.business_object_id,    printreport.htmldefinition,    printreport.jsonobjects,    printreport.multiobject,    business_object.title AS business_object_title,    business_object.id_field AS business_object_id_field,    business_object.database AS business_object_database,    business_object.schema AS business_object_schema,    business_object."table" AS business_object_table,    business_object.geom_column AS business_object_geom_column   FROM s_vmap.business_object   JOIN s_vmap.printreport ON business_object.business_object_id::text = printreport.business_object_id::text   JOIN s_vmap.rt_orientation ON printreport.rt_orientation_id::text = rt_orientation.rt_orientation_id::text   JOIN s_vmap.rt_format ON printreport.rt_format_id::text = rt_format.rt_format_id::text   JOIN s_vmap.rt_outputformats ON printreport.outputformats_id::text = rt_outputformats.outputformats_id::text;
+					ALTER TABLE s_vmap.v_printreport  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_printreport TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_printreport TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_printreport TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_user_template AS  SELECT DISTINCT printtemplate.printtemplate_id,    printtemplate.name,    printtemplate.rt_format_id,    printtemplate.rt_orientation_id,    printtemplate.definition,    printtemplate.outputformats_id,    printtemplate.sql,    printtemplate.ressource_id,    printtemplate.business_object_id,    business_object.title AS business_object,    printtemplate_group.group_id   FROM s_vmap.printtemplate   LEFT JOIN s_vmap.printtemplate_group ON printtemplate.printtemplate_id = printtemplate_group.printtemplate_id   LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id::text = business_object.business_object_id::text;
+					ALTER TABLE s_vmap.v_user_template  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_user_template TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_user_template TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_user_template TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_template AS  SELECT printtemplate.printtemplate_id,    printtemplate.name,    printtemplate.rt_format_id,    printtemplate.rt_orientation_id,    printtemplate.definition,    printtemplate.outputformats_id,    printtemplate.sql,    printtemplate.ressource_id,    printtemplate.business_object_id,    business_object.title AS business_object   FROM s_vmap.printtemplate   LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id::text = business_object.business_object_id::text;
+					ALTER TABLE s_vmap.v_template  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_template TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_template TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_template TO vmap_user;
+                    -- Frédéric le 25/07/2017 à 14:43
+                    UPDATE s_vmap.layer SET bo_id = NULL WHERE bo_id IN(SELECT bo_id FROM s_vmap.layer WHERE bo_id NOT IN (SELECT business_object_id FROM s_vmap.business_object));
+                    ALTER TABLE s_vmap.layer DROP CONSTRAINT IF EXISTS fk_layer_business_object;
+                    ALTER TABLE s_vmap.layer ADD CONSTRAINT fk_layer_business_object FOREIGN KEY (bo_id) REFERENCES s_vmap.business_object (business_object_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL;
+                     -- Armand le 31/07/2017 à 17:13: ajout de la colonne selection_buffer
+                    ALTER TABLE s_vmap.business_object ADD COLUMN selection_buffer double precision;
+                    CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.business_object.title AS bo_title, s_vmap.business_object.id_field AS bo_id_field, s_vmap.business_object."database" AS bo_database, s_vmap.business_object."schema" AS bo_schema, s_vmap.business_object."table" AS bo_table, s_vmap.business_object.sql_summary AS bo_sql_summary, s_vmap.business_object.sql_list AS bo_sql_list, s_vmap.business_object.sorted_by AS bo_sorted_by, s_vmap.business_object.geom_column AS bo_geom_column, s_vmap.business_object.search_field AS bo_search_field, s_vmap.business_object.result_field AS bo_result_field, s_vmap.business_object.search_use_strict AS bo_search_use_strict, s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.bo_id, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.service.service_type_type, s_vmap.service.service_options, s_vmap.business_object.selection_buffer AS bo_selection_buffer FROM s_vmap.layer LEFT JOIN s_vmap.business_object ON s_vmap.layer.bo_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					UPDATE s_vmap.business_object SET selection_buffer=5;
+					-- Armand le 18/08/2017 à 11h34 Associer plusieurs objets métiers à un calque
+					CREATE TABLE s_vmap.layer_businessobject (layer_id int4 NOT NULL, business_object_id varchar(100) NOT NULL, PRIMARY KEY (layer_id, business_object_id));
+					ALTER TABLE s_vmap.layer_businessobject ADD CONSTRAINT fk_business_object_id_layer_businessobject FOREIGN KEY (business_object_id) REFERENCES s_vmap.business_object (business_object_id);
+					ALTER TABLE s_vmap.layer_businessobject ADD CONSTRAINT fk_layer_id_layer_businessobject FOREIGN KEY (layer_id) REFERENCES s_vmap.layer (layer_id);
+					INSERT INTO s_vmap.layer_businessobject (layer_id, business_object_id) SELECT layer_id, bo_id FROM s_vmap.layer WHERE layer.bo_id IS NOT NULL;
+					COMMENT ON COLUMN s_vmap.layer.bo_id IS 'DEPRECATED';
+					ALTER TABLE s_vmap.layer_businessobject  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.layer_businessobject TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.layer_businessobject TO vmap_user;
+					DROP VIEW s_vmap.v_map_layer;
+					DROP VIEW s_vmap.v_layer;
+					CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, string_agg(layer_businessobject.business_object_id, '|') AS bo_id_list FROM s_vmap.layer LEFT JOIN s_vmap.layer_businessobject ON s_vmap.layer.layer_id = s_vmap.layer_businessobject.layer_id LEFT JOIN s_vmap.business_object ON s_vmap.layer_businessobject.business_object_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id GROUP BY s_vmap.layer.layer_id, s_vmap.layertheme.name, s_vmap.service.name, s_vmap.service.service_type_id, s_vmap.service.url, s_vmap.service."key", s_vmap.service.service_type_version, s_vmap.service.thumbnail, s_vmap.service.lang, s_vmap.service.imagery, s_vmap.service.service_type_type, s_vmap.service.service_options;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_map_layer AS  SELECT v_layer.layer_id,    v_layer.name,    v_layer.theme_name,    map_layer.layer_visible,    map_layer.map_id,    map_layer.layer_index,    map_layer.layer_opacity,    v_layer.layertheme_id,    v_layer.service_id   FROM s_vmap.v_layer,    s_vmap.map_layer  WHERE v_layer.layer_id = map_layer.layer_id;
+					ALTER TABLE s_vmap.v_map_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_map_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_map_layer TO vmap_user;
+					ALTER TABLE s_vmap.layer DROP CONSTRAINT IF EXISTS fk_layer_business_object;
+					ALTER TABLE s_vmap.layer DROP CONSTRAINT IF EXISTS fk_s_vmap_bo_layer;
+					-- Admand 23/08/2017: utilisation de plusieurs bo pour un seul calque
+					UPDATE s_vitis.vm_table_field SET name='bo_id_list' where name='bo_id' and ressource_id='vmap/layers';
+					-- Armand 31/08/2017 16h51: Ajout du cadastre light
+					ALTER TABLE s_vmap.module ADD COLUMN rolname_list varchar(255);
+					UPDATE s_vmap.module SET rolname_list='vmap_cadastre_user|vmap_cadastre_light_user' WHERE module_id = 'cadastre';
+					-- Armand 19/09/2017 15:46 Le champ business_object_id de la table s_vmap.printtemplate est trop court 50 au lieu de 100.
+					DROP VIEW s_vmap.v_template;
+					DROP VIEW s_vmap.v_user_template;
+					ALTER TABLE s_vmap.printtemplate ALTER COLUMN business_object_id TYPE character varying(100);
+					CREATE OR REPLACE VIEW s_vmap.v_template AS  SELECT printtemplate.printtemplate_id,    printtemplate.name,    printtemplate.rt_format_id,    printtemplate.rt_orientation_id,    printtemplate.definition,    printtemplate.outputformats_id,    printtemplate.sql,    printtemplate.ressource_id,    printtemplate.business_object_id,    business_object.title AS business_object   FROM s_vmap.printtemplate   LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id::text = business_object.business_object_id::text;
+					ALTER TABLE s_vmap.v_template  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_template TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_template TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_template TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_user_template AS  SELECT DISTINCT printtemplate.printtemplate_id,    printtemplate.name,    printtemplate.rt_format_id,    printtemplate.rt_orientation_id,    printtemplate.definition,    printtemplate.outputformats_id,    printtemplate.sql,    printtemplate.ressource_id,    printtemplate.business_object_id,    business_object.title AS business_object,    printtemplate_group.group_id   FROM s_vmap.printtemplate   LEFT JOIN s_vmap.printtemplate_group ON printtemplate.printtemplate_id = printtemplate_group.printtemplate_id   LEFT JOIN s_vmap.business_object ON printtemplate.business_object_id::text = business_object.business_object_id::text;
+					ALTER TABLE s_vmap.v_user_template  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_user_template TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_user_template TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_user_template TO vmap_user;
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.03.01</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.03.02</version>
+			<code>
+				<![CDATA[
+					-- Frédéric 07/11/2017 à 09:58
+                    ALTER TABLE s_vmap.layer_businessobject DROP CONSTRAINT IF EXISTS fk_business_object_id_layer_businessobject;
+                    ALTER TABLE s_vmap.layer_businessobject ADD CONSTRAINT fk_business_object_id_layer_businessobject FOREIGN KEY (business_object_id) REFERENCES s_vmap.business_object (business_object_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;
+					-- Frédéric 07/11/2017 à 15:23
+                    UPDATE s_vitis.vm_table_button SET event = 'deleteVmapBusinessObject' WHERE label_id = 'vmap_59';
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.03.03</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2017.04.00</version>
+			<code>
+				<![CDATA[
+					-- Armand 28/12/2017 09:59 ajout des colonnes service_login et service_password pour pouvoir donner des mots de passe à n'importe quel type de service
+					ALTER TABLE s_vmap.service ADD COLUMN service_login varchar(100);
+					ALTER TABLE s_vmap.service ADD COLUMN service_password varchar(100);
+					CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, string_agg(layer_businessobject.business_object_id, '|') AS bo_id_list, s_vmap.service.service_login, s_vmap.service.service_password FROM s_vmap.layer LEFT JOIN s_vmap.layer_businessobject ON s_vmap.layer.layer_id = s_vmap.layer_businessobject.layer_id LEFT JOIN s_vmap.business_object ON s_vmap.layer_businessobject.business_object_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id GROUP BY s_vmap.layer.layer_id, s_vmap.layertheme.name, s_vmap.service.name, s_vmap.service.service_type_id, s_vmap.service.url, s_vmap.service."key", s_vmap.service.service_type_version, s_vmap.service.thumbnail, s_vmap.service.lang, s_vmap.service.imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, s_vmap.service.service_login, s_vmap.service.service_password;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.01.00</version>
+			<code>
+				<![CDATA[
+                    -- Armand 19/01/2018 Ajouter un champ "Titre des formulaires" pour les infobules et les formulaires objet métier #3083
+                    ALTER TABLE s_vmap.business_object ADD COLUMN formtitle varchar(255);
+                    UPDATE s_vmap.business_object SET formtitle=title;
+                    ALTER TABLE s_vmap.business_object ADD COLUMN summarytitle varchar(255);
+                    UPDATE s_vmap.business_object SET summarytitle=title;
+                    -- Armand 26/01/2018 Appliquer le filtre lié au calque aux objets métiers liés à ce dernier #3144
+                    ALTER TABLE s_vmap.layer ADD COLUMN is_bo_filtered boolean;
+                    UPDATE s_vmap.layer set is_bo_filtered=true;
+                    CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, string_agg(layer_businessobject.business_object_id, '|') AS bo_id_list, s_vmap.service.service_login, s_vmap.service.service_password, s_vmap.layer.is_bo_filtered FROM s_vmap.layer LEFT JOIN s_vmap.layer_businessobject ON s_vmap.layer.layer_id = s_vmap.layer_businessobject.layer_id LEFT JOIN s_vmap.business_object ON s_vmap.layer_businessobject.business_object_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id GROUP BY s_vmap.layer.layer_id, s_vmap.layertheme.name, s_vmap.service.name, s_vmap.service.service_type_id, s_vmap.service.url, s_vmap.service."key", s_vmap.service.service_type_version, s_vmap.service.thumbnail, s_vmap.service.lang, s_vmap.service.imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, s_vmap.service.service_login, s_vmap.service.service_password;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					-- Armand 02/02/2018 Ajouter un lien vers la doc ReadTheDocs
+					INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Documentation ReadTheDocs', 'vmap_115');
+					INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_115', 'fr', 'Documentation');
+					INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_115', 'en', 'Documentation');
+					INSERT INTO s_vitis.vm_section(label_id, name, index, event, tab_id, template, ressource_id, module) VALUES ('vmap_115','administration',1,'Javascript:reloadSectionForm',(select tab_id from s_vitis.vm_tab where mode_id='help'),'modules/vmap/template/vitis/documentationHelpTpl.html','','vmap');
+                    -- Armand 07/02/2018 suppression des contraines d'unicité sur les nom des services, calques, carte, themes des calques, thermes des cartes
+                    DROP INDEX s_vmap.layer_name;
+                    CREATE INDEX layer_name ON s_vmap.layer (name);
+                    DROP INDEX s_vmap.service_name;
+                    CREATE INDEX service_name ON s_vmap.service (name);
+                    DROP INDEX s_vmap.map_name;
+                    CREATE INDEX map_name ON s_vmap.map (name);
+                    DROP INDEX s_vmap.maptheme_name;
+                    CREATE INDEX maptheme_name ON s_vmap.maptheme (name);
+                    DROP INDEX s_vmap.theme_name;
+                    CREATE INDEX theme_name ON s_vmap.layertheme (name);
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.01.01</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.02.00</version>
+			<code>
+				<![CDATA[
+					-- Armand le 27/03/2018 à 10:00: ajout du bouton emporter vex et renommage du bouton importer
+					UPDATE s_vitis.vm_string SET string='Bouton importer VEX' WHERE string_id='vmap_113';
+					UPDATE s_vitis.vm_translation SET translation='Importer VEX' WHERE translation_id='vmap_113' AND lang='fr';
+					UPDATE s_vitis.vm_translation SET translation='Import VEX' WHERE translation_id='vmap_113' AND lang='en';
+					INSERT INTO s_vitis.vm_string (string, string_id) VALUES ('Bouton exporter VEX', 'vmap_116');
+					INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_116', 'fr', 'Exporter VEX');
+					INSERT INTO s_vitis.vm_translation (translation_id, lang, translation) VALUES ('vmap_116', 'en', 'Export VEX');
+					INSERT INTO s_vitis.vm_table_button (button_class, event, label_id, ressource_id, tab_id) VALUES ('add_smallFlexigrid', 'exportBusinessObject', 'vmap_116', 'vmap/businessobjects', (SELECT tab_id FROM s_vitis.vm_tab WHERE name = 'vmap_business_object'));
+					-- Armand le 27/03/2018 à 11:40: renommage des fonctions "importBusinessObject" "exportBusinessObject" en "importVex" "exportVex"
+					UPDATE s_vitis.vm_table_button SET event='importVex' where event='importBusinessObject';
+					UPDATE s_vitis.vm_table_button SET event='exportVex' where event='exportBusinessObject';
+					-- Armand 04/04/2018 16:25: ajout de la colonne vm4ms_layer dans s_vmap.v_layer
+					CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, string_agg(layer_businessobject.business_object_id, '|') AS bo_id_list, s_vmap.service.service_login, s_vmap.service.service_password, s_vmap.layer.is_bo_filtered, s_vmap.service.service_vm4ms FROM s_vmap.layer LEFT JOIN s_vmap.layer_businessobject ON s_vmap.layer.layer_id = s_vmap.layer_businessobject.layer_id LEFT JOIN s_vmap.business_object ON s_vmap.layer_businessobject.business_object_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id GROUP BY s_vmap.layer.layer_id, s_vmap.layertheme.name, s_vmap.service.name, s_vmap.service.service_type_id, s_vmap.service.url, s_vmap.service."key", s_vmap.service.service_type_version, s_vmap.service.thumbnail, s_vmap.service.lang, s_vmap.service.imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, s_vmap.service.service_login, s_vmap.service.service_password, s_vmap.service.service_vm4ms;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					-- Armand 23/04/2018 15:36 ajout de la fonction UpdateAndTransformGeometrySRID
+					CREATE OR REPLACE FUNCTION public.updateandtransformgeometrysrid(catalogn_name CHARACTER varying, SCHEMA_NAME CHARACTER varying, TABLE_NAME CHARACTER varying, COLUMN_NAME CHARACTER varying, new_srid_in integer) RETURNS text AS $BODY$ DECLARE myrec RECORD; okay boolean; cname varchar; real_schema name; unknown_srid integer; new_srid integer := new_srid_in; BEGIN IF ( schema_name != '' ) THEN okay = false; FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP okay := true; END LOOP; IF ( okay <> true ) THEN RAISE EXCEPTION 'Invalid schema name'; ELSE real_schema = schema_name; END IF; ELSE SELECT INTO real_schema current_schema()::text; END IF; okay = false; FOR myrec IN SELECT type, coord_dimension FROM geometry_columns WHERE f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP okay := true; END LOOP; IF (NOT okay) THEN RAISE EXCEPTION 'column not found in geometry_columns table'; RETURN false; END IF; IF ( new_srid > 0 ) THEN IF ( SELECT count(*) = 0 from spatial_ref_sys where srid = new_srid ) THEN RAISE EXCEPTION 'invalid SRID: % not found in spatial_ref_sys', new_srid; RETURN false; END IF; ELSE unknown_srid := ST_SRID('POINT EMPTY'::geometry); IF ( new_srid != unknown_srid ) THEN new_srid := unknown_srid; RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid; END IF; END IF; IF postgis_constraint_srid(real_schema, table_name, column_name) IS NOT NULL THEN cname = 'enforce_srid_' || column_name; EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) || ' DROP constraint ' || quote_ident(cname); EXECUTE 'UPDATE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) || ' SET ' || quote_ident(column_name) || ' = ST_Transform(' || quote_ident(column_name) || ', ' || new_srid::text || ')'; EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD constraint ' || quote_ident(cname) || ' CHECK (st_srid(' || quote_ident(column_name) || ') = ' || new_srid::text || ')'; ELSE EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ALTER COLUMN ' || quote_ident(column_name) || ' TYPE geometry(' || postgis_type_name(myrec.type, myrec.coord_dimension, true) || ', ' || new_srid::text || ') USING ST_Transform(' || quote_ident(column_name) || ',' || new_srid::text || ');' ; END IF; RETURN real_schema || '.' || table_name || '.' || column_name ||' SRID changed to ' || new_srid::text; END; $BODY$ LANGUAGE PLPGSQL VOLATILE STRICT COST 100;
+					ALTER FUNCTION public.updateandtransformgeometrysrid(CHARACTER varying, CHARACTER varying, CHARACTER varying, CHARACTER varying, integer) OWNER TO u_vitis;
+					COMMENT ON FUNCTION public.updateandtransformgeometrysrid(CHARACTER varying, CHARACTER varying, CHARACTER varying, CHARACTER varying, integer) IS 'args: catalog_name, schema_name, table_name, column_name, srid - Updates the SRID of all features in a geometry column, geometry_columns metadata and srid. If it was enforced with constraints, the constraints will be updated with new srid constraint. If the old was enforced by type definition, the type definition will be changed.';
+					CREATE OR REPLACE FUNCTION public.updateandtransformgeometrysrid(CHARACTER varying, CHARACTER varying, CHARACTER varying, integer) RETURNS text AS $BODY$ DECLARE ret text; BEGIN SELECT updateandtransformgeometrysrid('',$1,$2,$3,$4) into ret; RETURN ret; END; $BODY$ LANGUAGE PLPGSQL VOLATILE STRICT COST 100;
+					ALTER FUNCTION public.updateandtransformgeometrysrid(CHARACTER varying, CHARACTER varying, CHARACTER varying, integer) OWNER TO u_vitis;
+					COMMENT ON FUNCTION public.updateandtransformgeometrysrid(CHARACTER varying, CHARACTER varying, CHARACTER varying, integer) IS 'args: schema_name, table_name, column_name, srid - Updates the SRID of all features in a geometry column, geometry_columns metadata and srid. If it was enforced with constraints, the constraints will be updated with new srid constraint. If the old was enforced by type definition, the type definition will be changed.';
+					-- Armand 26/04/2018 14:27 Ajout des colonnes min_edition_scale et max_edition_scale
+					ALTER TABLE s_vmap.business_object ADD COLUMN max_edition_scale numeric(255);
+					ALTER TABLE s_vmap.business_object ADD COLUMN min_edition_scale varchar(255);
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.02.01</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.02.02</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.03.00</version>
+			<code>
+				<![CDATA[
+					-- Armand le 09/07/2018 : ajout des colonnes permettant le GetFeatureInfo
+					ALTER TABLE s_vmap.layer ADD COLUMN is_queryable_getfeatureinfo boolean;
+					CREATE OR REPLACE VIEW s_vmap.v_layer AS SELECT s_vmap.layer.layer_id, s_vmap.layer.layertheme_id, s_vmap.layer.service_id, s_vmap.layer.name, s_vmap.layer.description, s_vmap.layer.layer_list, s_vmap.layer.crs_list, s_vmap.layer.is_dynamic, s_vmap.layer.is_filtered, s_vmap.layer.matrix_set, s_vmap.layer.layer_style, s_vmap.layer.layer_format, s_vmap.layer.layer_options, s_vmap.layertheme.name AS theme_name, s_vmap.service.name AS service_name, s_vmap.service.service_type_id, s_vmap.service.url AS service_url, s_vmap.service."key" AS service_key, s_vmap.service.service_type_version, s_vmap.service.thumbnail AS service_thumbnail, s_vmap.service.lang AS service_lang, s_vmap.service.imagery AS service_imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, string_agg(layer_businessobject.business_object_id, '|') AS bo_id_list, s_vmap.service.service_login, s_vmap.service.service_password, s_vmap.layer.is_bo_filtered, s_vmap.service.service_vm4ms, s_vmap.layer.is_queryable_getfeatureinfo FROM s_vmap.layer LEFT JOIN s_vmap.layer_businessobject ON s_vmap.layer.layer_id = s_vmap.layer_businessobject.layer_id LEFT JOIN s_vmap.business_object ON s_vmap.layer_businessobject.business_object_id = s_vmap.business_object.business_object_id LEFT JOIN s_vmap.layertheme ON s_vmap.layer.layertheme_id = s_vmap.layertheme.layertheme_id INNER JOIN s_vmap.service ON s_vmap.layer.service_id = s_vmap.service.service_id GROUP BY s_vmap.layer.layer_id, s_vmap.layertheme.name, s_vmap.service.name, s_vmap.service.service_type_id, s_vmap.service.url, s_vmap.service."key", s_vmap.service.service_type_version, s_vmap.service.thumbnail, s_vmap.service.lang, s_vmap.service.imagery, s_vmap.service.service_type_type, s_vmap.service.service_options, s_vmap.service.service_login, s_vmap.service.service_password, s_vmap.service.service_vm4ms;
+					ALTER TABLE s_vmap.v_layer  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_layer TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_layer TO vmap_user;
+					-- Armand le 07/09/2018 : Des formats A2 A1 A0 dans les impressions
+					INSERT INTO s_vmap.rt_format(rt_format_id) SELECT 'A2' WHERE NOT EXISTS (SELECT rt_format_id FROM s_vmap.rt_format WHERE rt_format_id = 'A2');
+					INSERT INTO s_vmap.rt_format(rt_format_id) SELECT 'A1' WHERE NOT EXISTS (SELECT rt_format_id FROM s_vmap.rt_format WHERE rt_format_id = 'A1');
+					INSERT INTO s_vmap.rt_format(rt_format_id) SELECT 'A0' WHERE NOT EXISTS (SELECT rt_format_id FROM s_vmap.rt_format WHERE rt_format_id = 'A0');
+				]]>
+			</code>
+		</query>
+		<query>
+			<type>update</type>
+			<version>2018.04.00</version>
+			<code>
+				<![CDATA[
+				]]>
+			</code>
+		</query>
+	</queriesCollection>
+</sqlQueries>
diff --git a/web_service/ws/Adresse.class.inc b/web_service/ws/Adresse.class.inc
deleted file mode 100755
index 9f907c3826dcaa673e6dbd158f5395a4e216f76b..0000000000000000000000000000000000000000
--- a/web_service/ws/Adresse.class.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-
-/**
- * \file Adresse.class.inc
- * \class Adresse
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Adresse php class
- *
- * This class defines operation for one Adresse
- * 
- */
-class Adresse extends Cadastre {
-
-    public $oError;
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array(oid, 'ID_COM', 'IDU_', 'ID_PAR', 'CCODEP', 'CCODIR', 'CCOCOM', 'CCOPRE', 'CCOSEC', 'DNUPLA', 'CENR', 'DCNTPA', 'DSRPAR', 'DNUPRO', 'JDATAT', 'DREFLF', 'GPDL', 'CPRSECR', 'CCOSECR', 'DNUPLAR', 'DNUPDL', 'GURBPA', 'DPARPI', 'CCOARP', 'GPARNF', 'GPARBAT', 'CCOVOI', 'CCORIV', 'CCOCIF', 'CODE_INSEE', 'ID_RIVOLI', 'ID_DNUPRO', 'DNVOIRI', 'DINDIC', 'L_NATURE_VOIE', 'DVOILIB');
-    }
-
-    /**
-     * @SWG\Get(path="/adresses/{ID_PAR}", 
-     *   tags={"Adresse"},
-     *   summary="Get Adresse",
-     *   description="Request to get Adresse by id",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_PAR",
-     *     in="path",
-     *     description="adresse id",
-     *     required=true,
-     *     type="integer",
-     *   format="int32"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/adresses")
-     *     )
-     *  )
-     */
-
-    /**
-     * get informations about Adresse
-     */
-    function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['adresse'], 'ID_PAR');
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Adresses.class.inc b/web_service/ws/Adresses.class.inc
deleted file mode 100755
index 351ba82f37f13831e4abcf0b88bef5e58ab77788..0000000000000000000000000000000000000000
--- a/web_service/ws/Adresses.class.inc
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-/**
- * \file Adresses.class.inc
- * \class Adresses
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Adresses php class
- *
- * This class defines Rest Api to Vmap Adresses
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'Adresse.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-class Adresses extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/adresses",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/adresses")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="Adresses",
-     *   description="Operations about cadastre"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array(oid, 'ID_COM', 'IDU_', 'ID_PAR', 'CCODEP', 'CCODIR', 'CCOCOM', 'CCOPRE', 'CCOSEC', 'DNUPLA', 'CENR', 'DCNTPA', 'DSRPAR', 'DNUPRO', 'JDATAT', 'DREFLF', 'GPDL', 'CPRSECR', 'CCOSECR', 'DNUPLAR', 'DNUPDL', 'GURBPA', 'DPARPI', 'CCOARP', 'GPARNF', 'GPARBAT', 'CCOVOI', 'CCORIV', 'CCOCIF', 'CODE_INSEE', 'ID_RIVOLI', 'ID_DNUPRO', 'DNVOIRI', 'DINDIC', 'L_NATURE_VOIE', 'DVOILIB');
-    }
-
-    /**
-     * @SWG\Get(path="/adresses",
-     *   tags={"Adresse"},
-     *   summary="Get Adresses",
-     *   description="Request to get Adresses",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="order_by",
-     *     in="query",
-     *     description="list of ordering fields",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sort_order",
-     *     in="query",
-     *     description="sort order",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="limit",
-     *     in="query",
-     *     description="number of element",
-     *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="offset",
-     *     in="query",
-     *     description="index of first element",
-     *     required=false,
-     *     type="string",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="attributs",
-     *     in="query",
-     *     description="list of attributs",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="filter",
-     *     in="query",
-     *     description="filter results",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="distinct",
-     *     in="query",
-     *     description="delete duplicates",
-     *     required=false,
-     *     type="boolean"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/adresses")
-     *     )
-     *  )
-     */
-
-    /**
-     * get Adresses
-     * @return  Adresses
-     */
-    function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['adresse'], 'ID_PAR');
-        return $aReturn['sMessage'];
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/BusinessObject.class.inc b/web_service/ws/BusinessObject.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..b3da1a450873ab4e1f76bae4ac4d0c60fe9c1f55
--- /dev/null
+++ b/web_service/ws/BusinessObject.class.inc
@@ -0,0 +1,201 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once 'Layers.class.inc';
+require_once 'BusinessObjectEvent.class.inc';
+require_once 'PrintReports.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file BusinessObject.class.inc
+ * \class BusinessObject
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the BusinessObject php class
+ *
+ * This class defines operation for one BusinessObject
+ *
+ */
+class BusinessObject extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale");
+    }
+
+    /**
+     * @SWG\Get(path="/businessobjects/{business_object_id}",
+     *   tags={"BusinessObjects"},
+     *   summary="Get BusinessObject",
+     *   description="Request to get BusinessObject by mode id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="id",
+     *     required=true,
+     *     type="string",
+     *   ),
+     *   @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about table businessobjects
+     */
+    function GET() {
+
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], "business_object", "business_object_id");
+
+        // Formulaire JSON
+        $this->aFields['json_form'] = array();
+        if (!empty($this->aFields['business_object_id']))
+            $businessObjectId = $this->aFields['business_object_id'];
+        else
+            $businessObjectId = '';
+        if (file_exists($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/published.json')) {
+            $form = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/published.json');
+            array_push($this->aFields['json_form'], json_decode($form));
+        }
+        if (file_exists($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/published.js')) {
+            $this->aFields['json_form_js'] = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/published.js';
+        }
+        if (file_exists($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/published.css')) {
+            $this->aFields['json_form_js'] = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/published.js';
+        }
+        if (!empty($this->aFields['database']) && $this->aFields['database'] != $this->oConnection->oBd->base) {
+            $sLogin = $this->oConnection->oBd->login;
+            $sPassword = $this->oConnection->oBd->mdp;
+            $this->oConnection->oBd = new Vm($sLogin, $sPassword, $this->aFields['database'], $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        if (!$this->oConnection->oBd->enErreur()) {
+            if (!empty($this->aFields['geom_column'])) {
+                $aGeomColumnsInfos = $this->getTableGeomColumnsInfos($this->aFields['schema'], $this->aFields['table']);
+                for ($i = 0; $i < count($aGeomColumnsInfos); $i++) {
+                    if ($aGeomColumnsInfos[$i]['f_geometry_column'] === $this->aFields['geom_column']) {
+                        $this->aFields['geom_type'] = $aGeomColumnsInfos[$i]['type'];
+                    }
+                }
+            }
+            $this->aFields['user_rights'] = $this->oConnection->getTableRights($this->aFields['schema'], $this->aFields['table']);
+            $this->aFields['list_fields'] = $this->getListFields();
+        }
+
+        if (!empty($sLogin) && isset($sPassword)) {
+            $this->oConnection->oBd = new Vm($sLogin, $sPassword, $this->aProperties['database'], $this->aProperties['server'], $this->aProperties['port'], $this->aProperties['sgbd'], $this->aProperties['page_encoding']);
+        }
+    }
+
+    /**
+     * Get the fields from the list
+     * @return array
+     */
+    function getListFields() {
+        $aFields = array();
+        if (!empty($this->aFields['sql_list'])) {
+            $sSql = $this->aFields['sql_list'] . ' limit 1';
+            $oResult = $this->oConnection->oBd->executeWithParams($sSql, array());
+            if (!$this->oConnection->oBd->enErreur()) {
+                while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                    foreach ($aLigne as $key => $value) {
+                        array_push($aFields, $key);
+                    }
+                }
+            }
+        }
+        return $aFields;
+    }
+
+    /**
+     * delete a business_object
+     */
+    function DELETE() {
+
+        $this->GET();
+        $bEventExists = false;
+        $bReportExists = false;
+        $bLayerExists = false;
+
+        // Test existance rapports
+        $aPath = Array('vmap', 'printreports');
+        $aValues = $this->aValues;
+        unset($aValues['my_vitis_id']);
+        // $aValues['filter'] = "business_object_id='" . $this->aFields['business_object_id'] . "'";
+        $aValues['filter'] = '{"column":"business_object_id","compare_operator":"=","value":"' . $this->aFields['business_object_id'] . '"}';
+        $oPrintReports = new PrintReports($aPath, $aValues, $this->aProperties, $this->oConnection);
+        $oPrintReports->GET();
+        if (count($oPrintReports->aObjects) > 0) {
+            $this->oError = new VitisError(1, 'ERROR_BO_DELETE_REPPORT');
+            $bReportExists = true;
+        }
+
+        // Test existance événement
+        if (isset($this->aFields['event_id']) && !empty($this->aFields['event_id'])) {
+            $aPath = Array('vmap', 'businessobjectevents', $this->aFields['event_id']);
+            $aValues = $this->aValues;
+            $aValues['my_vitis_id'] = $this->aFields['event_id'];
+            $oEvent = new BusinessObjectEvent($aPath, $aValues, $this->aProperties, $this->oConnection);
+            $oEvent->GET();
+
+            // L'événement existe
+            if (isset($oEvent->aFields['event_id']) && !empty($oEvent->aFields['event_id'])) {
+                $this->oError = new VitisError(1, 'ERROR_BO_DELETE_EVENT');
+                $bEventExists = true;
+            }
+        }
+
+        // Des-associe les objets métiers de la couche
+        require $this->sRessourcesFile;
+        $aSQLParams = array(
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'business_object_id' => array('value' => $this->aValues['my_vitis_id'], 'type' => 'number')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($aSql['deleteAssociatedLayers'], $aSQLParams);
+
+        // Suppression objet
+        if (!$bEventExists && !$bReportExists && !$bLayerExists) {
+            $this->aFields = array();
+            $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'business_object', 'business_object_id', $this->aValues['my_vitis_id'], 'text');
+            if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            } else {
+                $this->aFields['business_object_id'] = $this->aValues['my_vitis_id'];
+            }
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/BusinessObjectEvent.class.inc b/web_service/ws/BusinessObjectEvent.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..74ac6871fe101be190412dba29fd619a2f3b690a
--- /dev/null
+++ b/web_service/ws/BusinessObjectEvent.class.inc
@@ -0,0 +1,86 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file BusinessObjectEvent.class.inc
+ * \class BusinessObjectEvent
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the BusinessObjectEvent php class
+ *
+ * This class defines operation for one BusinessObjectEvent
+ * 
+ */
+class BusinessObjectEvent extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("event_id", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/businessobjectevents/{event_id}", 
+     *   tags={"BusinessObjectEvents"},
+     *   summary="Get BusinessObjectEvent",
+     *   description="Request to get event of business object by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="event_id",
+     *     in="path",
+     *     description="event id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevent")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about businessobjectevents
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'event', 'event_id');
+    }
+
+    /**
+     * delete a businessobjectevent
+     */
+    function DELETE() {
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'event', 'event_id', $this->aValues['my_vitis_id'], 'text');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $this->oConnection->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields['event_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/BusinessObjectEvents.class.inc b/web_service/ws/BusinessObjectEvents.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..04b352a95b99134e00e56ea63842ac5908920c38
--- /dev/null
+++ b/web_service/ws/BusinessObjectEvents.class.inc
@@ -0,0 +1,289 @@
+<?php
+
+/**
+ * \file BusinessObjectEvents.class.inc
+ * \class BusinessObjectEvents
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the BusinessObjectEvents php class
+ *
+ * This class defines Rest Api to Vmap BusinessObjectEvents
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'BusinessObjectEvent.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class BusinessObjectEvents extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/businessobjectevents",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="BusinessObjectEvents",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("event_id", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/businessobjectevents",
+     *   tags={"BusinessObjectEvents"},
+     *   summary="Get BusinessObjectEvents",
+     *   description="Request to get BusinessObjectEvents",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *     )
+     *  )
+     */
+
+    /**
+     * get BusinessObjectEvents
+     * @return the array of objects
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'event', 'event_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/businessobjectevents",
+     *   tags={"BusinessObjectEvents"},
+     *   summary="Add businessobjectevent",
+     *   description="Request to add a businessobjectevent",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="event_id",
+     *     in="formData",
+     *     description="event id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="event description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert businessobjectevent
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'event', '', 'event_id');
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/businessobjectevents/{event_id}",
+     *   tags={"BusinessObjectEvents"},
+     *   summary="Update BusinessObjectEvent",
+     *   description="Request to update businessobjectevent",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="event_id",
+     *     in="path",
+     *     description="event id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="event description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify businessobjectevent
+     * @return array containing the status and the message
+     */
+    function PUT() {        
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'event', 'event_id');
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Delete(path="/businessobjectevents/",
+     *   tags={"BusinessObjectEvents"},
+     *   summary="delete BusinessObjectEvent",
+     *   description="Request to delete BusinessObjectEvent",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="event id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/businessobjectevents/{event_id}",
+     *   tags={"BusinessObjectEvents"},
+     *   summary="delete BusinessObjectEvent",
+     *   description="Request to delete BusinessObjectEvent",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="event_id",
+     *     in="path",
+     *     description="event id",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjectevents")
+     *     )
+     *  )
+     */
+    
+    /**
+     * delete businessobjectevent
+     * @return id of businessobjectevent deleted or error object if a businessobjectevent is not deleted
+     */
+    function DELETE() {        
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'event', 'event_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/BusinessObjects.class.inc b/web_service/ws/BusinessObjects.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..413f93e43ebbc728cbc4600f84d2cc8d85d05249
--- /dev/null
+++ b/web_service/ws/BusinessObjects.class.inc
@@ -0,0 +1,1491 @@
+<?php
+
+/**
+ * \file BusinessObjects.class.inc
+ * \class BusinessObjects
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the BusinessObjects php class
+ *
+ * This class defines Rest Api to Vitis businessobjects
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once 'BusinessObject.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+class BusinessObjects extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/businessobjects",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/businessobjects")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="BusinessObjects",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale");
+    }
+
+    /**
+     * @SWG\Get(path="/businessobjects",
+     *   tags={"BusinessObjects"},
+     *   summary="Get BusinessObjects",
+     *   description="Request to get BusinessObjects",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/businessobjects/{business_object_id}/fields",
+     *   tags={"BusinessObjects"},
+     *   summary="BusinessObject table fields",
+     *   description="Request to get the business object table fields",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/businessobjects/{business_object_id}/form/{form}",
+     *   tags={"BusinessObjects"},
+     *   summary="Query BusinessObject",
+     *   description="Request to query the business object",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form name (default, published, custom)",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+
+    /**
+     * get BusinessObjects
+     * @return BusinessObjects
+     */
+    function GET() {
+
+        // /businessobjects/{business_object_id}/form/{form}
+        if (isset($this->aPath[4])) {
+            $businessObjectId = $this->aPath[2];
+            $formName = $this->aPath[4];
+            $form = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/' . $formName . '.json');
+
+            if (is_file($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/' . $formName . '.js')) {
+                $jsContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/' . $formName . '.js');
+            } else {
+                $jsContent = false;
+            }
+            if (is_file($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/' . $formName . '.css')) {
+                $cssContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $businessObjectId . '/forms/ressources/' . $formName . '.css');
+            } else {
+                $cssContent = false;
+            }
+
+            $output = array(json_decode($form), $jsContent, $cssContent);
+            return json_encode($output);
+        }
+        // /businessobjects/{business_object_id}/fields
+        else if (isset($this->aPath[3])) {
+
+            // Objet BusinessObject correspondant
+            $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+            $oBusinessObject->GET();
+
+            // Paramètres retenus dans le business object
+            $bo_title = $oBusinessObject->aFields['title'];
+            $bo_database = $oBusinessObject->aFields['database'];
+            $bo_schema = $oBusinessObject->aFields['schema'];
+            $bo_table = $oBusinessObject->aFields['table'];
+            $bo_id_field = $oBusinessObject->aFields['id_field'];
+            $geom_column = $oBusinessObject->aFields['geom_column'];
+
+            // Connexion à la base de donées
+            if (!empty($bo_database) && $bo_database != $this->oConnection->oBd->base) {
+                $sLogin = $this->oConnection->oBd->login;
+                $sPassword = $this->oConnection->oBd->mdp;
+                $this->oConnection->oBd = new Vm($sLogin, $sPassword, $bo_database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+            }
+
+            $oForm = new Form($this->aProperties, $this->oConnection);
+            $aTableColumns = $oForm->getTableColumns($bo_schema, $bo_table);
+            $aRows = $oForm->generateRowsByTableColumns($aTableColumns);
+
+            return json_encode($aRows);
+        }
+        // /businessobjects/{business_object_id}
+        else {
+            $aReturn = $this->genericGet($this->aProperties['schema_vmap'], "business_object", "business_object_id");
+            return $aReturn['sMessage'];
+        }
+    }
+
+    /**
+     * @SWG\Post(path="/businessobjects",
+     *   tags={"BusinessObjects"},
+     *   summary="Add business_object",
+     *   description="Request to add a business_object",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="title",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="database",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="schema",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="table",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="id_field",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sql_summary",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sql_list",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sorted_by",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_column",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="search_field",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_field",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="search_use_strict",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="event_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="index",
+     *     in="query",
+     *     description="",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="add_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="edit_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="display_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     * )
+     */
+    /**
+     * @SWG\Post(path="/businessobjects/package_definition",
+     *   tags={"BusinessObjects"},
+     *   summary="Add business_object",
+     *   description="Request to add a business_object",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="package_definition",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     * )
+     */
+    /**
+     * @SWG\Post(path="/businessobjects/data_model",
+     *   tags={"BusinessObjects"},
+     *   summary="Add business_object",
+     *   description="Request to add a business_object",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="data_model",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     * )
+     */
+    /**
+     * @SWG\Post(path="/businessobjects/{business_object_id}/form/{form}",
+     *   tags={"BusinessObjects"},
+     *   summary="Add business_object",
+     *   description="Request to generate a business_object form",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business_object_id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form name (default, published, custom)",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="fields",
+     *     in="formData",
+     *     description="list of fields separed by | ",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     * )
+     */
+
+    /**
+     * insert business_object
+     * @return array containing the status and the message
+     */
+    function POST() {
+        if (isset($this->oConnection->oError) && !empty($this->oConnection->oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (!in_array('vmap_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (isset($this->aPath[4])) {
+            $sBusinessObjectId = $this->aPath[2];
+            $sFormName = $this->aPath[4];
+            $aFields = explode("|", $this->aValues['fields']);
+            return $this->generateBusinessObjectForm($sBusinessObjectId, $sFormName, $aFields, $this->aValues['label']);
+        } else {
+
+            if ($this->aPath[2] === 'package_definition') {
+                // Importe le dossier dans /tmp et renvoie son contenu
+                return $this->postPackageDefinition();
+            } else if ($this->aPath[2] === 'data_model') {
+                // Importe le modèle de données de l'objet métier
+                return $this->postDataModel();
+            } else {
+                if ($this->aValues['min_edition_scale'] == "") {
+                    $this->aValues['min_edition_scale'] = null;
+                }
+                if ($this->aValues['max_edition_scale'] == "") {
+                    $this->aValues['max_edition_scale'] = null;
+                }
+                $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'business_object', '', 'business_object_id');
+                return $aReturn['sMessage'];
+            }
+        }
+    }
+
+    /**
+     * Post the package definition
+     * @return type
+     */
+    function postPackageDefinition() {
+
+        if (!isset($_FILES['package_definition'])) {
+            $oError = new VitisError(0, 'package_definition not found');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        $sZipName = $_FILES['package_definition']['name'];
+        $sPackageFormat = substr($sZipName, -4);
+        $sFolderName = str_replace('.vex', '', $sZipName);
+
+        // Test format du package
+        if ($sPackageFormat !== '.vex') {
+            writeToErrorLog('getBusinessObjectPackage: package format not valid: ' . $sPackageFormat);
+            $oError = new VitisError(0, 'Package not valid');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // Dézippe le contennu dans un dossier dans tmp
+        $sDir = $this->UniqFileName();
+        $aReturn = $this->postFileSave('package_definition', '../../tmp/', $sDir);
+        $sPath = $this->aProperties['vas_home'] . '/tmp/' . $sDir;
+        unZip($sPath . '/' . $sZipName, $sPath . '/' . $sFolderName);
+
+        // Cas où il y ait dans le zip un dossier de même nom
+        $sFolderPath = $sPath . '/' . $sFolderName;
+        if (is_dir($sPath . '/' . $sFolderName . '/' . $sFolderName)) {
+            $sFolderPath = $sPath . '/' . $sFolderName . '/' . $sFolderName;
+        }
+
+        $aBoFolders = array();
+        // Récupère les repertoires contenant des objets métier
+        $aFolderPathContent = scandir($sFolderPath);
+        if (count($aFolderPathContent) > 2 && !is_dir($sFolderPath . '/json') && !is_dir($sFolderPath . '/forms') && !is_dir($sFolderPath . '/sql') && !is_file($sFolderPath . '/package.json')) {
+            for ($i = 0; $i < count($aFolderPathContent); $i++) {
+                if ($aFolderPathContent[$i] !== '..' && $aFolderPathContent[$i] !== '.') {
+                    array_push($aBoFolders, $sFolderPath . '/' . $aFolderPathContent[$i]);
+                }
+            }
+        } else {
+            array_push($aBoFolders, $sFolderPath);
+        }
+
+        $aReturn['status'] = 1;
+
+        $aTmpReturn = array();
+        for ($i = 0; $i < count($aBoFolders); $i++) {
+
+            // Récupère le contennu du package
+            $aResult = $this->getBusinessObjectPackage($aBoFolders[$i]);
+
+            if (!empty($aResult['sMessage'])) {
+                if ($this->isJson($aResult['sMessage'])) {
+                    $aResult = json_decode($aResult['sMessage'], true);
+                }
+            }
+            if (!empty($aResult['errorMessage'])) {
+                $aReturn['errorMessage'] = $aResult['errorMessage'];
+                $aReturn['status'] = 0;
+            }
+
+            if (!empty($aResult['status'])) {
+                if ($aResult['status'] != 1) {
+                    $aReturn['status'] = $aResult['status'];
+                }
+            } else {
+                $aReturn['status'] = 0;
+            }
+
+            array_push($aTmpReturn, $aResult);
+        }
+
+        if ($aReturn['status'] === 1) {
+            $aReturn['businessobjects'] = $aTmpReturn;
+        }
+
+        // Supprime le dossier précédemment uploadé
+        clearDir($sPath);
+
+        return json_encode($aReturn);
+    }
+
+    /**
+     * Post the data model
+     * @return type
+     */
+    function postDataModel() {
+
+        if (!isset($_FILES['data_model'])) {
+            $oError = new VitisError(0, 'data_model not found');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        $sFileName = $_FILES['data_model']['name'];
+        $sDir = $this->UniqFileName();
+        $this->postFileSave('data_model', '../../tmp/', $sDir);
+        $sPath = $this->aProperties['vas_home'] . '/tmp/' . $sDir;
+        $sFilePath = $sPath . '/' . $sFileName;
+
+        if (isset($this->aValues['database']) && !empty($this->aValues['database'])) {
+            $sDatabase = $this->aValues['database'];
+        } else {
+            $sDatabase = $this->aProperties['database'];
+        }
+
+        $sFileRequests = $this->getDataModelFileRequests($sFilePath);
+
+        // Execute le SQL
+        $aResults = $this->executeDataModelRequests($sFileRequests, $sDatabase);
+
+        // Supprime le dossier précédemment uploadé
+        clearDir($sPath);
+
+        if (isset($this->oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $this->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $aReturn = array('status' => 1);
+            return json_encode($aReturn);
+        }
+    }
+
+    /**
+     * Parse the data-model file contents and return an array of requests
+     * @param string $sFilePath
+     * @return string
+     */
+    function getDataModelFileRequests($sFilePath) {
+
+        // Travail sur chacune des lignes du fichier
+        $aFileContents = file($sFilePath);
+        $aFileContents = $this->cleanDataModelFileArray($aFileContents);
+
+        $sFileContents = '';
+        for ($i = 0; $i < count($aFileContents); $i++) {
+            $sFileContents .= $aFileContents[$i] . ' ';
+        }
+
+//        // Travail sur chacune des requêtes du fichier
+//        $aFileContents = explode(';', $sFileContents);
+//        $aFileContents = $this->cleanDataModelFileArray($aFileContents);
+
+        return $sFileContents;
+    }
+
+    /**
+     * Delete the white spaces and comments from the data-model file array vue
+     * @param array $aFileContents
+     * @return array
+     */
+    function cleanDataModelFileArray($aFileContents) {
+
+        for ($i = count($aFileContents); $i >= 0; $i--) {
+            // Supprime les espaces
+            $aFileContents[$i] = trim($aFileContents[$i]);
+            // Supprime les lignes vides
+            if ($aFileContents[$i] === '') {
+                unset($aFileContents[$i]);
+            }
+            // Supprime les commentaires
+            if (substr($aFileContents[$i], 0, 2) === '--') {
+                unset($aFileContents[$i]);
+            }
+        }
+        // Redonne les bons index
+        $aFileContents2 = Array();
+        foreach ($aFileContents as $key => $value) {
+            array_push($aFileContents2, $value);
+        }
+        $aFileContents = $aFileContents2;
+
+        return $aFileContents;
+    }
+
+    /**
+     * Execute the data-model requests
+     * @param array $aFileRequests
+     * @return array results
+     */
+    function executeDataModelRequests($sFileRequests, $sDatabase) {
+
+        // Connexion avec uVitis
+        $oBD = new Vm($this->aProperties['owner_login'], $this->aProperties['owner_pass'], $sDatabase, $this->aProperties['server'], $this->aProperties['port'], $this->aProperties['sgbd'], $this->aProperties['page_encoding']);
+        $this->oConnection->oBd = $oBD;
+
+        $this->oConnection->oBd->demarreTransaction();
+
+        $bError = false;
+        $oPDOresult = $this->oConnection->oBd->executeBlock($sFileRequests);
+
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $bError = true;
+        }else{
+            $aResults = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        if ($bError) {
+            $this->oConnection->oBd->annuleTransaction();
+        } else {
+            $this->oConnection->oBd->termineTransaction();
+        }
+
+        return $aResults;
+    }
+
+    /**
+     * Generate the form
+     * @param string $sBusinessObjectId
+     * @param string $sFormName
+     * @param array $aFields fields to use
+     * @return string jsonContent of the form
+     */
+    function generateBusinessObjectForm($sBusinessObjectId, $sFormName, $aFields, $oLabel) {
+
+        // Objet BusinessObject correspondant
+        $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        // Paramètres retenus dans le business object
+        $bo_title = $oBusinessObject->aFields['title'];
+        $bo_database = $oBusinessObject->aFields['database'];
+        $bo_schema = $oBusinessObject->aFields['schema'];
+        $bo_table = $oBusinessObject->aFields['table'];
+        $bo_id_field = $oBusinessObject->aFields['id_field'];
+        $geom_column = $oBusinessObject->aFields['geom_column'];
+
+        $oForm = new Form($this->aProperties, $this->oConnection);
+        $aTableColumns = $oForm->getTableColumns($bo_schema, $bo_table);
+
+        // Supprime de la liste des champs générés ceux qui ne sont pas présents dans $aFields
+        $aColumnsToUse = array();
+        for ($i = 0; $i < count($aTableColumns); $i++) {
+            if (in_array($aTableColumns[$i]['column_name'], $aFields)) {
+                array_push($aColumnsToUse, $aTableColumns[$i]);
+            }
+        }
+
+        $aRows = $oForm->generateRowsByTableColumns($aColumnsToUse, array(), array(), json_decode(json_encode($oLabel), true));
+        $aForm = $oForm->generateFormByRows($aRows, $bo_title, $sFormName);
+
+        // création de l'arborescence si elle n'existe pas
+        $sDirPath = $this->createBoPath($sBusinessObjectId);
+
+        $JSONcontent = json_encode($aForm);
+
+        // écrit le fichier demandé
+        $formFile = fopen($sDirPath . '/forms/' . $sFormName . '.json', 'w');
+        fwrite($formFile, $JSONcontent);
+        fclose($formFile);
+
+        // écrit les autres fichiers si ils n'existent pas
+        if (!file_exists($sDirPath . '/forms/default.json')) {
+            $formFile = fopen($sDirPath . '/forms/default.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+        if (!file_exists($sDirPath . '/forms/published.json')) {
+            $formFile = fopen($sDirPath . '/forms/published.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+        if (!file_exists($sDirPath . '/forms/custom.json')) {
+            $formFile = fopen($sDirPath . '/forms/custom.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+
+        return $JSONcontent;
+    }
+
+    /**
+     * Return the imported bo package content
+     * @param string $sFolderPath
+     * @return array
+     */
+    function getBusinessObjectPackage($sFolderPath) {
+
+        // Variables Path
+        $sPackagePath = $sFolderPath . '/package.json';
+        $sSQLPath = $sFolderPath . '/sql';
+        $sDefinitionPath = $sFolderPath . '/json';
+        $sFormsPath = $sFolderPath . '/forms';
+
+        // Retour
+        $aResult = array();
+
+        // Récupère la definition du packet
+        if (!is_file($sPackagePath)) {
+            writeToErrorLog('getBusinessObjectPackage: package.json not found');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        $aResult['package'] = json_decode(file_get_contents($sPackagePath), true);
+
+        // Récupère les définitions json
+        if (!is_dir($sDefinitionPath)) {
+            writeToErrorLog('getBusinessObjectPackage: json folder not found');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        $aResult['json'] = array(
+            'business_object' => json_decode(file_get_contents($sDefinitionPath . '/business_object.json'), true),
+            'mapserver_layers' => json_decode(file_get_contents($sDefinitionPath . '/mapserver_layers.json'), true),
+            'reports' => json_decode(file_get_contents($sDefinitionPath . '/reports.json'), true),
+            'event' => json_decode(file_get_contents($sDefinitionPath . '/event.json'), true)
+        );
+
+        // Récupère les définitions sql
+        if (!is_dir($sSQLPath)) {
+            writeToErrorLog('getBusinessObjectPackage: sql folder not found');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        $aResult['sql'] = array(
+            'structure' => json_decode(file_get_contents($sSQLPath . '/structure.json'), true),
+            'table' => file_get_contents($sSQLPath . '/table.sql'),
+        );
+
+        // Récupère les formulaires json et leurs ressources
+        $aResult['forms'] = array(
+            'custom' => json_decode(file_get_contents($sFormsPath . '/custom.json'), true),
+            'default' => json_decode(file_get_contents($sFormsPath . '/default.json'), true),
+            'published' => json_decode(file_get_contents($sFormsPath . '/published.json'), true)
+        );
+        if (is_dir($sFormsPath . '/ressources')) {
+            $aResult['forms']['ressources'] = array();
+            if (is_file($sFormsPath . '/ressources/custom.js')) {
+                $aResult['forms']['ressources']['js']['custom'] = file_get_contents($sFormsPath . '/ressources/custom.js');
+            }
+            if (is_file($sFormsPath . '/ressources/default.js')) {
+                $aResult['forms']['ressources']['js']['default'] = file_get_contents($sFormsPath . '/ressources/default.js');
+            }
+            if (is_file($sFormsPath . '/ressources/published.js')) {
+                $aResult['forms']['ressources']['js']['published'] = file_get_contents($sFormsPath . '/ressources/published.js');
+            }
+            if (is_file($sFormsPath . '/ressources/custom.css')) {
+                $aResult['forms']['ressources']['css']['custom'] = file_get_contents($sFormsPath . '/ressources/custom.css');
+            }
+            if (is_file($sFormsPath . '/ressources/default.css')) {
+                $aResult['forms']['ressources']['css']['default'] = file_get_contents($sFormsPath . '/ressources/default.css');
+            }
+            if (is_file($sFormsPath . '/ressources/published.css')) {
+                $aResult['forms']['ressources']['css']['published'] = file_get_contents($sFormsPath . '/ressources/published.css');
+            }
+        }
+
+        // Vérification/erreurs
+        if ($aResult['package'] === null) {
+            writeToErrorLog('getBusinessObjectPackage: package.json not valid');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        if ($aResult['json']['business_object'] === null) {
+            writeToErrorLog('getBusinessObjectPackage: business_object.json not valid');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        if ($aResult['json']['mapserver_layers'] === null) {
+            writeToErrorLog('getBusinessObjectPackage: mapserver_layers.json not valid');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        if ($aResult['sql']['structure'] === null) {
+            writeToErrorLog('getBusinessObjectPackage: structure.json not valid');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+        if ($aResult['sql']['table'] === null) {
+            writeToErrorLog('getBusinessObjectPackage: table.sql not valid');
+            $aReturn = array(status => 0, errorMessage => 'Package not valid');
+            return $aReturn;
+        }
+
+        $aResult['status'] = 1;
+
+        return $aResult;
+    }
+
+    /**
+     * Creates the business object forms directory path
+     * @param string $sBusinessObjectId
+     * @return string
+     */
+    function createBoPath($sBusinessObjectId) {
+
+        $sDirPath = $this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $sBusinessObjectId;
+
+        // création de l'arborescence si elle n'existe pas
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap');
+        }
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap/business_object')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap/business_object');
+        }
+        if (!is_dir($sDirPath)) {
+            @mkdir($sDirPath);
+        }
+        if (!is_dir($sDirPath . '/forms')) {
+            @mkdir($sDirPath . '/forms');
+        }
+        if (!is_dir($sDirPath . '/forms/ressources')) {
+            @mkdir($sDirPath . '/forms/ressources');
+        }
+
+        return $sDirPath;
+    }
+
+    /**
+     * Copy a folder
+     * @param string $src
+     * @param string $dst
+     */
+    function recurseCopy($src, $dst) {
+        $dir = opendir($src);
+        @mkdir($dst);
+        while (false !== ( $file = readdir($dir))) {
+            if (( $file != '.' ) && ( $file != '..' )) {
+                if (is_dir($src . '/' . $file)) {
+                    $this->recurseCopy($src . '/' . $file, $dst . '/' . $file);
+                } else {
+                    copy($src . '/' . $file, $dst . '/' . $file);
+                }
+            }
+        }
+        closedir($dir);
+    }
+
+    /**
+     *
+     * @param string $string
+     * @return boolean
+     */
+    function isJson($string) {
+        if (!is_string($string)) {
+            return false;
+        }
+        json_decode($string);
+        return (json_last_error() == JSON_ERROR_NONE);
+    }
+
+    /**
+     * @SWG\Put(path="/businessobjects/{business_object_id}",
+     *   tags={"BusinessObjects"},
+     *   summary="Update BusinessObject",
+     *   description="Request to update business_object",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="title",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="database",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="schema",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="table",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="id_field",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sql_summary",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sql_list",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sorted_by",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_column",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="search_field",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_field",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="search_use_strict",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="event_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="index",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="add_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="edit_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="display_form_size",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     ),
+     *
+     *  )
+     */
+    /**
+     * @SWG\Put(path="/businessobjects/{business_object_id}/form/{form}",
+     *   tags={"BusinessObjects"},
+     *   summary="Update BusinessObject",
+     *   description="Request to update business_object form",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form name (default, published, custom)",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="json_file",
+     *     in="formData",
+     *     description="Wsubform.json",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="js_file",
+     *     in="formData",
+     *     description="Javascript file link with WSubform",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="css_file",
+     *     in="formData",
+     *     description="Css file link with WSubform",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="cmd",
+     *     in="query",
+     *     description="Save, Perso_Save, Perso_Published, Default_Published, Perso_Reset, Default_Reset",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     ),
+     *
+     *  )
+     */
+
+    /**
+     * modify the business object
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        if (isset($this->oConnection->oError) && !empty($this->oConnection->oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (!in_array('vmap_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (isset($this->aPath[4])) {
+            $sBusinessObjectId = $this->aPath[2];
+            $sFormName = $this->aPath[4];
+            $sComand = $this->aValues['cmd'];
+            $this->putForm($sBusinessObjectId, $sFormName, $sComand);
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            if ($this->aValues['min_edition_scale'] == "") {
+                $this->aValues['min_edition_scale'] = null;
+            }
+            if ($this->aValues['max_edition_scale'] == "") {
+                $this->aValues['max_edition_scale'] = null;
+            }
+            $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'business_object', 'business_object_id');
+            return $aReturn['sMessage'];
+        }
+    }
+
+    /**
+     * Change the business object form using this->aValues
+     * @param string $sBusinessObjectId
+     * @param string $formName
+     * @param string $sComand
+     */
+    function putForm($sBusinessObjectId, $sFormName, $sComand) {
+
+        $sDirPath = $this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $sBusinessObjectId;
+
+        // création de l'arborescence si elle n'existe pas
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap');
+        }
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap/business_object')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap/business_object');
+        }
+        if (!is_dir($sDirPath)) {
+            @mkdir($sDirPath);
+        }
+        if (!is_dir($sDirPath . '/forms')) {
+            @mkdir($sDirPath . '/forms');
+        }
+        if (!is_dir($sDirPath . '/forms/ressources')) {
+            @mkdir($sDirPath . '/forms/ressources');
+        }
+
+        if ($this->aValues["cmd"]) {
+            switch ($this->aValues["cmd"]) {
+                case "Save":
+
+                    if (!empty($this->aValues['Json'])) {
+                        $pFile = fopen($sDirPath . '/forms/' . $sFormName . '.json', 'w');
+                        if (fwrite($pFile, $this->aValues["Json"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.json save failed');
+                        }
+                        fclose($pFile);
+                    }
+
+                    if ($this->aValues["Js"] != "") {
+                        $pFileJS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.js', 'w+');
+                        if (fwrite($pFileJS, $this->aValues["Js"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.js save failed');
+                        }
+                        fclose($pFileJS);
+                    }
+
+                    if ($this->aValues["Css"] != "") {
+                        $pFileCSS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.css', 'w+');
+                        if (fwrite($pFileCSS, $this->aValues["Css"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.css save failed');
+                        }
+                        fclose($pFileCSS);
+                    }
+
+                    break;
+                case "Perso_Save":
+
+                    if (!empty($this->aValues['Json'])) {
+                        $pFile = fopen($sDirPath . '/forms/' . $sFormName . '.json', 'w');
+                        if (fwrite($pFile, $this->aValues["Json"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.json save failed');
+                        }
+                        fclose($pFile);
+                    }
+
+                    if ($this->aValues["Js"] != "") {
+                        $pFileJS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.js', 'w+');
+                        if (fwrite($pFileJS, $this->aValues["Js"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.js save failed');
+                        }
+                        fclose($pFileJS);
+                    }
+
+                    if ($this->aValues["Css"] != "") {
+                        $pFileCSS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.css', 'w+');
+                        if (fwrite($pFileCSS, $this->aValues["Css"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.css save failed');
+                        }
+                        fclose($pFileCSS);
+                    }
+
+                    break;
+                case "Perso_Published":
+
+                    @unlink($sDirPath . "/forms/published.json");
+                    copy($sDirPath . "/forms/custom.json", $sDirPath . "/forms/published.json");
+
+                    if (file_exists($sDirPath . "/forms/ressources/custom.js")) {
+                        if (file_exists($sDirPath . "/forms/ressources/published.js")) {
+                            @unlink($sDirPath . "/forms/ressources/published.js");
+                        }
+                        copy($sDirPath . "/forms/ressources/custom.js", $sDirPath . "/forms/ressources/published.js");
+                    }
+                    if (file_exists($sDirPath . "/forms/ressources/custom.css")) {
+                        if (file_exists($sDirPath . "/forms/ressources/published.css")) {
+                            @unlink($sDirPath . "/forms/ressources/published.css");
+                        }
+                        copy($sDirPath . "/forms/ressources/custom.css", $sDirPath . "/forms/ressources/published.css");
+                    }
+
+                    break;
+                case "Default_Published":
+
+                    @unlink($sDirPath . "/forms/published.json");
+                    copy($sDirPath . "/forms/default.json", $sDirPath . "/forms/published.json");
+
+                    break;
+                case "Perso_Reset":
+
+                    @unlink($sDirPath . "/forms/custom.json");
+                    copy($sDirPath . "/forms/default.json", $sDirPath . "/forms/custom.json");
+
+                    break;
+                case "Default_Reset" :
+                    @unlink($sDirPath . "/forms/default.json");
+                    $aFields = explode("|", $this->aValues['field']);
+                    $this->generateBusinessObjectForm($sBusinessObjectId, $sFormName, $aFields, $this->aValues['label']);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * @SWG\Delete(path="/businessobjects",
+     *   tags={"BusinessObjects"},
+     *   summary="delete BusinessObject",
+     *   description="Request to delete BusinessObject",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="business_object token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the businessobjects",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/businessobjects/{business_object_id}",
+     *   tags={"BusinessObjects"},
+     *   summary="delete BusinessObject",
+     *   description="Request to delete BusinessObject",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="business_object token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="id of the business_object",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete business_object
+     * @return id of business_object deleted or error object if a business_object is not deleted
+     */
+    function DELETE() {
+        $aBos = array();
+
+        //forme 'veremes_cadastre_parcelle'|'veremes_cadatre_commune'
+        if (!empty($this->aValues['idList'])) {
+            $aBos = explode("|", $this->aValues['idList']);
+            for ($i = 0; $i < count($aBos); $i++) {
+                if (substr($aBos[$i], 0, 1) === "'") {
+                    $aBos[$i] = substr($aBos[$i], 1);
+                }
+                if (substr($aBos[$i], -1) === "'") {
+                    $aBos[$i] = substr($aBos[$i], 0, -1);
+                }
+            }
+        }
+        if (!empty($this->aPath[2])) {
+            array_push($aBos, $this->aPath[2]);
+        }
+
+        // Supprime les Bo un par un
+        for ($i = 0; $i < count($aBos); $i++) {
+            $aPath = Array('vmap', 'businessobjects', $aBos[$i]);
+            $aValues = $this->aValues;
+            $aValues['my_vitis_id'] = $aBos[$i];
+            $oBo = new BusinessObject($aPath, $aValues, $this->aProperties, $this->oConnection);
+
+            // Supprime l'objet métier
+            $oBo->DELETE();
+
+            if (isset($oBo->oError)) {
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oBo->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            } else {
+                $this->removeBusinessObjectFiles($aBos[$i]);
+                $aXmlRacineAttribute['status'] = 1;
+                $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+        }
+    }
+
+    function removeBusinessObjectFiles($sBusinessObjectId) {
+
+        // Supprime les fichiers liés à l'objet métier
+        $sDirPath = $this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $sBusinessObjectId;
+        clearDir($sDirPath);
+    }
+
+}
+
+?>
diff --git a/web_service/ws/CHANGE_LOG.txt b/web_service/ws/CHANGE_LOG.txt
index 73f8e2a171d20fd3726bdc9974fcb57bba034679..a9f29dc424dbd8bc44a08ace6105f16fa5bcd33d 100755
--- a/web_service/ws/CHANGE_LOG.txt
+++ b/web_service/ws/CHANGE_LOG.txt
@@ -1,7 +1,7 @@
 
               +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
               +                                                                                   +
-              +              VEREMES - Web Service Cadastre (Modèle Veremap) change log           +
+              +             			 VEREMES - Web Service vMap change log         		      +
               +                                                                                   +
               +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
diff --git a/web_service/ws/Invariant.class.inc b/web_service/ws/CRS.class.inc
similarity index 55%
rename from web_service/ws/Invariant.class.inc
rename to web_service/ws/CRS.class.inc
index 7b5a54d83350929b5bb5ca260331318eae34864d..e7ff490f4f0ed94bc5fc7047c9d952d1d970ca25 100755
--- a/web_service/ws/Invariant.class.inc
+++ b/web_service/ws/CRS.class.inc
@@ -1,20 +1,20 @@
 <?php
 
-require_once 'Cadastre.class.inc';
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 
 /**
- * \file Invariant.class.inc
- * \class Invariant
+ * \file CRS.class.inc
+ * \class CRS
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Invariant php class
+ * \brief This file contains the CRS php class
  *
- * This class defines operation for one Invariant
+ * This class defines operation for one CRS
  * 
  */
-class Invariant extends Cadastre {
+class CRS extends Vmap {
 
     public $oError;
 
@@ -28,14 +28,14 @@ class Invariant extends Cadastre {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array('oid', 'ID_BAT', 'ID_COM', 'INVAR', 'DNUPRO', 'ID_PAR', 'CCOSEC', 'DNUPLA');
+        $this->aSelectedFields = Array("crs_id", "name");
     }
 
     /**
-     * @SWG\Get(path="/invariants/{ID_BAT}", 
-     *   tags={"Invariant"},
-     *   summary="Get Invariant",
-     *   description="Request to get Invariant by id",
+     * @SWG\Get(path="/crss/{crs_id}", 
+     *   tags={"CRSs"},
+     *   summary="Get CRS",
+     *   description="Request to get CRS by id",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -46,29 +46,28 @@ class Invariant extends Cadastre {
      *     type="string"
      *   ),
      *   @SWG\Parameter(
-     *     name="ID_BAT",
+     *     name="crs_id",
      *     in="path",
-     *     description="invariant id",
+     *     description="",
      *     required=true,
-     *     type="integer",
-     *   format="int32"
+     *     type="integer"
      *   ),
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/invariants")
+     *         @SWG\Schema(ref="#/definitions/crss")
      *     )
      *  )
      */
 
     /**
-     * get informations about Invariant
+     * get informations about crss
      */
     function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['invariant'], 'ID_BAT');
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'rt_crs', 'crs_id');
     }
-
+    
 }
 
 ?>
\ No newline at end of file
diff --git a/web_service/ws/Voies.class.inc b/web_service/ws/CRSs.class.inc
similarity index 71%
rename from web_service/ws/Voies.class.inc
rename to web_service/ws/CRSs.class.inc
index 9885c122ebb15271789a6e84c6b0ed63d81e555e..33df12c2fa119b2d86614c7b1eadfa753b3b1b0f 100755
--- a/web_service/ws/Voies.class.inc
+++ b/web_service/ws/CRSs.class.inc
@@ -1,32 +1,32 @@
 <?php
 
 /**
- * \file Voies.class.inc
- * \class Voies
+ * \file CRSs.class.inc
+ * \class CRSs
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Voies php class
+ * \brief This file contains the CRSs php class
  *
- * This class defines Rest Api to Vmap Voies
+ * This class defines Rest Api to Vmap CRSs
  * 
  */
-require_once 'Cadastre.class.inc';
-require_once 'Voie.class.inc';
+require_once 'Vmap.class.inc';
+require_once 'CRS.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
 
-class Voies extends Cadastre {
+class CRSs extends Vmap {
     /**
      * @SWG\Definition(
-     *   definition="/voies",
+     *   definition="/crss",
      *   allOf={
-     *     @SWG\Schema(ref="#/definitions/voies")
+     *     @SWG\Schema(ref="#/definitions/crss")
      *   }
      * )
      * * @SWG\Tag(
-     *   name="voies",
-     *   description="Operations about voies"
+     *   name="CRSs",
+     *   description=""
      * )
      */
 
@@ -40,14 +40,14 @@ class Voies extends Cadastre {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array('ID_RIVOLI', 'L_NATURE_VOIE', 'DVOILIB');
+        $this->aSelectedFields = Array("crs_id", "name", "description");
     }
 
     /**
-     * @SWG\Get(path="/voies",
-     *   tags={"Voie"},
-     *   summary="Get Voies",
-     *   description="Request to get Voies",
+     * @SWG\Get(path="/crss",
+     *   tags={"CRSs"},
+     *   summary="Get CRSs",
+     *   description="Request to get CRSs",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -77,16 +77,14 @@ class Voies extends Cadastre {
      *     description="number of element",
      *     required=false,
      *     type="integer",
-     *     default="4",
-     *     format="int32"
+     *     default="4"
      *   ),
      * @SWG\Parameter(
      *     name="offset",
      *     in="query",
      *     description="index of first element",
      *     required=false,
-     *     type="string",
-     *     format="int32"
+     *     type="string"
      *   ),
      * @SWG\Parameter(
      *     name="attributs",
@@ -112,17 +110,17 @@ class Voies extends Cadastre {
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/voies")
+     *         @SWG\Schema(ref="#/definitions/crss")
      *     )
      *  )
      */
 
     /**
-     * get Voies
-     * @return  Voies
+     * get CRSs
+     * @return the array of objects
      */
     function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['voie'], 'ID_RIVOLI');
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'rt_crs', 'crs_id');
         return $aReturn['sMessage'];
     }
 
diff --git a/web_service/ws/Cadastre.class.inc b/web_service/ws/Cadastre.class.inc
deleted file mode 100755
index ea64c0e19bc165957e547b3db437900fe8cc11d9..0000000000000000000000000000000000000000
--- a/web_service/ws/Cadastre.class.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/class/vitis_lib/DbClass.class.inc";
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vmap/Vmap.class.inc';
-
-class Cadastre extends Vmap {
-
-    //Chemin du fichier de ressources contenant les requêtes SQL
-    var $sRessourcesFile = 'Vitis.class.sql.inc';
-
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * Return true if the user have raghts on the "commune" else return false
-     * @param string $id_com
-     * @return boolean
-     */
-    function haveCommuneRights($id_com) {
-        // Vérifie si on a les droits sur la commune        
-        $aFilter = array(
-            'column' => 'id_com',
-            'compare_operator' => '=',
-            'value' => $id_com
-        );
-        $aCommunes = $this->vmapGet('public', $this->aProperties['cadastre']['views']['commune'], array('id_com'), $aFilter, array('limit' => 1));
-        if (sizeOf($aCommunes) > 0)
-            return true;
-        else
-            return false;
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/CadastreProperties.class.inc b/web_service/ws/CadastreProperties.class.inc
deleted file mode 100755
index b205877d9ecdfccccef63f296f200ecc0a81bfc4..0000000000000000000000000000000000000000
--- a/web_service/ws/CadastreProperties.class.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-
-/**
- * \file cadastreproperties.class.inc
- * \class CadatsreProperties
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the Properties php class
- *
- * This class defines the rest api for properties
- * 
- */
-class CadastreProperties extends Vitis {
-    /**
-     * @SWG\Definition(
-     *   definition="/cadastreproperties",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/cadastreproperties")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="properties",
-     *   description="Operations about properties"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function properties($aPath, $aValues, $properties, $bShortcut = false) {
-        $this->aValues = $aValues;
-        $this->aPath = $aPath;
-        $this->aProperties = (object) $properties;
-    }
-
-    /**
-     * @SWG\Get(path="/cadastreproperties", 
-     *   tags={"Properties"},
-     *   summary="Get the cadastre properties",
-     *   description="Request to get properties",
-     *   operationId="GET",
-     *   produces={"application/json", "application/x-vm-json"},
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitionscadastre/properties")
-     *     )
-     *  )
-     */
-
-    /**
-     * 
-     * @return properties
-     */
-    function GET() {
-
-        $this->aFields['data'] = $this->aProperties->cadastre;
-        $aXmlRacineAttribute['status'] = 1;
-        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-
-        return $sMessage;
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/DescriptionParcelle.class.inc b/web_service/ws/DescriptionParcelle.class.inc
deleted file mode 100755
index dcc9bd6a6faa6aabf34769bc618e07da9dd2f847..0000000000000000000000000000000000000000
--- a/web_service/ws/DescriptionParcelle.class.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-
-/**
- * \file DescriptionParcelle.class.inc
- * \class DescriptionParcelle
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the DescriptionParcelle php class
- *
- * This class defines operation for one DescriptionParcelle
- * 
- */
-class DescriptionParcelle extends Cadastre {
-
-    public $oError;
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array(oid, 'ID_COM', 'IDU_', 'ID_PAR', 'CCODEP', 'CCODIR', 'CCOCOM', 'CCOPRE', 'CCOSEC', 'DNUPLA', 'CENR', 'DCNTPA', 'DSRPAR', 'DNUPRO', 'JDATAT', 'DREFLF', 'GPDL', 'CPRSECR', 'CCOSECR', 'DNUPLAR', 'DNUPDL', 'GURBPA', 'DPARPI', 'CCOARP', 'GPARNF', 'GPARBAT', 'CCOVOI', 'CCORIV', 'CCOCIF', 'CODE_INSEE', 'ID_RIVOLI', 'ID_DNUPRO', 'DNVOIRI', 'DINDIC', 'L_NATURE_VOIE', 'DVOILIB');
-    }
-
-    /**
-     * @SWG\Get(path="/descriptionparcelles/{ID_PAR}", 
-     *   tags={"Parcelle"},
-     *   summary="Get DescriptionParcelle",
-     *   description="Request to get DescriptionParcelle by id",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_PAR",
-     *     in="path",
-     *     description="descriptionparcelle id",
-     *     required=true,
-     *     type="integer",
-     *   format="int32"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/descriptionparcelles")
-     *     )
-     *  )
-     */
-
-    /**
-     * get informations about DescriptionParcelle
-     */
-    function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['description_parcelle'], 'ID_PAR');
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/DescriptionParcelles.class.inc b/web_service/ws/DescriptionParcelles.class.inc
deleted file mode 100755
index 11421877ea10cfc7e1eb0c91a50ece0aec997b51..0000000000000000000000000000000000000000
--- a/web_service/ws/DescriptionParcelles.class.inc
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-/**
- * \file DescriptionParcelles.class.inc
- * \class DescriptionParcelles
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the DescriptionParcelles php class
- *
- * This class defines Rest Api to Vmap DescriptionParcelles
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'DescriptionParcelle.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-class DescriptionParcelles extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/descriptionparcelles",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/descriptionparcelles")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="DescriptionParcelles",
-     *   description="Operations about descriptionparcelles"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array(oid, 'ID_COM', 'IDU_', 'ID_PAR', 'CCODEP', 'CCODIR', 'CCOCOM', 'CCOPRE', 'CCOSEC', 'DNUPLA', 'CENR', 'DCNTPA', 'DSRPAR', 'DNUPRO', 'JDATAT', 'DREFLF', 'GPDL', 'CPRSECR', 'CCOSECR', 'DNUPLAR', 'DNUPDL', 'GURBPA', 'DPARPI', 'CCOARP', 'GPARNF', 'GPARBAT', 'CCOVOI', 'CCORIV', 'CCOCIF', 'CODE_INSEE', 'ID_RIVOLI', 'ID_DNUPRO', 'DNVOIRI', 'DINDIC', 'L_NATURE_VOIE', 'DVOILIB');
-    }
-
-    /**
-     * @SWG\Get(path="/descriptionparcelles",
-     *   tags={"Parcelle"},
-     *   summary="Get DescriptionParcelles",
-     *   description="Request to get DescriptionParcelles",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="order_by",
-     *     in="query",
-     *     description="list of ordering fields",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sort_order",
-     *     in="query",
-     *     description="sort order",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="limit",
-     *     in="query",
-     *     description="number of element",
-     *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="offset",
-     *     in="query",
-     *     description="index of first element",
-     *     required=false,
-     *     type="string",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="attributs",
-     *     in="query",
-     *     description="list of attributs",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="filter",
-     *     in="query",
-     *     description="filter results",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="distinct",
-     *     in="query",
-     *     description="delete duplicates",
-     *     required=false,
-     *     type="boolean"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/descriptionparcelles")
-     *     )
-     *  )
-     */
-
-    /**
-     * get DescriptionParcelles
-     * @return  DescriptionParcelles
-     */
-    function GET() {
-        $this->aValues['filter'] = str_replace("id_par", "ID_PAR", $this->aValues['filter']);
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['description_parcelle'], 'ID_PAR');
-        return $aReturn['sMessage'];
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/DownloadRapport.class.inc b/web_service/ws/DownloadRapport.class.inc
deleted file mode 100755
index 1786b2c08dd6691805d31b0faad1d857de367f5e..0000000000000000000000000000000000000000
--- a/web_service/ws/DownloadRapport.class.inc
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file downloadrapport.class.inc
- * \class DownloadRapport
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the DownloadRapport php class
- *
- * This class defines the rest api for downloadrapport
- * 
- */
-class DownloadRapport extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/downloadrapport",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/downloadrapport")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="DownloadRapport",
-     *   description="Operations about DownloadRapport"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/downloadrapport",
-     *   tags={"ReleveDePropriete"},
-     *   summary="Create the releve de propriete sheet",
-     *   description="Request to get the element",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="sYear",
-     *     in="query",
-     *     description="year folder name (ex: 2013)",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sType",
-     *     in="query",
-     *     description="type folder name",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sFileName",
-     *     in="query",
-     *     description="file name (includes the extension)",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="DownloadRapport Response",
-     *         @SWG\Schema(ref="#/definitions/downloadrapport")
-     *     )
-     *  )
-     */
-    function GET() {
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        if ($this->oConnection->oError == null) {
-            if (!empty($this->aValues['sFileName'])) {
-                $aRestriction = explode('|', $_SESSION['ses_restriction']);
-                if (strpos($this->aValues['sFileName'], "../") === false && ($_SESSION['ses_restriction'] == "%" || in_array(substr($this->aValues['sFileName'], 0, 5), $aRestriction))) {
-                    $sFile = $this->aProperties["cadastre"]["rp"]["rp_dir"] . "/" . $this->aValues['sYear'] . '/' . $this->aValues['sType'] . '/' . $this->aValues['sFileName'];
-                    if (is_file($sFile)) {
-                        switch (pathinfo($sFile, PATHINFO_EXTENSION)) {
-                            case 'pdf':
-                                if (file_exists($sFile)) {
-                                    header('Content-Type: application/pdf');
-                                }
-                                break;
-                            case 'xls':
-                                if (file_exists($sFile)) {
-                                    header('Content-Type: application/vnd.ms-excel');
-                                }
-                                break;
-                            default:
-                                http_response_code(403);
-                                //echo (json_encode(array("status" => "0", "sMessage" => "forbidden")));
-                                exit;
-                                break;
-                        }
-                        header('Expires: 0');
-                        header('Cache-Control: must-revalidate');
-                        header('Pragma: public');
-                        header('Content-Length: ' . filesize($sFile));
-                        readfile($sFile);
-                    } else {
-                        return 'Une erreur est survenue lors de la g�n�ration du rapport';
-                    }
-                } else {
-                    http_response_code(403);
-                }
-            }
-        } else {
-            http_response_code(403);
-        }
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/FicheDescriptiveInvariant.class.inc b/web_service/ws/FicheDescriptiveInvariant.class.inc
deleted file mode 100755
index 1231717ba3fdddabaea6f61e471c979bd62c8e6c..0000000000000000000000000000000000000000
--- a/web_service/ws/FicheDescriptiveInvariant.class.inc
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file fichedescriptiveinvariant.class.inc
- * \class FicheDescriptiveInvariant
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the FicheDescriptiveInvariant php class
- *
- * This class defines the rest api for fichedescriptiveinvariant
- * 
- */
-class FicheDescriptiveInvariant extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/fichedescriptiveinvariant",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/fichedescriptiveinvariant")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="fichedescriptiveinvariant",
-     *   description="Operations about fichedescriptiveinvariant"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/fichedescriptiveinvariant/{ID_BAT}",
-     *   tags={"Invariant"},
-     *   summary="Get the fichedescriptiveinvariant whith a table",
-     *   description="Request to get a element intersected",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_BAT",
-     *     in="path",
-     *     description="ID_BAT",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="FicheDescriptiveInvariant Response",
-     *         @SWG\Schema(ref="#/definitions/fichedescriptiveinvariant")
-     *     )
-     *  )
-     */
-
-    /**
-     * Get function to generate a token
-     * @return the token
-     */
-    function GET() {
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        // Infos sur l'invariant
-        $ID_BAT = $this->aPath[2];
-        $sSchema = 'public';
-        $sTable = 'v_maj_fiche_inv_descr';
-//        $sFilter = "\"ID_BAT\" = '" . $ID_BAT . "'";
-        $aFilter = array(
-            'column' => 'ID_BAT',
-            'compare_operator' => '=',
-            'value' => $ID_BAT
-        );
-        $aAttributs = Array('ID_BAT', 'DVOILIB', 'LIBCOM', 'ID_COM', 'L_DTELOC', 'L_CCONLC', 'L_DNATLC', 'JDATAT', 'JANNAT', 'CCHPR', 'BIPEVLA1', 'DNBNIV', 'DNUBAT', 'DESC', 'DNIV', 'DVLTRT', 'INVAR');
-
-        $oInvariantInfos['data'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter)[0];
-
-        // Infos sur le P.E.V
-        $sTable = 'v_maj_fiche_inv_pev';
-        $aAttributs = Array('ID_BAT', 'DNUPEV', 'L_CCOAFF', 'DCAPEC', 'CCOSTB', 'DNUREF', 'BIPEVLA1', 'VLBAIA1');
-
-        $oInvariantInfos['data']['PEV'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Infos sur les habitations
-        $sTable = 'v_maj_fiche_inv_hab';
-        $aAttributs = Array('ID_BAT', 'DNUPEV', 'GEAULC', 'GELELC', 'GCHCLC', 'GTEGLC', 'DNBBAI', 'DNBDOU', 'DNBLAV', 'DNBWC', 'DEQDHA', 'DNBPPR', 'DNBPDC', 'DSUPDC', 'L_DMATGM', 'L_DMATTO', 'JANNAT', 'L_DETENT', 'DNBNIV', 'DNBSAM', 'DNBCHA', 'DNBCU8', 'DNBCU9', 'DNBSEA', 'DNBANN', 'CCONAD1', 'L_CCONAD1', 'DSUEIC1', 'CCONAD2', 'L_CCONAD2', 'DSUEIC2', 'CCONAD3', 'L_CCONAD3', 'DSUEIC3', 'CCONAD4', 'L_CCONAD4', 'DSUEIC4');
-
-        $oInvariantInfos['data']['habitations'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Infos sur les locaux pros
-        $sTable = 'v_maj_fiche_inv_local_pro';
-        $aAttributs = Array('ID_BAT', 'DNUPEV', 'DNUDES', 'VSURZT');
-
-        $oInvariantInfos['data']['locauxPros'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Infos sur les dépendances
-        $sTable = 'v_maj_fiche_inv_dep';
-        $aAttributs = Array('ID_BAT', 'DNUPEV', 'DSUDEP', 'GEAULC', 'GELELC', 'GCHCLC', 'DNBBAI', 'DNBDOU', 'DNBLAV', 'DNBWC', 'L_DMATGM', 'L_DMATTO', 'L_DETENT', 'L_CCONAD');
-
-        $oInvariantInfos['data']['dependances'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Infos sur les propriétaires
-        $sTable = 'v_maj_fiche_inv_prop';
-        $aAttributs = Array('ID_BAT', 'DQUALP', 'DDENOM', 'JDATNSS', 'DLDNSS', 'DLIGN3', 'DLIGN4', 'DLIGN6', 'L_CCODEM', 'L_CCODRO');
-
-        $oInvariantInfos['data']['proprietaires'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Infos sur les lots
-        $sTable = 'v_maj_fiche_inv_lot';
-        $aAttributs = Array('ID_BAT', 'KLOT', 'DNUMQL', 'DDENQL');
-
-        $oInvariantInfos['data']['lots'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        return json_encode($oInvariantInfos);
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/FicheDescriptiveParcelle.class.inc b/web_service/ws/FicheDescriptiveParcelle.class.inc
deleted file mode 100755
index d40e39b2c9a01b14ae726790d5b257913eebf378..0000000000000000000000000000000000000000
--- a/web_service/ws/FicheDescriptiveParcelle.class.inc
+++ /dev/null
@@ -1,214 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file fichedescriptiveparcelle.class.inc
- * \class FicheDescriptiveParcelle
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the FicheDescriptiveParcelle php class
- *
- * This class defines the rest api for fichedescriptiveparcelle
- * 
- */
-class FicheDescriptiveParcelle extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/fichedescriptiveparcelle",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/fichedescriptiveparcelle")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="FicheDescriptiveParcelle",
-     *   description="Operations about FicheDescriptiveParcelle"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/fichedescriptiveparcelle/{ID_PAR}",
-     *   tags={"Parcelle"},
-     *   summary="Get the fichedescriptiveparcelle whith a table",
-     *   description="Request to get a element intersected",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_PAR",
-     *     in="path",
-     *     description="ID_PAR",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="FicheDescriptiveParcelle Response",
-     *         @SWG\Schema(ref="#/definitions/fichedescriptiveparcelle")
-     *     )
-     *  )
-     */
-
-    /**
-     * Get function to generate a token
-     * @return the token
-     */
-    function GET() {
-
-        $ID_PAR = $this->aPath[2];
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges) && !in_array('vmap_cadastre_light_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        // Vérifie les droits de d'utilisateur sur la commune
-        if ($this->haveCommuneRights(substr($ID_PAR, 0, 6)) == false) {
-            http_response_code(403);
-            $aReturn['error']['errorMessage'] .= "L'utilisateur n'a pas les droits sur la commune";
-            return json_encode($aReturn);
-        }
-
-        // Infos sur la parcelle
-        $sSchema = 'public';
-        $sTable = 'v_maj_fiche_prc_descr';
-//        $sFilter = "\"ID_PAR\" = '" . $ID_PAR . "'";
-        $aFilter = array(
-            'column' => 'ID_PAR',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributs = Array('ID_PAR', 'ID_COM', 'parcelle', 'commune', 'sup_fiscale', 'DCNTPA', 'DNVOIRI', 'DINDIC', 'L_NATURE_VOIE', 'DVOILIB', 'CCORIV', 'GPARBAT', 'GURBPA');
-
-        $oParcelleInfos['data'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter)[0];
-
-        // Infos sur le proprietaire
-        $sSchemaProp = 'public';
-        $sTableProp = 'v_maj_fiche_prc_prop';
-//        $sFilterProp = "\"ID_PAR\" = '" . $ID_PAR . "'";
-        $aFilterProp = array(
-            'column' => 'ID_PAR',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributsProp = Array('ID_PAR', 'DQUALP', 'DNUPRO', 'DDENOM', 'JDATNSS', 'DLDNSS', 'DLIGN3', 'DLIGN6', 'L_CCODEM', 'L_CCODRO', 'GDESIP', 'DLIGN4');
-
-        $oParcelleInfos['data']['aProprietaires'] = $this->vmapGet($sSchemaProp, $sTableProp, $aAttributsProp, $aFilterProp);
-
-        // infos sur la subdivision fiscale
-        $sSchemaSub = 'public';
-        $sTableSub = 'v_maj_fiche_prc_suf';
-//        $sFilterSub = "\"ID_PAR\" = '" . $ID_PAR . "'";
-        $aFilterSub = array(
-            'column' => 'ID_PAR',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributsSub = Array('ID_PAR', 'CCOSUB', 'DSGRPF', 'CNATSP', 'L_DSGRPF', 'DCLSSF', 'DCNTSF', 'DRCSUBA', 'DRCSUB');
-
-        $oParcelleInfos['data']['aSubdivisionFiscale'] = $this->vmapGet($sSchemaSub, $sTableSub, $aAttributsSub, $aFilterSub);
-
-        // Infos sur le bâti
-        $sSchemaBatis = 'public';
-        $sTableBatis = 'v_maj_fiche_prc_bat';
-//        $sFilterBatis = "\"ID_PAR\" = '" . $ID_PAR . "'";
-        $aFilterBatis = array(
-            'column' => 'ID_PAR',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributsBatis = Array('ID_BAT', 'ID_PAR', 'INVAR', 'ID_BAT', 'L_DTELOC', 'L_CCONLC', 'L_DNATLC', 'JDATAT', 'JANNAT', 'DDENOM');
-
-        $oParcelleInfos['data']['aBatis'] = $this->vmapGet($sSchemaBatis, $sTableBatis, $aAttributsBatis, $aFilterBatis);
-
-
-        // Infos complémentaires (paramétrées par l'administrateur)
-        $iTolerance = $this->aProperties["cadastre"]["descr_parcel"]["intersect"]["tolerance"];
-        $aIntersectionViews = $this->aProperties['cadastre']['descr_parcel']['intersect']['views'];
-
-        // Récupère la géométrie de la parcelle
-        $sSchema = 'public';
-        $sTable = $this->aProperties['cadastre']['views']['parcelle'];
-        $aFilter = array(
-            'column' => 'id_par',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributs = Array('ST_AsEWKT(geom) as geom');
-        $parcelleGeom = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter)[0]['geom'];
-
-        // Récupère les intersections
-        $oParcelleInfos['data']['aIntersections'] = array();
-
-        foreach ($aIntersectionViews as $key => $value) {
-
-            if (strpos($key, ".") === false) {
-                $sSchema = "public";
-                $sTable = $key;
-            } else {
-                $aTmp = explode(".", $key);
-                $sSchema = $aTmp[0];
-                $sTable = $aTmp[1];
-            }
-            $aAttributs = Array();
-
-            foreach ($value as $key2 => $value2) {
-                if ($key2 != 'title' && $key2 != 'type' && $key2 != 'intersect' && $key2 != 'geom_column') {
-                    array_push($aAttributs, $key2);
-                }
-            }
-
-            if (!empty($value['geom_column'])) {
-                $sGeomColumn = $value['geom_column'];
-            } else {
-                $sGeomColumn = 'geom';
-            }
-
-            if (!empty($value['type'])) {
-                $sGeomType = $value['type'];
-            } else {
-                $sGeomType = 'POLYGON';
-            }
-
-            $aIntersect = $this->vmapIntersectGet($sSchema, $sTable, $parcelleGeom, $aAttributs, $iTolerance, $sGeomColumn, $sGeomType);
-
-            $value['data'] = $aIntersect;
-            if (isset($value['data'][0]) && !empty($value['data'][0])) {
-                $value['aFields'] = array_keys($value['data'][0]);
-            } else {
-                $value['aFields'] = array();
-            }
-
-            array_push($oParcelleInfos['data']['aIntersections'], $value);
-        }
-
-        return json_encode($oParcelleInfos);
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/FicheUrbanisme.class.inc b/web_service/ws/FicheUrbanisme.class.inc
deleted file mode 100755
index 10781b12e80f9d3d34b058f9361167cc217edaaa..0000000000000000000000000000000000000000
--- a/web_service/ws/FicheUrbanisme.class.inc
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file ficheurbanisme.class.inc
- * \class FicheUrbanisme
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the FicheUrbanisme php class
- *
- * This class defines the rest api for ficheurbanisme
- * 
- */
-class FicheUrbanisme extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/ficheurbanisme",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/ficheurbanisme")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="ficheurbanisme",
-     *   description="Operations about ficheurbanisme"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/ficheurbanisme/{ID_PAR}",
-     *   tags={"Parcelle"},
-     *   summary="Get the ficheurbanisme whith a table",
-     *   description="Request to get a element intersected",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_PAR",
-     *     in="path",
-     *     description="ID_PAR",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="FicheUrbanisme Response",
-     *         @SWG\Schema(ref="#/definitions/ficheurbanisme")
-     *     )
-     *  )
-     */
-
-    /**
-     * Get function to generate a token
-     * @return the token
-     */
-    function GET() {
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        $ID_PAR = $this->aPath[2];
-
-        // Vérifie les droits de d'utilisateur sur la commune
-        if ($this->haveCommuneRights(substr($ID_PAR, 0, 6)) == false) {
-            http_response_code(403);
-            $aReturn['error']['errorMessage'] .= "L'utilisateur n'a pas les droits sur la commune";
-            return json_encode($aReturn);
-        }
-
-        // Infos sur la parcelle
-        $sSchema = 'public';
-        $sTable = 'v_maj_fiche_urb_vmap';
-        // $sFilter = "\"ID_PAR\" = '" . $ID_PAR . "'";
-        $aFilter = array(
-            'column' => 'ID_PAR',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        $aAttributs = Array('ID_PAR', 'LIBDEP', 'LIBCOM', 'DNUPLA', 'CCOSEC', 'DCNTPA', 'DDENOM', 'DLIGN3', 'DLIGN4', 'DLIGN6', '"DNVOIRI" || "DINDIC" || \' \' || "CCONVO" || \' \' || "DVOILIB" as "ADRESSE"', 'l_dsgrpf as "DSGRPF"');
-
-        $oParcelleInfos['data'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter);
-
-        // Géométrie
-        $sTable = $this->aProperties['cadastre']['views']['parcelle'];
-        // $sFilter = "id_par = '" . $ID_PAR . "'";
-        $aFilter = array(
-            'column' => 'id_par',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        if (!empty($this->aValues['result_srid']))
-            $aAttributs = Array('ST_AsEWKT(ST_Transform(geom, ' . $this->aValues['result_srid'] . ')) as geom');
-        else
-            $aAttributs = Array('ST_AsEWKT(geom) as geom');
-
-        $oParcelleInfos['data']['geometry'] = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter)[0];
-
-        // Récupère la géométrie de la parcelle
-        $sSchema = 'public';
-        $sTable = $this->aProperties['cadastre']['views']['parcelle'];
-        // $sFilter = "\"id_par\" = '" . $ID_PAR . "'";
-        $aFilter = array(
-            'column' => 'id_par',
-            'compare_operator' => '=',
-            'value' => $ID_PAR
-        );
-        if (!empty($this->aValues['result_srid']))
-            $aAttributs = Array('ST_AsEWKT(ST_Transform(geom, ' . $this->aValues['result_srid'] . ')) as geom');
-        else
-            $aAttributs = Array('ST_AsEWKT(geom) as geom');
-        $parcelleGeom = $this->vmapGet($sSchema, $sTable, $aAttributs, $aFilter)[0]['geom'];
-
-        // Récupère les intersections
-        $oParcelleInfos['data']['aIntersections'] = array();
-        $oParcelleInfos['data']['aIntersectionsArray'] = array();
-
-        // Infos complémentaires (paramétrées par l'administrateur)
-        $aIntersectionViews = $this->aProperties['cadastre']['fiche_urb']['intersect']['views'];
-        $iTolerance = $this->aProperties["cadastre"]["fiche_urb"]["intersect"]["tolerance"];
-        if (is_array($aIntersectionViews)) {
-            foreach ($aIntersectionViews as $key => $value) {
-
-                $sTable = $key;
-                $aAttributs = Array();
-
-                foreach ($value as $key2 => $value2) {
-                    if ($key2 != 'title' && $key2 != 'type' && $key2 != 'intersect') {
-                        array_push($aAttributs, $key2);
-                    }
-                }
-
-                $oIntersect = $this->vmapIntersectGet($sSchema, $sTable, $parcelleGeom, $aAttributs, $iTolerance);
-                $value['data'] = $oIntersect;
-
-                array_push($oParcelleInfos['data']['aIntersections'], $value);
-            }
-        }
-        $aIntersectionArrayViews = $this->aProperties['cadastre']['fiche_urb']['intersect']['array_views'];
-        if (is_array($aIntersectionArrayViews)) {
-            for ($i = 0; $i < count($aIntersectionArrayViews); $i++) {
-                foreach ($aIntersectionArrayViews[$i] as $key => $value) {
-                    $sTable = $key;
-                    $aAttributs = Array();
-                    foreach ($value as $key2 => $value2) {
-                        if ($key2 != 'title' && $key2 != 'type' && $key2 != 'intersect') {
-                            array_push($aAttributs, $key2);
-                        }
-                    }
-                    $oIntersect = $this->vmapIntersectGet($sSchema, $sTable, $parcelleGeom, $aAttributs, $iTolerance);
-                    $value['data'] = $oIntersect;
-                    array_push($oParcelleInfos['data']['aIntersectionsArray'], $value);
-                }
-            }
-        }
-
-        return json_encode($oParcelleInfos);
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Format.class.inc b/web_service/ws/Format.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..baa868a11fe9ddbda10f61e9c0439fc75a1550bd
--- /dev/null
+++ b/web_service/ws/Format.class.inc
@@ -0,0 +1,41 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+* \file Format.class.inc
+* \class Format
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Format php class
+*
+* This class defines operation for one Format
+* 
+*/
+class Format extends Vmap {
+    
+    public $oError;
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array('rt_format_id');
+    }
+    
+    /**
+     * get informations about format
+     */
+    function GET(){
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], "rt_format", "rt_format_id");
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/Invariants.class.inc b/web_service/ws/Formats.class.inc
similarity index 62%
rename from web_service/ws/Invariants.class.inc
rename to web_service/ws/Formats.class.inc
index e7503acb195ecce345383a1558ef6e85fb80601d..bae206ed8657cad5e321b1dbe66e5960d7daf3f3 100755
--- a/web_service/ws/Invariants.class.inc
+++ b/web_service/ws/Formats.class.inc
@@ -1,35 +1,34 @@
 <?php
-
 /**
- * \file Invariants.class.inc
- * \class Invariants
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Invariants php class
- *
- * This class defines Rest Api to Vmap Invariants
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'Invariant.class.inc';
+* \file Formats.class.inc
+* \class Formats
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Formats php class
+*
+* This class defines Rest Api to Vmap order statutes
+* 
+*/
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'Format.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
 
-class Invariants extends Vmap {
-    /**
+class Formats extends Vmap {
+    
+     /**
      * @SWG\Definition(
-     *   definition="/invariants",
+     *   definition="/formats",
      *   allOf={
-     *     @SWG\Schema(ref="#/definitions/invariants")
+     *     @SWG\Schema(ref="#/definitions/formats")
      *   }
      * )
      * * @SWG\Tag(
-     *   name="invariants",
-     *   description="Operations about invariants"
+     *   name="Formats",
+     *   description="Operations about Formats"
      * )
      */
-
     /**
      * construct
      * @param type $aPath url of the request
@@ -40,16 +39,16 @@ class Invariants extends Vmap {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array('oid', 'ID_BAT', 'ID_COM', 'INVAR', 'DNUPRO', 'ID_PAR', 'CCOSEC', 'DNUPLA');
+        $this->aSelectedFields = Array('rt_format_id');
     }
-
+    
     /**
-     * @SWG\Get(path="/invariants",
-     *   tags={"Invariant"},
-     *   summary="Get Invariants",
-     *   description="Request to get Invariants",
+     * @SWG\Get(path="/formats",
+     *   tags={"Formats"},
+     *   summary="Get Formats",
+     *   description="Request to get Formats",
      *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   produces={"application/xml", "application/json"},
      *   @SWG\Parameter(
      *     name="token",
      *     in="query",
@@ -76,17 +75,14 @@ class Invariants extends Vmap {
      *     in="query",
      *     description="number of element",
      *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
+     *     type="integer"
      *   ),
      * @SWG\Parameter(
      *     name="offset",
      *     in="query",
      *     description="index of first element",
      *     required=false,
-     *     type="string",
-     *     format="int32"
+     *     type="string"
      *   ),
      * @SWG\Parameter(
      *     name="attributs",
@@ -112,20 +108,18 @@ class Invariants extends Vmap {
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/invariants")
+     *         @SWG\Schema(ref="#/definitions/formats")
      *     )
      *  )
      */
-
+    
     /**
-     * get Invariants
-     * @return  Invariants
+     * get Formats
+     * @return  Formats
      */
     function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['invariant'], 'ID_BAT');
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], "rt_format", "rt_format_id");
         return $aReturn['sMessage'];
     }
-
 }
-
 ?>
\ No newline at end of file
diff --git a/web_service/ws/Layer.class.inc b/web_service/ws/Layer.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..dda04a633bfa009f77a4c25c8dbe033ac4c601c9
--- /dev/null
+++ b/web_service/ws/Layer.class.inc
@@ -0,0 +1,162 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once 'BusinessObject.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Layer.class.inc
+ * \class Layer
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Layer php class
+ *
+ * This class defines operation for one Layer
+ * 
+ */
+class Layer extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        // Obligatoire pour utiliser sur oLayers->aObjects
+        if (empty($this->aValues)) {
+            $this->aValues = $aValues;
+        }
+        if (empty($this->aPath)) {
+            $this->aPath = $aPath;
+        }
+        if (empty($this->aProperties)) {
+            $this->aProperties = $properties;
+        }
+    }
+
+    /**
+     * @SWG\Get(path="/layers/{layer_id}", 
+     *   tags={"Layers"},
+     *   summary="Get Layer",
+     *   description="Request to get Layer by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="layer id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about Layer
+     */
+    function GET() {
+
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_layer', 'layer_id');
+
+        // Ajoute (si il existe le formulaire associé au calque)
+        $this->aFields['filter_form'] = $this->getFilterForm();
+        $this->aFields['crs_list_label'] = str_replace('|', ',', $this->aFields['crs_list']);
+
+        if (!empty($this->aFields['bo_id_list'])) {
+            $aBoIds = explode('|', $this->aFields['bo_id_list']);
+            $this->aFields['business_objects'] = $this->getBusinessObjectsInfos($aBoIds);
+        }
+    }
+
+    /**
+     * Return (is exists) the json form associate to the layer
+     * @return string JSON form
+     */
+    function getFilterForm() {
+        $filter_form = null;
+        if ($this->aFields['is_filtered'] === true) {
+            $formsPath = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $this->aFields['layer_id'] . '/forms';
+            if (file_exists($formsPath . '/published.json')) {
+                $filter_form = file_get_contents($formsPath . '/published.json');
+            }
+        }
+        return $filter_form;
+    }
+
+    /**
+     * Return (is exists) the embed js for form associate to the layer
+     * @return string JS code
+     */
+    function getFilterFormJs() {
+        $sFilterFormJs = null;
+        if ($this->aFields['is_filtered'] === true) {
+            $sFormsPath = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $this->aFields['layer_id'] . '/forms/ressources';
+            if (file_exists($sFormsPath . '/published.js')) {
+                $sFilterFormJs = file_get_contents($sFormsPath . '/published.js');
+            }
+        }
+        return $sFilterFormJs;
+    }
+
+    /**
+     * Get the infos from the business objects defined in $aBoIds
+     * @param array $aBoIds
+     * @return array
+     */
+    function getBusinessObjectsInfos($aBoIds) {
+        $aBoInfos = array();
+        for ($i = 0; $i < count($aBoIds); $i++) {
+            $aPath = array('vmap', 'businessobjects', $aBoIds[$i]);
+            $aValues = $this->aValues;
+            $aValues['my_vitis_id'] = $aBoIds[$i];
+            $oBo = new BusinessObject($aPath, $aValues, $this->aProperties, false, $this->oConnection);
+            $oBo->GET();
+            array_push($aBoInfos, $oBo->aFields);
+        }
+        return $aBoInfos;
+    }
+
+    /**
+     * delete a layer
+     */
+    function DELETE() {
+
+        // Des-associe les objets métiers de la couche
+        require $this->sRessourcesFile;
+        $aSQLParams = array(
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'layer_id' => array('value' => $this->aValues['my_vitis_id'], 'type' => 'number')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($aSql['deleteAssociatedBos'], $aSQLParams);
+
+        // Supprime la couche en question
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'layer', 'layer_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields['layer_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/LayerTheme.class.inc b/web_service/ws/LayerTheme.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..180d51e2f33a7520c52e9fd75176dc7c1fe70bca
--- /dev/null
+++ b/web_service/ws/LayerTheme.class.inc
@@ -0,0 +1,84 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file LayerTheme.class.inc
+ * \class LayerTheme
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the LayerTheme php class
+ *
+ * This class defines operation for one LayerTheme
+ * 
+ */
+class LayerTheme extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("layertheme_id", "name", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/layerthemes/{layertheme_id}", 
+     *   tags={"LayerThemes"},
+     *   summary="Get LayerTheme",
+     *   description="Request to get LayerTheme by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layertheme_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about layerthemes
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'layertheme', 'layertheme_id');
+    }
+    
+    /**
+     * delete a layertheme
+     */
+    function DELETE(){
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'layertheme', 'layertheme_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields['layertheme_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/LayerThemes.class.inc b/web_service/ws/LayerThemes.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..5e5f6be19ad4996b6908845fdae0461f2fa26e93
--- /dev/null
+++ b/web_service/ws/LayerThemes.class.inc
@@ -0,0 +1,295 @@
+<?php
+
+/**
+ * \file LayerThemes.class.inc
+ * \class LayerThemes
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the LayerThemes php class
+ *
+ * This class defines Rest Api to Vmap LayerThemes
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'LayerTheme.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class LayerThemes extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/layerthemes",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/layerthemes")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="LayerThemes",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("layertheme_id", "name", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/layerthemes",
+     *   tags={"LayerThemes"},
+     *   summary="Get LayerThemes",
+     *   description="Request to get LayerThemes",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get LayerThemes
+     * @return the array of objects
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'layertheme', 'layertheme_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/layerthemes",
+     *   tags={"LayerThemes"},
+     *   summary="Add layertheme",
+     *   description="Request to add a layertheme",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert layertheme
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'layertheme', $this->aProperties['schema_vmap'].'.seq_common', 'layertheme_id');           
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/layerthemes/{layertheme_id}",
+     *   tags={"LayerThemes"},
+     *   summary="Update LayerTheme",
+     *   description="Request to update layertheme",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layertheme_id",
+     *     in="path",
+     *     description="user id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="layertheme description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="layertheme description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify layertheme
+     * @return array containing the status and the message
+     */
+    function PUT() {        
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'layertheme', 'layertheme_id');
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Delete(path="/layerthemes/",
+     *   tags={"LayerThemes"},
+     *   summary="delete LayerTheme",
+     *   description="Request to delete LayerTheme",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the layerthemes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/layerthemes/{layertheme_id}",
+     *   tags={"LayerThemes"},
+     *   summary="delete LayerTheme",
+     *   description="Request to delete LayerTheme",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="layertheme_id",
+     *     in="path",
+     *     description="id of the layertheme",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layerthemes")
+     *     )
+     *  )
+     */
+    
+    /**
+     * delete layertheme
+     * @return id of layertheme deleted or error object if a layertheme is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'layertheme', 'layertheme_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Layers.class.inc b/web_service/ws/Layers.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..430a91c728e40ee0497fd3baa024f5f669a5f0d6
--- /dev/null
+++ b/web_service/ws/Layers.class.inc
@@ -0,0 +1,822 @@
+<?php
+
+/**
+ * \file Layers.class.inc
+ * \class Layers
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Layers php class
+ *
+ * This class defines Rest Api to Vmap Layers
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once 'Layer.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class Layers extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/layers",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/layers")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Layers",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Get(path="/layers",
+     *   tags={"Layers"},
+     *   summary="Get Layers",
+     *   description="Request to get Layers",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     default="4"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/layers/{layer_id}/form/{form}",
+     *   tags={"Layers"},
+     *   summary="Get Layers",
+     *   description="Request to get Layers",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="Layer id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Layers
+     * @return  Layers
+     */
+    function GET() {
+        // /layers/{layer_id}/form/{form}
+        if (isset($this->aPath[4])) {
+            $layerId = $this->aPath[2];
+            $formName = $this->aPath[4];
+            $form = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/layer/' . $layerId . '/forms/' . $formName . '.json');
+            $jsContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/layer/' . $layerId . '/forms/ressources/' . $formName . '.js');
+            $cssContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/layer/' . $layerId . '/forms/ressources/' . $formName . '.css');
+
+            $output = array(json_decode($form), $jsContent, $cssContent);
+            return json_encode($output);
+        }
+
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_layer', 'layer_id');
+
+        // Récupère les informations des objets métiers correcpondants aux couches
+        if ($aReturn['sStatus'] === 1) {
+            $aReturn = $this->getLayersBusinessObjectsInfos();
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * Get the layers business objects infos
+     * @return array
+     */
+    function getLayersBusinessObjectsInfos() {
+
+        // Récupère les infos des objets métiers
+        for ($i = 0; $i < count($this->aObjects); $i++) {
+            if (!empty($this->aObjects[$i]->aFields['bo_id_list'])) {
+                $aBoIds = explode('|', $this->aObjects[$i]->aFields['bo_id_list']);
+                $this->aObjects[$i]->aFields['business_objects'] = $this->getBusinessObjectsInfos($aBoIds);
+            }
+        }
+
+        // Met le tout en forme
+        $sEncoding = isset($this->aValues['sEncoding']) ? $this->aValues['sEncoding'] : null;
+        $sSourceEncoding = isset($this->aValues['sSourceEncoding']) ? $this->aValues['sSourceEncoding'] : null;
+        $output = isset($this->aValues['output']) ? $this->aValues['output'] : null;
+        $aXmlRacineAttribute['status'] = 1;
+        $sMessage = $this->asDocument('', 'vitis', $sEncoding, True, $aXmlRacineAttribute, $sSourceEncoding, $output);
+        $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+
+        return $aReturn;
+    }
+
+    /**
+     * Get the infos from the business objects defined in $aBoIds
+     * @param array $aBoIds
+     * @return array
+     */
+    function getBusinessObjectsInfos($aBoIds) {
+        $aBoInfos = array();
+        for ($i = 0; $i < count($aBoIds); $i++) {
+            $aPath = array('vmap', 'businessobjects', $aBoIds[$i]);
+            $aValues = $this->aValues;
+            $aValues['my_vitis_id'] = $aBoIds[$i];
+            $oBo = new BusinessObject($aPath, $aValues, $this->aProperties, false, $this->oConnection);
+            $oBo->GET();
+            array_push($aBoInfos, $oBo->aFields);
+        }
+        return $aBoInfos;
+    }
+
+    /**
+     * @SWG\Post(path="/layers",
+     *   tags={"Layers"},
+     *   summary="Add layer",
+     *   description="Request to add a layer",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="theme_id",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="service_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="visible",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     * @SWG\Parameter(
+     *     name="bo_id",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="layer_list",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *
+     *  )
+     *
+     * )
+     */
+    /**
+     * @SWG\Post(path="/layers/{layer_id}/form/{form}",
+     *   tags={"Layers"},
+     *   summary="Generates the layer form",
+     *   description="Request to add a layer form",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="Layer id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     * )
+     */
+
+    /**
+     * insert layer
+     * @return array containing the status and the message
+     */
+    function POST() {
+
+        // /layers/{layer_id}/form/{form}
+        if (isset($this->aPath[4])) {
+            if (isset($this->oConnection->oError) && !empty($this->oConnection->oError)) {
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            if (!in_array('vmap_admin', $this->oConnection->aPrivileges)) {
+                $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            $layerId = $this->aPath[2];
+            $sFormName = $this->aPath[4];
+            return $this->generateEmptyForm($layerId, $sFormName);
+        }
+        // Supprime le champ 'bo_id' à NULL si il est vide (sinon erreur avec la contrainte "fk_layer_business_object").
+        $sBoId = $this->aValues['bo_id'];
+        if (empty($sBoId))
+            unset($this->aValues['bo_id']);
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'layer', $this->aProperties['schema_vmap'] . '.seq_common', 'layer_id');
+        if ($aReturn['sStatus'] == 1) {
+            // Met à jour le champ 'bo_id' à NULL.
+            if (empty($sBoId)) {
+                require $this->sRessourcesFile;
+                $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+                $aParams['layer_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+                $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['setLayerBoId'], $aParams);
+            }
+            // Associe les objets métiers à la couche
+            if (!empty($this->aValues['my_vitis_id'])) {
+                $aBoList = explode('|', $this->aValues['bo_id_list']);
+                $this->associateBusinessobjects($aBoList, $this->aValues['my_vitis_id']);
+            }
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * Generate the form
+     * @param string $layerId
+     * @param string $sFormName
+     * @return string jsonContent of the form
+     */
+    function generateEmptyForm($layerId, $sFormName) {
+
+        $oForm = new Form($this->aProperties, $this->oConnection);
+
+        $aRows = array();
+        $aForm = $oForm->generateFormByRows($aRows, $layerId, $sFormName);
+
+        $sDirPath = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $layerId;
+
+        // création de l'arborescence si elle n'existe pas
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap');
+        }
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap/layer')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap/layer');
+        }
+        if (!is_dir($sDirPath)) {
+            @mkdir($sDirPath);
+        }
+        if (!is_dir($sDirPath . '/forms')) {
+            @mkdir($sDirPath . '/forms');
+        }
+        if (!is_dir($sDirPath . '/forms/ressources')) {
+            @mkdir($sDirPath . '/forms/ressources');
+        }
+
+        $JSONcontent = json_encode($aForm);
+
+        // écrit le fichier demandé
+        $formFile = fopen($sDirPath . '/forms/' . $sFormName . '.json', 'w');
+        fwrite($formFile, $JSONcontent);
+        fclose($formFile);
+
+        // écrit les autres fichiers si ils n'existent pas
+        if (!file_exists($sDirPath . '/forms/default.json')) {
+            $formFile = fopen($sDirPath . '/forms/default.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+        if (!file_exists($sDirPath . '/forms/published.json')) {
+            $formFile = fopen($sDirPath . '/forms/published.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+        if (!file_exists($sDirPath . '/forms/custom.json')) {
+            $formFile = fopen($sDirPath . '/forms/custom.json', 'w');
+            fwrite($formFile, $JSONcontent);
+            fclose($formFile);
+        }
+
+        return $JSONcontent;
+    }
+
+    /**
+     * @SWG\Put(path="/layers/{layer_id}",
+     *   tags={"Layers"},
+     *   summary="Update Layer",
+     *   description="Request to update layer",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="theme_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="service_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="visible",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     * @SWG\Parameter(
+     *     name="bo_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="layer_list",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     ),
+     *
+     *  )
+     */
+    /**
+     * @SWG\Put(path="/layers/{layer_id}/form/{form}",
+     *   tags={"Layers"},
+     *   summary="Modify layer form",
+     *   description="Request to modify a layer form",
+     *   operationId="PUT",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="Layer id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="form",
+     *     in="path",
+     *     description="form name (default, published, custom)",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="json_file",
+     *     in="formData",
+     *     description="Wsubform.json",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="js_file",
+     *     in="formData",
+     *     description="Javascript file link with WSubform",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="css_file",
+     *     in="formData",
+     *     description="Css file link with WSubform",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="cmd",
+     *     in="query",
+     *     description="Perso_Save, Perso_Published, Default_Published, Perso_Reset, Default_Reset",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     * )
+     */
+
+    /**
+     * modify layer
+     * @return array containing the status and the message
+     */
+    function PUT() {
+
+        // /layers/{layer_id}/form/{form}
+        if (isset($this->aPath[4])) {
+            if (isset($this->oConnection->oError) && !empty($this->oConnection->oError)) {
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            if (!in_array('vmap_admin', $this->oConnection->aPrivileges)) {
+                $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            $layerId = $this->aPath[2];
+            $sFormName = $this->aPath[4];
+            $sComand = $this->aValues['cmd'];
+            $this->putForm($layerId, $sFormName, $sComand);
+        } else {
+
+            // Supprime le champ 'bo_id' à NULL si il est vide (sinon erreur avec la contrainte "fk_layer_business_object").
+            $sBoId = $this->aValues['bo_id'];
+            if (empty($sBoId))
+                unset($this->aValues['bo_id']);
+            $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'layer', 'layer_id');
+            if ($aReturn['sStatus'] == 1) {
+                // Met à jour le champ 'bo_id' à NULL.
+                if (empty($sBoId)) {
+                    require $this->sRessourcesFile;
+                    $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+                    $aParams['layer_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+                    $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['setLayerBoId'], $aParams);
+                }
+                // Associe les objets métiers à la couche
+                if (!empty($this->aValues['my_vitis_id'])) {
+                    $aBoList = explode('|', $this->aValues['bo_id_list']);
+                    $this->associateBusinessobjects($aBoList, $this->aValues['my_vitis_id']);
+                }
+            }
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * Change the business object form using this->aValues
+     * @param string $layerId
+     * @param string $formName
+     * @param string $sComand
+     */
+    function putForm($layerId, $sFormName, $sComand) {
+
+        $sDirPath = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $layerId;
+
+        // création de l'arborescence si elle n'existe pas
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap');
+        }
+        if (!is_dir($this->aProperties['ws_data_dir'] . '/vmap/layer')) {
+            @mkdir($this->aProperties['ws_data_dir'] . '/vmap/layer');
+        }
+        if (!is_dir($sDirPath)) {
+            @mkdir($sDirPath);
+        }
+        if (!is_dir($sDirPath . '/forms')) {
+            @mkdir($sDirPath . '/forms');
+        }
+        if (!is_dir($sDirPath . '/forms/ressources')) {
+            @mkdir($sDirPath . '/forms/ressources');
+        }
+
+        if ($this->aValues["cmd"]) {
+            switch ($this->aValues["cmd"]) {
+                case "Perso_Save":
+
+                    if (!empty($this->aValues['Json'])) {
+                        $pFile = fopen($sDirPath . '/forms/' . $sFormName . '.json', 'w');
+                        if (fwrite($pFile, $this->aValues["Json"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.json save failed');
+                        }
+                        fclose($pFile);
+                    }
+
+                    if ($this->aValues["Js"] != "") {
+                        $pFileJS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.js', 'w+');
+                        if (fwrite($pFileJS, $this->aValues["Js"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.js save failed');
+                        }
+                        fclose($pFileJS);
+                    }
+
+                    if ($this->aValues["Css"] != "") {
+                        $pFileCSS = fopen($sDirPath . '/forms/ressources/' . $sFormName . '.css', 'w+');
+                        if (fwrite($pFileCSS, $this->aValues["Css"]) == FALSE) {
+                            writeToErrorLog('ERROR: ' . $sFormName . '.css save failed');
+                        }
+                        fclose($pFileCSS);
+                    }
+
+                    break;
+                case "Perso_Published":
+
+                    @unlink($sDirPath . "/forms/published.json");
+                    copy($sDirPath . "/forms/custom.json", $sDirPath . "/forms/published.json");
+
+                    if (file_exists($sDirPath . "/forms/ressources/custom.js")) {
+                        if (file_exists($sDirPath . "/forms/ressources/published.js")) {
+                            @unlink($sDirPath . "/forms/ressources/published.js");
+                        }
+                        copy($sDirPath . "/forms/ressources/custom.js", $sDirPath . "/forms/ressources/published.js");
+                    }
+                    if (file_exists($sDirPath . "/forms/ressources/custom.css")) {
+                        if (file_exists($sDirPath . "/forms/ressources/published.css")) {
+                            @unlink($sDirPath . "/forms/ressources/published.css");
+                        }
+                        copy($sDirPath . "/forms/ressources/custom.css", $sDirPath . "/forms/ressources/published.css");
+                    }
+
+                    break;
+                case "Default_Published":
+
+                    @unlink($sDirPath . "/forms/published.json");
+                    copy($sDirPath . "/forms/default.json", $sDirPath . "/forms/published.json");
+
+                    break;
+                case "Perso_Reset":
+
+                    @unlink($sDirPath . "/forms/custom.json");
+                    copy($sDirPath . "/forms/default.json", $sDirPath . "/forms/custom.json");
+
+                    break;
+                case "Default_Reset" :
+                    @unlink($sDirPath . "/forms/default.json");
+                    $this->generateEmptyForm($layerId, $sFormName);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Associate the business objects to the layer
+     * @param array $aBoList
+     * @param integer $iLayerId
+     */
+    function associateBusinessobjects($aBoList, $iLayerId) {
+        require $this->sRessourcesFile;
+
+        if (count($aBoList) > 0) {
+            // Supprime les objets métiers actuellements liés à la couche
+            $aSQLParams = array(
+                'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                'layer_id' => array('value' => $iLayerId, 'type' => 'number')
+            );
+            $oResult = $this->oConnection->oBd->executeWithParams($aSql['deleteAssociatedBos'], $aSQLParams);
+
+            // Ajoute les objets métiers à la couche
+            for ($i = 0; $i < count($aBoList); $i++) {
+                if (!empty($aBoList[$i])) {
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'business_object_id' => array('value' => $aBoList[$i], 'type' => 'string'),
+                        'layer_id' => array('value' => $iLayerId, 'type' => 'number')
+                    );
+                    $oResult = $this->oConnection->oBd->executeWithParams($aSql['addAssociatedBos'], $aSQLParams);
+                }
+            }
+        }
+    }
+
+    /**
+     * @SWG\Delete(path="/layers/",
+     *   tags={"Layers"},
+     *   summary="delete Layer",
+     *   description="Request to delete Layer",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="layer token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the layers",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/layers/{layer_id}",
+     *   tags={"Layers"},
+     *   summary="delete Layer",
+     *   description="Request to delete Layer",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="layer token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="layer_id",
+     *     in="path",
+     *     description="id of the layer",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/layers")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete layer
+     * @return id of layer deleted or error object if a layer is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'layer', 'layer_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
diff --git a/web_service/ws/LieuDit.class.inc b/web_service/ws/LieuDit.class.inc
deleted file mode 100755
index 1dcf2a5d65313c65a1ba64034232e451fde1bba6..0000000000000000000000000000000000000000
--- a/web_service/ws/LieuDit.class.inc
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-
-/**
- * \file LieuDit.class.inc
- * \class LieuDit
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the LieuDit php class
- *
- * This class defines operation for one LieuDit
- * 
- */
-class LieuDit extends Cadastre {
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/LieuDits.class.inc b/web_service/ws/LieuDits.class.inc
deleted file mode 100755
index 2a33874d4f4540f79ca16cf5a5f3921058a4cef3..0000000000000000000000000000000000000000
--- a/web_service/ws/LieuDits.class.inc
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-/**
- * \file LieuDits.class.inc
- * \class LieuDits
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the LieuDits php class
- *
- * This class defines Rest Api to Vmap LieuDits
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'LieuDit.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-class LieuDits extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/lieudits",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/lieudits")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="lieudits",
-     *   description="Operations about lieudits"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("oid", "id_com", "code_com", "section", "pre", "texte", "tex", "tex2", "tex3", "tex4", "tex5", "tex6", "tex7", "tex8", "tex9", "tex10", "geom");
-    }
-
-    /**
-     * @SWG\Get(path="/lieudits",
-     *   tags={"LieuDit"},
-     *   summary="Get LieuDits",
-     *   description="Request to get LieuDits",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="order_by",
-     *     in="query",
-     *     description="list of ordering fields",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sort_order",
-     *     in="query",
-     *     description="sort order",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="limit",
-     *     in="query",
-     *     description="number of element",
-     *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="offset",
-     *     in="query",
-     *     description="index of first element",
-     *     required=false,
-     *     type="string",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="attributs",
-     *     in="query",
-     *     description="list of attributs",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="filter",
-     *     in="query",
-     *     description="filter results",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="distinct",
-     *     in="query",
-     *     description="delete duplicates",
-     *     required=false,
-     *     type="boolean"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/lieudits")
-     *     )
-     *  )
-     */
-
-    /**
-     * get LieuDits
-     * @return  LieuDits
-     */
-    function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['lieu_dit'], 'oid');
-        return $aReturn['sMessage'];
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Map.class.inc b/web_service/ws/Map.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..f57f594551256f366c1ed2003f93b161b6500820
--- /dev/null
+++ b/web_service/ws/Map.class.inc
@@ -0,0 +1,119 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Map.class.inc
+ * \class Map
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Map php class
+ *
+ * This class defines operation for one Map
+ * 
+ */
+class Map extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+		$this->aSelectedFields = Array("map_id", "crs_id", "name", "description", "crs_name", "extent", "catalog_index", "thumbnail", "theme_name", "theme_description", "maptheme_id", "groups");
+    }
+
+    /**
+     * @SWG\Get(path="/maps/{map_id}", 
+     *   tags={"Maps"},
+     *   summary="Get Map",
+     *   description="Request to get Map by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="map id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about Map
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_map', 'map_id');
+        $this->getGroups();
+    }
+
+    /**
+     *  get groups of map
+     */
+    function getGroups() {
+        require $this->sRessourcesFile;
+        if (in_array("groups", $this->aSelectedFields)){
+            $aParams['sSchemaFramework'] = array('value' => $this->aProperties['schema_framework'], 'type' => 'schema_name');
+            $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+            $aParams['map_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getMapGroups'], $aParams);
+            $sListGroupId = "";
+            $aListGroupName = array();
+            while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+                    if ($sListGroupId == ""){
+                            $sListGroupId = $aLigne["group_id"];
+                    }else{
+                            $sListGroupId .= "|".$aLigne["group_id"];
+                    }
+                    $aListGroupName[] = $aLigne["name"];
+            }
+            $oPDOresult=$this->oConnection->oBd->fermeResultat();
+            $this->aFields['groups'] = $sListGroupId;
+            $this->aFields['groups_label'] = implode(',', $aListGroupName);
+        }
+    }
+    
+    /**
+     * delete a map
+     */
+    function DELETE() {
+        // Supprime la vignette.
+        $oMap = new Map($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oMap->GET();
+        if (!empty($oMap->aFields['thumbnail'])) {
+            $sFile = $oMap->aProperties['dir_export'] . '/vmap/' . $oMap->aFields['thumbnail'];
+            if (file_exists($sFile))
+                unlink($sFile);
+        }
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'map', 'map_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields['map_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapCatalog.class.inc b/web_service/ws/MapCatalog.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..34e8a343a09402b2728ff8e2f7952bb479d40099
--- /dev/null
+++ b/web_service/ws/MapCatalog.class.inc
@@ -0,0 +1,265 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once 'Maps.class.inc';
+require_once 'Services.class.inc';
+require_once 'Layers.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Users.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Map.class.inc
+ * \class Map
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Map php class
+ *
+ * This class defines operation for one Map
+ * 
+ */
+class MapCatalog extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->aValues['getGroup'] = true;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * @SWG\Get(path="/mapcatalog", 
+     *   tags={"Catalog"},
+     *   summary="Get Map",
+     *   description="Request to get Map by id",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapcatalog")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about Map
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+
+        // Récupère les groupes correspondants
+        $sGroups = $this->oConnection->sesGroup;
+
+        // Récupère les cartes correspondante      
+        $aMaps = $this->getMaps($sGroups);
+
+        // Récupère les services correspondants
+        $aServices = $this->getServices();
+
+        $MapCatalog['usedMap'] = 0;
+        $MapCatalog['maps'] = $aMaps;
+        $MapCatalog['services'] = $aServices;
+
+        $this->aFields = $MapCatalog;
+
+        $aXmlRacineAttribute['status'] = 1;
+        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+
+        // Génération du flux wms privé.
+        if (!empty($properties["use_veremap_api"]) && $properties["use_veremap_api"] === true) {
+            // 1- Récupère le token veremap 2015
+            $params = array(
+                "user" => $oConnection->oBd->login,
+                "password" => $oConnection->oBd->mdp,
+                "duration" => 600
+            );
+            $oVeremap = json_decode($this->httpPost($properties["api_veremap"] . "/vitis/privatetoken", $params));
+            if (is_object($oVeremap)) {
+                $veremapToken = $oVeremap->token;
+                // 2- Génère le flux privé qui aura pour nom de mapFile le token de vitis 2016
+                $params = array(
+                    "token" => $veremapToken,
+                    "fileName" => hash('sha256', $aValues['token'])
+                );
+                $this->httpPost($properties["api_veremap"] . "/veremap/WMS", $params);
+            }
+        }
+        // Création du fichier ".map" du flux wms privé de Vmap4MapServer (nom du fichier = token de l'utilisateur connecté).
+        if (!empty($properties["use_vm4ms_api"]) && $properties["use_vm4ms_api"] === true && file_exists(dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/WmsServices.class.inc')) {
+            require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/WmsServices.class.inc';
+
+            $aPath = array('vm4ms', 'wmsservices', 'private', 'MapFile');
+
+            $aValues = array(
+                'token' => $this->aValues['token'],
+                'my_vitis_id' => $properties['private_wms_service'],
+                'creation' => 'true',
+                'type' => 'prod'
+            );
+
+            $oWmsServices = new WmsServices($aPath, $aValues, $this->aProperties, $this->oConnection);
+            $oWmsServices->GET();
+            $oWmsServices->createMapFile();
+        }
+        return $sMessage;
+    }
+
+    /**
+     * Get the maps for the group_id
+     * @param string $sGroups
+     * @return array
+     */
+    function getMaps($sGroups) {
+
+        if (empty($sGroups)) {
+            return array();
+        }
+
+        $sGroups = str_replace(',', '|', $sGroups);
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+        $filterList = '';
+
+        $aSQLParams = array(
+            'sSchema' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'sGroups' => array('value' => $sGroups, 'type' => 'group')
+        );
+        $sSql = "SELECT map_id, group_id FROM [sSchema].map_group WHERE \"group_id\" in ([sGroups])";
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if (gettype($oResult) == 'object') {
+            $aLayers_infos = Array();
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                // stocke le layer id dans la chaine de caractères
+                if ($filterList == '')
+                    $filterList .= $aLigne['map_id'];
+                else
+                    $filterList .= ',' . $aLigne['map_id'];
+            }
+        } else {
+            return Array();
+        }
+
+        unset($aValues['my_vitis_id']);
+        $aValues['filter'] = '{"column":"map_id","compare_operator":"IN","value":[' . $filterList . ']}';
+        $aValues['attributs'] = 'name|description|theme_name|theme_description|extent_crs_id|map_id|thumbnail|catalog_index';
+        $aValues['order_by'] = 'catalog_index';
+
+        $oMaps = new Maps(Array('vmap', 'map'), $aValues, $this->aProperties);
+        $oMaps->GET();
+
+        // Transforme $oMaps en tableau de Map
+        $aMaps = Array();
+        foreach ($oMaps->aObjects as $oMap) {
+            $oMap->aFields['url'] = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/vmap/mapjsons/' . $oMap->aFields['map_id'];
+            array_push($aMaps, $oMap->aFields);
+        }
+
+        return $aMaps;
+    }
+
+    /**
+     * Get the services avaliables (with the layers params for bing and ign)
+     * @return array
+     */
+    function getServices() {
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+
+        unset($aValues['my_vitis_id']);
+        $oServices = new Services(Array('vmap', 'services'), $aValues, $this->aProperties);
+        $oServices->GET();
+
+        $aServices['wms'] = Array();
+        $aServices['osm'] = Array();
+        $aServices['bing'] = Array();
+        $aServices['ign'] = Array();
+        $aServices['wmts'] = Array();
+        $aServices['xyz'] = Array();
+        foreach ($oServices->aObjects as $oService) {
+            switch ($oService->aFields['service_type_id']) {
+                case 'tilewms':
+                case 'imagewms':
+                    $oService->aFields['url'] = str_replace('[token]', hash('sha256', $aValues['token']), $oService->aFields['url']);
+                    if (isset($this->aProperties['ms_cgi_url'])) {
+                        $oService->aFields['url'] = str_replace('[ms_cgi_url]', $this->aProperties['ms_cgi_url'], $oService->aFields['url']);
+                    }
+                    array_push($aServices['wms'], $oService->aFields);
+                    break;
+                case 'wmts':
+                    array_push($aServices['wmts'], $oService->aFields);
+                    break;
+                case 'xyz':
+                    array_push($aServices['xyz'], $oService->aFields);
+                    break;
+                case 'osm':
+                    array_push($aServices['osm'], $oService->aFields);
+                    break;
+                case 'bing':
+                    $oService->aFields['imagerySet'] = $oService->aFields['imagery'];
+                    $oService->aFields['culture'] = $oService->aFields['lang'];
+                    array_push($aServices['bing'], $oService->aFields);
+                    break;
+                case 'geoportail':
+                    break;
+            }
+        }
+
+        return $aServices;
+    }
+
+    function httpPost($url, $params) {
+        $postData = '';
+        //create name value pairs seperated by &
+        foreach ($params as $k => $v) {
+            $postData .= $k . '=' . $v . '&';
+        }
+        $postData = rtrim($postData, '&');
+
+        $ch = curl_init();
+
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_POST, count($postData));
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
+
+        $output = curl_exec($ch);
+
+        curl_close($ch);
+        return $output;
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapCatalogs.class.inc b/web_service/ws/MapCatalogs.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..f5e622507600eb658e9093ae25df2af9ec1a9810
--- /dev/null
+++ b/web_service/ws/MapCatalogs.class.inc
@@ -0,0 +1,40 @@
+<?php
+/**
+* \file Maps.class.inc
+* \class Maps
+*
+* \author Armand Bahi <armand.bahi@veremes.com>.
+*
+* \brief This file contains the Maps php class
+*
+* This class defines Rest Api to Vmap Maps
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once 'MapCatalog.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class MapCatalogs extends Vmap {
+    
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+    /**
+     * get Maps
+     * @return  Maps
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_map', 'map_id');        
+        return $aReturn['sMessage'];
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapJSON.class.inc b/web_service/ws/MapJSON.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..b31c07ba67f8e470f522349c22e86321e0e9e9db
--- /dev/null
+++ b/web_service/ws/MapJSON.class.inc
@@ -0,0 +1,351 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once 'Map.class.inc';
+require_once 'Layers.class.inc';
+require_once 'BusinessObject.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Map.class.inc
+ * \class Map
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Map php class
+ *
+ * This class defines operation for one Map
+ *
+ */
+class MapJSON extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Get(path="/mapjsons/{map_id}",
+     *   tags={"MapJSON"},
+     *   summary="Get Map",
+     *   description="Request to get Map by id",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="map id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapjsons")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about Map
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+
+        // Récupère la carte correspondante
+        $oMap = new Map(Array('vmap', 'maps'), $aValues, $properties, $oConnection);
+        $oMap->GET();
+
+        // Récupère les calques correspondants
+        $aLayers = $this->getMapLayers($aPath[2]);
+
+        for ($i = 0; $i < count($aLayers); $i++) {
+            $aLayers[$i]->aFields['events'] = $this->getLayersEvents($aLayers[$i]->aFields['layer_id']);
+        }
+
+        // Forme l'objet mapjson
+        $oMapJSON['name'] = 'Tree';
+        $oMapJSON['children'] = Array();
+
+        $extent = explode('|', $oMap->aFields['extent']);
+
+        foreach ($extent as $key => $value) {
+            $extent[$key] = floatval($value);
+        }
+
+        $oMapJSON['children'][0]['view']['extent'] = $extent;
+        $oMapJSON['children'][0]['view']['projection'] = $oMap->aFields['crs_id'];
+
+        // Réordonne les calques pour qu'ils correspondent à la définition vmap
+        $aThemes = $this->reorderLayers($aLayers);
+
+        $i = 1;
+        foreach ($aThemes as $themeName => $themeParams) {
+            $oMapJSON['children'][$i]['name'] = $themeName;
+            $oMapJSON['children'][$i]['children'] = $themeParams;
+            $i++;
+        }
+
+        // Écrit dans les log de vMap
+        $this->writeMapToVMapLog($oMap->aFields['map_id'], $oMap->aFields['name']);
+
+        $this->aFields = $oMapJSON;
+    }
+
+    /**
+     * Get an array of layers (with state infos like opacity etc..) by map_id
+     * @param number $map_id
+     * @return array aLayers
+     */
+    function getMapLayers($map_id) {
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+        $filterList = '';
+
+        $aSQLParams = array(
+            'sSchema' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'sMapId' => array('value' => $map_id, 'type' => 'number')
+        );
+        $sSql = "SELECT * FROM [sSchema].map_layer WHERE \"map_id\" = [sMapId]";
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if (gettype($oResult) == 'object') {
+            $aLayers_infos = Array();
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                // stocke le layer id dans la chaine de caractères
+                if ($filterList == '')
+                    $filterList .= $aLigne['layer_id'];
+                else
+                    $filterList .= ',' . $aLigne['layer_id'];
+
+                // stocke les infos complémentaires du calque (visible, opacity etc...)
+                $tmp['layer_index'] = $aLigne['layer_index'];
+                $tmp['layer_visible'] = $aLigne['layer_visible'];
+                $tmp['layer_opacity'] = $aLigne['layer_opacity'];
+                $aLayers_infos[$aLigne['layer_id']] = $tmp;
+                unset($tmp);
+            }
+        } else {
+            return Array();
+        }
+
+        if (empty($filterList)) {
+            return Array();
+        }
+
+        unset($aValues['my_vitis_id']);
+        $aValues['filter'] = '{"column":"layer_id","compare_operator":"IN","value":[' . $filterList . ']}';
+        $aValues['order_by'] = 'name';
+
+        $oLayers = new Layers(Array('vmap', 'layer'), $aValues, $this->aProperties);
+        $oLayers->GET();
+
+        // Transforme oLayers en tableau de Layer
+        $aLayers = Array();
+        foreach ($oLayers->aObjects as $oLayer) {
+            // Rajoute les informations sur l'état du calque
+            foreach ($aLayers_infos[$oLayer->aFields['layer_id']] as $key => $value) {
+                $oLayer->aFields[$key] = $value;
+            }
+            $oLayer->aFields['filter_form'] = $oLayer->getFilterForm();
+            $oLayer->aFields['filter_form_embedjs'] = $oLayer->getFilterFormJs();
+            array_push($aLayers, $oLayer);
+        }
+
+        return $aLayers;
+    }
+
+    /**
+     * Get the events from a layer
+     * @param string $layer_id
+     * @return array
+     */
+    function getLayersEvents($layer_id) {
+
+        $aSQLParams = array(
+            'sSchema' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'sLayerId' => array('value' => $layer_id, 'type' => 'number')
+        );
+        $sSql = "SELECT * FROM [sSchema].layer_event WHERE \"layer_id\" = [sLayerId]";
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if (gettype($oResult) == 'object') {
+            $aEvents = Array();
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                array_push($aEvents, $aLigne['event_id']);
+            }
+        }
+
+        return $aEvents;
+    }
+
+    /**
+     * Reorder the layers like vmap definition
+     * @param array $aLayers
+     * @return array
+     */
+    function reorderLayers($aLayers) {
+
+        $aThemes = Array();
+        foreach ($aLayers as $oLayer) {
+
+            if (!isset($oLayer->aFields['theme_name']))
+                $oLayer->aFields['theme_name'] = $oLayer->aFields['service_name'];
+
+            if (!isset($aThemes[$oLayer->aFields['theme_name']]))
+                $aThemes[$oLayer->aFields['theme_name']] = Array();
+
+            if (!empty($oLayer->aFields['name']))
+                $tmp['name'] = $oLayer->aFields['name'];
+            else
+                continue;
+
+            if (!empty($oLayer->aFields['service_type_id']))
+                $tmp['layerType'] = $oLayer->aFields['service_type_id'];
+            else
+                continue;
+
+            if (!empty($oLayer->aFields['service_url'])) {
+                $tmp['url'] = $oLayer->aFields['service_url'];
+                $tmp['url'] = str_replace('[token]', hash('sha256', $this->aValues['token']), $tmp['url']);
+                if (isset($this->aProperties['ms_cgi_url'])) {
+                    $tmp['url'] = str_replace('[ms_cgi_url]', $this->aProperties['ms_cgi_url'], $tmp['url']);
+                }
+            }
+
+            if (!empty($oLayer->aFields['layer_index']))
+                $tmp['index'] = $oLayer->aFields['layer_index'];
+            else
+                $tmp['index'] = 0;
+
+            if (!empty($oLayer->aFields['service_key']))
+                $tmp['key'] = $oLayer->aFields['service_key'];
+
+            $tmp['visible'] = $oLayer->aFields['layer_visible'];
+
+            if (!empty($oLayer->aFields['layer_opacity']))
+                $tmp['opacity'] = $oLayer->aFields['layer_opacity'] / 100;
+
+            if (!empty($oLayer->aFields['events']))
+                $tmp['events'] = $oLayer->aFields['events'];
+
+            if (!empty($oLayer->aFields['is_dynamic']))
+                $tmp['is_dynamic'] = $oLayer->aFields['is_dynamic'];
+            else
+                $tmp['is_dynamic'] = false;
+
+            if (!empty($oLayer->aFields['is_bo_filtered']))
+                $tmp['is_bo_filtered'] = $oLayer->aFields['is_bo_filtered'];
+            else
+                $tmp['is_bo_filtered'] = false;
+
+            if (!empty($oLayer->aFields['is_queryable_getfeatureinfo']))
+                $tmp['is_queryable_getfeatureinfo'] = $oLayer->aFields['is_queryable_getfeatureinfo'];
+            else
+                $tmp['is_queryable_getfeatureinfo'] = false;
+
+            if (!empty($oLayer->aFields['is_filtered']) && !empty($oLayer->aFields['filter_form']))
+                $tmp['is_filtered'] = $oLayer->aFields['is_filtered'];
+            else
+                $tmp['is_filtered'] = false;
+
+            if (!empty($oLayer->aFields['filter_form']))
+                $tmp['filter_form'] = $oLayer->aFields['filter_form'];
+
+            if (!empty($oLayer->aFields['filter_form_embedjs']))
+                $tmp['filter_form_embedjs'] = $oLayer->aFields['filter_form_embedjs'];
+
+            if (!empty($oLayer->aFields['matrix_set']))
+                $tmp['matrixSet'] = $oLayer->aFields['matrix_set'];
+
+            if (!empty($oLayer->aFields['layer_style']))
+                $tmp['style'] = $oLayer->aFields['layer_style'];
+
+            if (!empty($oLayer->aFields['layer_format']))
+                $tmp['format'] = $oLayer->aFields['layer_format'];
+
+            // Problèmes en cas de rest
+            if (!empty($oLayer->aFields['service_type_type']))
+                $tmp['requestEncoding'] = $oLayer->aFields['service_type_type'];
+
+            if (!empty($oLayer->aFields['layer_options']))
+                $tmp['layer_options'] = $oLayer->aFields['layer_options'];
+
+            if (!empty($oLayer->aFields['service_options']))
+                $tmp['service_options'] = $oLayer->aFields['service_options'];
+
+            if (!empty($oLayer->aFields['service_login']))
+                $tmp['service_login'] = $oLayer->aFields['service_login'];
+
+            if (!empty($oLayer->aFields['service_password']))
+                $tmp['service_password'] = $oLayer->aFields['service_password'];
+
+            if (!empty($oLayer->aFields['service_type_version']))
+                $tmp['version'] = $oLayer->aFields['service_type_version'];
+
+            if ($oLayer->aFields['service_type_id'] == 'imagewms') {
+                $tmp['ratio'] = 1;
+            }
+
+            if ($oLayer->aFields['service_type_id'] == 'tilewms' || $oLayer->aFields['service_type_id'] == 'imagewms') {
+                if (!empty($oLayer->aFields['layer_list']))
+                    $tmp['params']['LAYERS'] = $oLayer->aFields['layer_list'];
+                if (!empty($oLayer->aFields['service_type_version']))
+                    $tmp['params']['VERSION'] = $oLayer->aFields['service_type_version'];
+            } else if ($oLayer->aFields['service_type_id'] == 'bing') {
+                $tmp['imagerySet'] = $oLayer->aFields['service_imagery'];
+                $tmp['culture'] = $oLayer->aFields['service_lang'];
+            } else {
+                if (!empty($oLayer->aFields['layer_list']))
+                    $tmp['layer'] = $oLayer->aFields['layer_list'];
+            }
+
+            // Définit si le calque est interrogeable en consultation
+            if (!empty($oLayer->aFields['business_objects'])) {
+                // selection_buffer par défaut
+                for ($i = 0; $i < count($oLayer->aFields['business_objects']); $i++) {
+                    if (!isset($oLayer->aFields['business_objects'][$i]['selection_buffer'])) {
+                        $oLayer->aFields['business_objects'][$i]['selection_buffer'] = 5;
+                    }
+                }
+                $tmp['bo_queryable'] = true;
+                $tmp['business_objects'] = $oLayer->aFields['business_objects'];
+            } else {
+                $tmp['bo_queryable'] = false;
+            }
+
+            $tmp['layer_id'] = $oLayer->aFields['layer_id'];
+
+            array_push($aThemes[$oLayer->aFields['theme_name']], $tmp);
+            unset($tmp);
+        }
+
+        return $aThemes;
+    }
+
+}
+
+?>
diff --git a/web_service/ws/MapJSONs.class.inc b/web_service/ws/MapJSONs.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..1b157d03c1dafd717b0f1627495635e41fb7fc70
--- /dev/null
+++ b/web_service/ws/MapJSONs.class.inc
@@ -0,0 +1,41 @@
+<?php
+/**
+* \file Maps.class.inc
+* \class Maps
+*
+* \author Armand Bahi <armand.bahi@veremes.com>.
+*
+* \brief This file contains the Maps php class
+*
+* This class defines Rest Api to Vmap Maps
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once 'MapJSON.class.inc';
+require_once 'BusinessObject.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class MapJSONs extends Vmap {
+    
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+    /**
+     * get Maps
+     * @return  Maps
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_map', 'map_id');
+        return $aReturn['sMessage'];
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapLayer.class.inc b/web_service/ws/MapLayer.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..d2448ab6c4612ab9ec91bd31da3695cb5a2801ca
--- /dev/null
+++ b/web_service/ws/MapLayer.class.inc
@@ -0,0 +1,57 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file MapLayer.class.inc
+ * \class MapLayer
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the MapLayer php class
+ *
+ * This class defines operation for one MapLayer
+ * 
+ */
+class MapLayer extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+		$this->aSelectedFields = Array("layer_id", "name", "theme_name", "layer_visible", "map_id", "layer_opacity", "layer_index");
+    }
+
+    /**
+     * get informations about MapLayer
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_map_layer', 'map_id');
+    }
+
+    /**
+     * delete a map
+     */
+    function DELETE(){
+        /*
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'v_map_layer', 'map_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields[map_id] = $this->aValues['my_vitis_id'];
+        }
+        */
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapLayers.class.inc b/web_service/ws/MapLayers.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..163ca659216fb8927736cf43f559f3d87c55a65b
--- /dev/null
+++ b/web_service/ws/MapLayers.class.inc
@@ -0,0 +1,448 @@
+<?php
+
+/**
+ * \file MapLayers.class.inc
+ * \class MapLayers
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the MapLayers php class
+ *
+ * This class defines Rest Api to Vmap MapLayers
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'MapLayer.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class MapLayers extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/maplayers",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/maplayers")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="MapLayers",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("layer_id", "name", "theme_name", "layer_visible", "map_id", "layer_opacity", "layer_index");
+    }
+
+    /**
+     * @SWG\Get(path="/mapLayers",
+     *   tags={"MapLayers"},
+     *   summary="Get map layers",
+     *   description="Request to get map layers",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Porperties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     )
+     *  )
+     */
+
+    /**
+     * get MapLayers
+     * @return  MapLayers
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_map_layer', 'map_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/maplayers/{map_id}",
+     *   tags={"MapLayers"},
+     *   summary="Update map layers",
+     *   description="Request to update the layers of a map",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="Id of the map",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_layers",
+     *     in="query",
+     *     description="Layers of the map",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     ),
+     * 
+     *  )
+     */
+    /**
+     * @SWG\Put(path="/maplayers/{map_id}/visibility",
+     *   tags={"MapLayers"},
+     *   summary="Update visibility of map layers",
+     *   description="Request to update the visibility of the layers of a map",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="Id of the map",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_layers",
+     *     in="query",
+     *     description="Layers of the map",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="visibility",
+     *     in="query",
+     *     description="Visibility of the layers",
+     *     required=true,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     ),
+     * 
+     *  )
+     */
+    /**
+     * @SWG\Put(path="/maplayers/{map_id}/sorting",
+     *   tags={"MapLayers"},
+     *   summary="Sort map layers",
+     *   description="Request to sort the layers of a map",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="Id of the map",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_layers",
+     *     in="query",
+     *     description="Layers of the map",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     ),
+     *  )
+     */
+    /**
+     * @SWG\Put(path="/maplayers/{map_id}/opacity",
+     *   tags={"MapLayers"},
+     *   summary="Set opacity of a map layer",
+     *   description="Request to set the opacity of a map layer",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="Id of the map",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_id",
+     *     in="query",
+     *     description="Layer of the map",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="layer_opacity",
+     *     in="query",
+     *     description="Opacity of the layer",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     ),
+     *  )
+     */
+
+    /**
+     * modify map
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        require $this->sRessourcesFile;
+        if (!empty($this->aPath[3])) {
+            if ($this->aPath[3] == "visibility") {
+                // Calques dont la définition doit changer ?
+                if (!empty($this->aValues['map_layers'])) {
+                    $sSql = $aSql['updateMapLayersVisibility'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'visibility' => array('value' => $this->aValues['visibility'], 'type' => 'string'),
+                        'map_id' => array('value' => $this->aValues['my_vitis_id'], 'type' => 'number'),
+                        'map_layers' => array('value' => $this->aValues['map_layers'], 'type' => 'group'),
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    } else {
+                        $aXmlRacineAttribute['status'] = 1;
+                        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            } else if ($this->aPath[3] == "sorting") {
+                if (!empty($this->aValues['map_layers'])) {
+                    $aXmlRacineAttribute['status'] = 1;
+                    $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    $aLayers = explode('|', $this->aValues['map_layers']);
+                    $i = 1;
+                    foreach ($aLayers as $iLayerId) {
+                        $sSql = $aSql['updateMapLayerIndex'];
+                        $aSQLParams = array(
+                            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                            'index' => array('value' => $i, 'type' => 'number'),
+                            'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                            'layer_id' => array('value' => $iLayerId, 'type' => 'number')
+                        );
+                        $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                        if ($this->oConnection->oBd->enErreur()) {
+                            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                            $aXmlRacineAttribute['status'] = 0;
+                            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                            break;
+                        }
+                        $i++;
+                    }
+                }
+            } else if ($this->aPath[3] == "opacity") {
+                $aXmlRacineAttribute['status'] = 1;
+                $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                $sSql = $aSql['updateMapLayerOpacity'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'layer_opacity' => array('value' => $this->aValues['layer_opacity'], 'type' => 'number'),
+                    'layer_id' => array('value' => $this->aValues['layer_id'], 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        } else {
+            // Calques à rattacher à la carte ?
+            if (!empty($this->aValues['map_layers'])) {
+                $aLayers = explode('|', $this->aValues['map_layers']);
+                foreach ($aLayers as $iLayerId) {
+                    $sSql = $aSql['insertMapLayers'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                        'layer_id' => array('value' => $iLayerId, 'type' => 'number')
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    } else {
+                        $aXmlRacineAttribute['status'] = 1;
+                        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            }
+        }
+        return $sMessage;
+    }
+
+    /**
+     * @SWG\Delete(path="/maplayers/{map_id}",
+     *   tags={"MapLayers"},
+     *   summary="Delete map layers",
+     *   description="Request to delete layers of a map",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="map token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="id of the map",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the map layers",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maplayers")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete map
+     * @return id of map deleted or error object if a map is not deleted
+     */
+    function DELETE() {
+        require $this->sRessourcesFile;
+        // Calques à supprimer ?
+        if (!empty($this->aValues['idList'])) {
+            $sSql = $aSql['deleteMapLayers'];
+            $aSQLParams = array(
+                'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                'idList' => array('value' => $this->aValues['idList'], 'type' => 'group')
+            );            
+            $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+            if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            } else {
+                $aXmlRacineAttribute['status'] = 1;
+                $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            }
+        }
+        return $sMessage;
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapTheme.class.inc b/web_service/ws/MapTheme.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..1fe4422dff0de3f6b0013127ed27483453955e6b
--- /dev/null
+++ b/web_service/ws/MapTheme.class.inc
@@ -0,0 +1,84 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file MapTheme.class.inc
+ * \class MapTheme
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the MapTheme php class
+ *
+ * This class defines operation for one MapTheme
+ * 
+ */
+class MapTheme extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("maptheme_id", "name", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/mapthemes/{maptheme_id}", 
+     *   tags={"MapThemes"},
+     *   summary="Get MapTheme",
+     *   description="Request to get MapTheme by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="maptheme_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about mapthemes
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'maptheme', 'maptheme_id');
+    }
+    
+    /**
+     * delete a maptheme
+     */
+    function DELETE(){
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'maptheme', 'maptheme_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields['maptheme_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/MapThemes.class.inc b/web_service/ws/MapThemes.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..a6302d1d4f8b1bbaaf5a20ec73ff6024817424f7
--- /dev/null
+++ b/web_service/ws/MapThemes.class.inc
@@ -0,0 +1,296 @@
+<?php
+
+/**
+ * \file MapThemes.class.inc
+ * \class MapThemes
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the MapThemes php class
+ *
+ * This class defines Rest Api to Vmap MapThemes
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'MapTheme.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class MapThemes extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/mapthemes",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/mapthemes")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="MapThemes",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("maptheme_id", "name", "description");
+    }
+
+    /**
+     * @SWG\Get(path="/mapthemes",
+     *   tags={"MapThemes"},
+     *   summary="Get MapThemes",
+     *   description="Request to get MapThemes",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get MapThemes
+     * @return the array of objects
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'maptheme', 'maptheme_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/mapthemes",
+     *   tags={"MapThemes"},
+     *   summary="Add maptheme",
+     *   description="Request to add a maptheme",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert maptheme
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'maptheme', $this->aProperties['schema_vmap'].'.seq_common', 'maptheme_id');           
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/mapthemes/{maptheme_id}",
+     *   tags={"MapThemes"},
+     *   summary="Update MapTheme",
+     *   description="Request to update maptheme",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="maptheme_id",
+     *     in="path",
+     *     description="user id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="maptheme description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="maptheme description",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify maptheme
+     * @return array containing the status and the message
+     */
+    function PUT() {        
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'maptheme', 'maptheme_id');
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Delete(path="/mapthemes/",
+     *   tags={"MapThemes"},
+     *   summary="delete MapTheme",
+     *   description="Request to delete MapTheme",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the mapthemes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/mapthemes/{maptheme_id}",
+     *   tags={"MapThemes"},
+     *   summary="delete MapTheme",
+     *   description="Request to delete MapTheme",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="maptheme_id",
+     *     in="path",
+     *     description="id of the maptheme",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/mapthemes")
+     *     )
+     *  )
+     */
+    
+    /**
+     * delete maptheme
+     * @return id of maptheme deleted or error object if a maptheme is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'maptheme', 'maptheme_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Maps.class.inc b/web_service/ws/Maps.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..59edd0491d82bf2d30348b6df7a39e4329ef706c
--- /dev/null
+++ b/web_service/ws/Maps.class.inc
@@ -0,0 +1,495 @@
+<?php
+
+/**
+ * \file Maps.class.inc
+ * \class Maps
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Maps php class
+ *
+ * This class defines Rest Api to Vmap Maps
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'Map.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class Maps extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/maps",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/maps")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Maps",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("map_id", "crs_id", "name", "description", "crs_name", "extent", "catalog_index", "thumbnail", "theme_name", "theme_description", "maptheme_id", "groups");
+    }
+
+    /**
+     * @SWG\Get(path="/maps",
+     *   tags={"Maps"},
+     *   summary="Get Maps",
+     *   description="Request to get Maps",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Maps
+     * @return  Maps
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_map', 'map_id', false, 'vmap_admin_map_vmap_admin_map');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/maps",
+     *   tags={"Maps"},
+     *   summary="Add map",
+     *   description="Request to add a map",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="extent",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="crs_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="catalog_index",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="thumbnail",
+     *     in="formData",
+     *     description="Thumbnail of the map",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     )
+     *  )
+     * )
+     */
+
+    /**
+     * insert map
+     * @return array containing the status and the message
+     */
+    function POST() {
+        require $this->sRessourcesFile;
+
+        // Vignette à uploader ?
+        if (!empty($_FILES['thumbnail'])) {
+            // la colonne thumbnail vaudra le nom du fichier
+            $this->aValues["thumbnail"] = $_FILES['thumbnail']["name"];
+        }
+
+        // Redimmensionnement de l'image.
+        if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+            // Renomme l'image en jpg
+            $aPointsArray = explode('.', $this->aValues["thumbnail"]);
+            $aPointsArray[count($aPointsArray) - 1] = 'jpg';
+            $this->aValues["thumbnail"] = join('.', $aPointsArray);
+        }
+
+        // Création de la carte.
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'map', $this->aProperties['schema_vmap'] . '.seq_common', 'map_id');
+
+        // Vignette à uploader ?
+        if (!empty($_FILES['thumbnail'])) {
+            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_admin_map/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $_FILES['thumbnail']["name"];
+
+            // Crée les répertoires si ils n'existent pas
+            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_admin_map', $this->aValues["my_vitis_id"]);
+            $sDirColumnPath = $sDirPath . '/thumbnail';
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
+
+            $sErrorMessage = uploadFile("thumbnail", "", $sImageDir, $_FILES['thumbnail']['size'] + 1);
+
+            if ($sErrorMessage != "") {
+                writeToErrorLog($sErrorMessage);
+            } else {
+                // Redimmensionnement de l'image.
+                if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+                    $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
+                }
+            }
+        }
+
+        // Si création OK -> maj des groupes rattachés à la carte.
+        if ($aReturn['sStatus'] == 1) {
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $oMap = new Map($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+            $oMap->GET();
+            // Groupes à rattacher à la carte ?
+            if (!empty($this->aValues['groups'])) {
+                $aGroups = explode('|', $this->aValues['groups']);
+                foreach ($aGroups as $iGroupId) {
+                    $sSql = $aSql['insertMapGroups'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                        'group_id' => array('value' => $iGroupId, 'type' => 'number')
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            }
+        } else {
+            $sMessage = $aReturn['sMessage'];
+        }
+        return $sMessage;
+    }
+
+    /**
+     * @SWG\Put(path="/maps/{map_id}",
+     *   tags={"Maps"},
+     *   summary="Update Map",
+     *   description="Request to update map",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   consumes= { "multipart/form-data"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="extent_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="crs_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="catalog_index",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="id_theme",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="thumbnail",
+     *     in="formData",
+     *     description="Thumbnail of the map",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify map
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        require $this->sRessourcesFile;
+        // Vignette à uploader ?
+        if (!empty($this->aValues["thumbnail_file"])) {
+
+            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_admin_map/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $this->aValues["thumbnail_name"];
+
+            // Crée les répertoires si ils n'existent pas
+            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_admin_map', $this->aValues["my_vitis_id"]);
+            $sDirColumnPath = $sDirPath . '/thumbnail';
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
+
+            // la colonne thumbnail vaudra le nom du fichier
+            $this->aValues["thumbnail"] = $this->aValues["thumbnail_name"];
+            $fp = fopen($sImageDir, "w");
+            fwrite($fp, $this->aValues["thumbnail_file"]);
+            fclose($fp);
+
+            // Redimmensionnement de l'image.
+            if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+                $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
+                // Renomme l'image en jpg
+                $aPointsArray = explode('.', $this->aValues["thumbnail"]);
+                $aPointsArray[count($aPointsArray) - 1] = 'jpg';
+                $this->aValues["thumbnail"] = join('.', $aPointsArray);
+            }
+        }
+        // Mise à jour.
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'map', 'map_id');
+        // Si mise à jour OK -> maj des groupes rattachés à la carte.
+        if ($aReturn['sStatus'] == 1) {
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            // Supprime les groupes rattachés à la carte.
+            $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'map_group', 'map_id', $this->aValues["my_vitis_id"]);
+            // Groupes à rattacher à la carte ?
+            if (!empty($this->aValues['groups'])) {
+                $aGroups = explode('|', $this->aValues['groups']);
+                foreach ($aGroups as $iGroupId) {
+                    $sSql = $aSql['insertMapGroups'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'map_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                        'group_id' => array('value' => $iGroupId, 'type' => 'number')
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            }
+        } else {
+            $sMessage = $aReturn['sMessage'];
+        }
+        return $sMessage;
+    }
+
+    /**
+     * @SWG\Delete(path="/maps/",
+     *   tags={"Maps"},
+     *   summary="delete Map",
+     *   description="Request to delete Map",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="map token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the maps",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/maps/{map_id}",
+     *   tags={"Maps"},
+     *   summary="delete Map",
+     *   description="Request to delete Map",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="map token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="map_id",
+     *     in="path",
+     *     description="id of the map",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/maps")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete map
+     * @return id of map deleted or error object if a map is not deleted
+     */
+    function DELETE() {
+        if (!empty($this->aValues['idList'])) {
+            $aIdList = explode("|", $this->aValues['idList']);
+        }
+        if (!empty($this->aPath['2'])) {
+            $aIdList = array($this->aPath['2']);
+        }
+
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'map', 'map_id');
+
+        // Supprime les fichiers uploadés
+        $this->deleteElementsDocuments('vmap_admin_map_vmap_admin_map', $aIdList);
+
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Commune.class.inc b/web_service/ws/Module.class.inc
similarity index 55%
rename from web_service/ws/Commune.class.inc
rename to web_service/ws/Module.class.inc
index 010fca07d354d34fd38e6a7e498e557f5b14cd6d..7c7360aae4ae1bc658f66f122112e54f7f5c6033 100755
--- a/web_service/ws/Commune.class.inc
+++ b/web_service/ws/Module.class.inc
@@ -1,20 +1,20 @@
 <?php
 
-require_once 'Cadastre.class.inc';
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 
 /**
- * \file Commune.class.inc
- * \class Commune
+ * \file Module.class.inc
+ * \class Module
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Commune php class
+ * \brief This file contains the Module php class
  *
- * This class defines operation for one Commune
+ * This class defines operation for one Module
  * 
  */
-class Commune extends Cadastre {
+class Module extends Vmap {
 
     public $oError;
 
@@ -25,18 +25,17 @@ class Commune extends Cadastre {
      * @param type $properties properties
      * @param type $bShortcut false to reinit variables
      * @param type $oConnection connection object
-     * @param type $oConnection connection object
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "code_com", "nom", "geom");
+        $this->aSelectedFields = Array("module_id", "label", "description", "rolname", "rolname_list");
     }
 
     /**
-     * @SWG\Get(path="/communes/{id_com}", 
-     *   tags={"Commune"},
-     *   summary="Get Commune",
-     *   description="Request to get Commune by id",
+     * @SWG\Get(path="/modules/{module_id}", 
+     *   tags={"Modules"},
+     *   summary="Get Module",
+     *   description="Request to get Module by id",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -47,27 +46,26 @@ class Commune extends Cadastre {
      *     type="string"
      *   ),
      *   @SWG\Parameter(
-     *     name="id_com",
+     *     name="module_id",
      *     in="path",
-     *     description="commune id",
+     *     description="module id",
      *     required=true,
-     *     type="integer",
-     *   format="int32"
+     *     type="string"
      *   ),
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/communes")
+     *         @SWG\Schema(ref="#/definitions/modules")
      *     )
      *  )
      */
 
     /**
-     * get informations about Commune
+     * get informations about Module
      */
     function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['commune'], 'id_com');
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'module', 'module_id');
     }
 
 }
diff --git a/web_service/ws/Modules.class.inc b/web_service/ws/Modules.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..f6f332c802d835d446022061ed9c348b80508193
--- /dev/null
+++ b/web_service/ws/Modules.class.inc
@@ -0,0 +1,177 @@
+<?php
+/**
+* \file Modules.class.inc
+* \class Modules
+*
+* \author Armand Bahi <armand.bahi@veremes.com>.
+*
+* \brief This file contains the Modules php class
+*
+* This class defines Rest Api to Vmap Modules
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once 'Module.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class Modules extends Vmap {
+    
+     /**
+     * @SWG\Definition(
+     *   definition="/modules",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/modules")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Modules",
+     *   description=""
+     * )
+     */
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+		$this->aSelectedFields = Array("module_id", "label", "description", "rolname", "rolname_list");
+    }
+    /**
+     * @SWG\Get(path="/modules",
+     *   tags={"Modules"},
+     *   summary="Get Modules",
+     *   description="Request to get Modules",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/modules")
+     *     )
+     *  )
+     */
+    /**
+     * get Modules
+     * @return  Modules
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'module', 'module_id');
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/modules/{module_id}",
+     *   tags={"Modules"},
+     *   summary="Update Module",
+     *   description="Request to update module",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   consumes= { "multipart/form-data"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="module_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="label",
+     *     in="query",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/modules")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify module
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'module', 'module_id');
+        return $aReturn['sMessage'];
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/Orientation.class.inc b/web_service/ws/Orientation.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..291c85a83955710d1aa3ae387cf9923a0482d26b
--- /dev/null
+++ b/web_service/ws/Orientation.class.inc
@@ -0,0 +1,41 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+* \file Orientation.class.inc
+* \class Orientation
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Orientation php class
+*
+* This class defines operation for one Orientation
+* 
+*/
+class Orientation extends Vmap {
+    
+    public $oError;
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array('rt_orientation_id');
+    }
+    
+    /**
+     * get informations about orientation
+     */
+    function GET(){
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], "rt_orientation", "rt_orientation_id");
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/Proprietaires.class.inc b/web_service/ws/Orientations.class.inc
similarity index 61%
rename from web_service/ws/Proprietaires.class.inc
rename to web_service/ws/Orientations.class.inc
index 3fa0b7c9767cd56ac35197baa5092dbb9eb78fec..84f44a88134ad73137ec6fa77f70323a770fa7f7 100755
--- a/web_service/ws/Proprietaires.class.inc
+++ b/web_service/ws/Orientations.class.inc
@@ -1,35 +1,34 @@
 <?php
-
 /**
- * \file Proprietaires.class.inc
- * \class Proprietaires
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Proprietaires php class
- *
- * This class defines Rest Api to Vmap Proprietaires
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'Proprietaire.class.inc';
+* \file Orientations.class.inc
+* \class Orientations
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Orientations php class
+*
+* This class defines Rest Api to Vmap order statutes
+* 
+*/
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'Orientation.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
 
-class Proprietaires extends Cadastre {
-    /**
+class Orientations extends Vmap {
+    
+     /**
      * @SWG\Definition(
-     *   definition="/proprietaires",
+     *   definition="/orientations",
      *   allOf={
-     *     @SWG\Schema(ref="#/definitions/proprietaires")
+     *     @SWG\Schema(ref="#/definitions/orientations")
      *   }
      * )
      * * @SWG\Tag(
-     *   name="proprietaires",
-     *   description="Operations about proprietaires"
+     *   name="Orientations",
+     *   description="Operations about Orientations"
      * )
      */
-
     /**
      * construct
      * @param type $aPath url of the request
@@ -40,16 +39,16 @@ class Proprietaires extends Cadastre {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array('oid', 'ID_COM', 'DDENOM', 'DNUPRO', 'COMMUNE');
+        $this->aSelectedFields = Array('rt_orientation_id');
     }
-
+    
     /**
-     * @SWG\Get(path="/proprietaires",
-     *   tags={"Proprietaire"},
-     *   summary="Get Proprietaires",
-     *   description="Request to get Proprietaires",
+     * @SWG\Get(path="/orientations",
+     *   tags={"Orientations"},
+     *   summary="Get Orientations",
+     *   description="Request to get Orientations",
      *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   produces={"application/xml", "application/json"},
      *   @SWG\Parameter(
      *     name="token",
      *     in="query",
@@ -76,17 +75,14 @@ class Proprietaires extends Cadastre {
      *     in="query",
      *     description="number of element",
      *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
+     *     type="integer"
      *   ),
      * @SWG\Parameter(
      *     name="offset",
      *     in="query",
      *     description="index of first element",
      *     required=false,
-     *     type="string",
-     *     format="int32"
+     *     type="string"
      *   ),
      * @SWG\Parameter(
      *     name="attributs",
@@ -112,20 +108,18 @@ class Proprietaires extends Cadastre {
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/proprietaires")
+     *         @SWG\Schema(ref="#/definitions/orientations")
      *     )
      *  )
      */
-
+    
     /**
-     * get Proprietaires
-     * @return  Proprietaires
+     * get Orientations
+     * @return  Orientations
      */
     function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['proprietaire'], 'oid');
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], "rt_orientation", "rt_orientation_id");
         return $aReturn['sMessage'];
     }
-
 }
-
 ?>
\ No newline at end of file
diff --git a/web_service/ws/OutputFormat.class.inc b/web_service/ws/OutputFormat.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..9e9348db79481cfe98f774bbe494a9babedb9960
--- /dev/null
+++ b/web_service/ws/OutputFormat.class.inc
@@ -0,0 +1,41 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+* \file OutputFormat.class.inc
+* \class OutputFormat
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the OutputFormat php class
+*
+* This class defines operation for one OutputFormat
+* 
+*/
+class OutputFormat extends Vmap {
+    
+    public $oError;
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array('outputformats_id');
+    }
+    
+    /**
+     * get inoutputformations about outputformat
+     */
+    function GET(){
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], "rt_outputformats", "outputformats_id");
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/OutputFormats.class.inc b/web_service/ws/OutputFormats.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..67274ee19523117665112e20558a208b43c3210b
--- /dev/null
+++ b/web_service/ws/OutputFormats.class.inc
@@ -0,0 +1,125 @@
+<?php
+/**
+* \file OutputFormats.class.inc
+* \class OutputFormats
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the OutputFormats php class
+*
+* This class defines Rest Api to Vmap order statutes
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once 'OutputFormat.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+
+class OutputFormats extends Vmap {
+    
+     /**
+     * @SWG\Definition(
+     *   definition="/outputformats",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/outputformats")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="OutputFormats",
+     *   description="Operations about OutputFormats"
+     * )
+     */
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array('outputformats_id');
+    }
+    
+    /**
+     * @SWG\Get(path="/outputformats",
+     *   tags={"OutputFormats"},
+     *   summary="Get OutputFormats",
+     *   description="Request to get OutputFormats",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/outputformats")
+     *     )
+     *  )
+     */
+    
+    /**
+     * get OutputFormats
+     * @return  OutputFormats
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], "rt_outputformats", "outputformats_id");
+        return $aReturn['sMessage'];
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/Parcelles.class.inc b/web_service/ws/Parcelles.class.inc
deleted file mode 100755
index 89d185d8c50275ec1ae3219b6345c269c56662e6..0000000000000000000000000000000000000000
--- a/web_service/ws/Parcelles.class.inc
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-/**
- * \file Parcelles.class.inc
- * \class Parcelles
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Parcelles php class
- *
- * This class defines Rest Api to Vmap Parcelles
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'Parcelle.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-class Parcelles extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/parcelles",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/parcelles")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="parcelles",
-     *   description="Operations about parcelles"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "id_sec", "code_com", "commune", "parcelle", "section", "pre", "coar", "codm", "indp", "idu", "id_par", "sup_fiscale", "numero", "feuille", "geom");
-    }
-
-    /**
-     * @SWG\Get(path="/parcelles",
-     *   tags={"Parcelle"},
-     *   summary="Get Parcelles",
-     *   description="Request to get Parcelles",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="order_by",
-     *     in="query",
-     *     description="list of ordering fields",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sort_order",
-     *     in="query",
-     *     description="sort order",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="limit",
-     *     in="query",
-     *     description="number of element",
-     *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="offset",
-     *     in="query",
-     *     description="index of first element",
-     *     required=false,
-     *     type="string",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="attributs",
-     *     in="query",
-     *     description="list of attributs",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="filter",
-     *     in="query",
-     *     description="filter results",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="distinct",
-     *     in="query",
-     *     description="delete duplicates",
-     *     required=false,
-     *     type="boolean"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/parcelles")
-     *     )
-     *  )
-     */
-
-    /**
-     * get Parcelles
-     * @return  Parcelles
-     */
-    function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['parcelle'], 'id_par');
-        return $aReturn['sMessage'];
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/PrintMapServices.class.inc b/web_service/ws/PrintMapServices.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..8c656d82a79f0611936a05c7a3bb8220adcab8db
--- /dev/null
+++ b/web_service/ws/PrintMapServices.class.inc
@@ -0,0 +1,338 @@
+<?php
+
+require_once 'Map.class.inc';
+require_once 'PrintServices.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+/**
+ * \file printmapservices.class.inc
+ * \class PrintMapServices
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ *  \brief This file contains the PrintMapServices php class
+ *
+ * This class defines the rest api for printmapservices
+ *
+ */
+class PrintMapServices extends PrintServices {
+    /**
+     * @SWG\Definition(
+     *   definition="/printmapservices",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printmapservices")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="printmapservices",
+     *   description="Operations about printmapservices"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+//        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * @SWG\Post(path="/printmapservices",
+     *   tags={"PrintServices"},
+     *   summary="Creates a map print",
+     *   description="Creates a map print",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     * @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="map_id",
+     *     in="formData",
+     *     description="map to print out, not required if passed map_json",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="map_json",
+     *     in="formData",
+     *     description="map to print out",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="image_size",
+     *     in="formData",
+     *     description="image resolution splited by |",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="resolution_coeff",
+     *     in="formData",
+     *     description="image size multiplicator",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="extent",
+     *     in="formData",
+     *     description="map extent, not required if passed features splited by |",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="features",
+     *     in="formData",
+     *     description="Array of EWKT features to add splited by |",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="features_zoom",
+     *     in="formData",
+     *     description="percentage of zooming",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="resolution_coeff",
+     *     in="formData",
+     *     description="size multiplicator",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="quality",
+     *     in="formData",
+     *     description="image quality",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="PrintMapServices Response",
+     *         @SWG\Schema(ref="#/definitions/printmapservices")
+     *     )
+     *  )
+     */
+    function POST() {
+
+        $aReturn = Array();
+
+        // Vérification des valeurs
+        if (empty($this->aValues['map_id']) && empty($this->aValues['map_json'])) {
+            $aReturn['error']['errorMessage'] .= " neither map_id nor map_json defined";
+            return json_encode($aReturn);
+        }
+        if (empty($this->aValues['extent']) && empty($this->aValues['features'])) {
+            $aReturn['error']['errorMessage'] .= " neither extent not features defined";
+            return json_encode($aReturn);
+        }
+        if (empty($this->aValues['image_size'])) {
+            $aReturn['error']['errorMessage'] .= " image_size not defined";
+            return json_encode($aReturn);
+        }
+
+        /**
+         * Files to delete after print
+         */
+        $this->aFilesToDelete = array();
+
+        /**
+         * The image name
+         */
+        $sTimestamp = date("YmdHis", time());
+
+        /**
+         * Map id
+         */
+        $sMapId = $this->aValues['map_id'];
+
+        /**
+         * Map id
+         */
+        $sMapJSON = $this->aValues['map_json'];
+
+        /**
+         * API URL
+         */
+        $RestUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'];
+
+        /**
+         * Token to use
+         */
+        $sToken = $this->aValues['token'];
+
+        /**
+         * Map extent
+         */
+        $sExtent = $this->aValues['extent'];
+
+        /**
+         * Image size
+         */
+        $sImageSize = $this->aValues['image_size'];
+
+        /**
+         * Map features
+         */
+        $sFeatures = $this->aValues['features'];
+
+        /**
+         * Map features zoom
+         */
+        $sFeaturesZoom = $this->aValues['features_zoom'];
+
+        /**
+         * Map features zoom
+         */
+        $sResolutionCoeff = $this->aValues['resolution_coeff'];
+
+        /**
+         * Image quality
+         */
+        $sQuality = $this->aProperties['print']['quality'];
+
+        /**
+         * Path to the PhantomJS .exe
+         */
+        $sPhantomjsPath = $this->aProperties['phantomjs_root_path'];
+
+        /**
+         * Path to the .js
+         */
+        $sProjectPath = $this->aProperties['vas_home'] . '/util/printserver/server/printmap.js';
+
+        /**
+         * Path to the client
+         */
+        $sPrintClientrUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['printserver_alias'] . '/client/map/index.html';
+
+        /**
+         * Path to the output file
+         */
+        $sOutputFile = $this->aProperties['vas_home'] . '/public/vmap/prints/print_map_' . $sTimestamp . '.jpeg';
+
+        /**
+         * The image URL
+         */
+        $sImageUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/print_map_' . $sTimestamp . '.jpeg';
+
+        // Vérifie que la carte existe bien
+        if (!empty($sMapId)) {
+            if (!$this->checkMapId($sMapId)) {
+                $oError = new VitisError(0, 'map_id (' . $sMapId . ') not founded');
+                return json_encode($oError->aFields);
+            }
+        }
+
+        // Écrit les paramètres gros dans des fichiers
+        if (is_dir($this->aProperties['vas_home'])) {
+            if (!is_dir($this->aProperties['vas_home'] . '/public')) {
+                mkdir($this->aProperties['vas_home'] . '/public', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap/prints')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap/prints', 0777, true);
+            }
+        }
+        $sMapJSONPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'map_json_' . $sTimestamp, $sMapJSON);
+        $sFeaturesPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'features_' . $sTimestamp, $sFeatures);
+
+        // Arguments de la ligne de commande
+        $aArguments = array($sProjectPath, $sPrintClientrUrl, $RestUrl, $sToken, $sOutputFile, $sMapId, $sMapJSONPath, $sImageSize, $sExtent, $sFeaturesPath, $sFeaturesZoom, $this->aValues['resolution_coeff'], $sQuality);
+
+        // Commande à lancer
+        $sCommand = '"' . $sPhantomjsPath . '" --ignore-ssl-errors=yes --ssl-protocol=any';
+
+        // Ajoute les argumants à a commande
+        for ($i = 0; $i < count($aArguments); $i++) {
+            $sCommand .= ' "' . $aArguments[$i] . '"';
+        }
+
+        // Ferme la session php (pour que phantomJS puisse faire des requetes Ajax avec ce token)
+        session_write_close();
+
+        $aCommand = array();
+        exec($sCommand, $aCommand);
+
+        $sScale = $this->getMapScale($aCommand);
+
+        $aReturn['printmapservices']['image'] = $sImageUrl;
+        $aReturn['printmapservices']['imagePath'] = $sOutputFile;
+        $aReturn['printmapservices']['command'] = $sCommand;
+        $aReturn['printmapservices']['logs'] = $aCommand;
+        $aReturn['printmapservices']['scale'] = $sScale !== null ? $sScale : null;
+        $aReturn['printmapservices']['result'] = $aCommand[count($aCommand) - 1];
+        $aReturn['status'] = $aReturn['printmapservices']['result'] === "Done" ? 1 : 0;
+
+        // Supprime les fichiers générés pendant l'impression
+        $this->deleteFiles($this->aFilesToDelete);
+
+        return json_encode($aReturn);
+    }
+
+    /**
+     * Get the map scale
+     * @param array $aCommand
+     * @return string
+     */
+    function getMapScale($aCommand) {
+
+        $sScale = null;
+
+        for ($i = 0; $i < count($aCommand); $i++) {
+            if (strlen($aCommand[$i]) > 5) {
+                if (substr($aCommand[$i], 0, 5) === 'scale') {
+                    $sScale = substr($aCommand[$i], 6);
+                }
+            }
+        }
+
+        return $sScale;
+    }
+
+    function checkMapId($sMapId) {
+
+        $aPath = array('vmap', 'maps', $sMapId);
+
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => 'application/json',
+            'sEncoding' => 'UTF-8',
+            'sSourceEncoding' => 'UTF-8',
+            'xslstylesheet' => '',
+            'my_vitis_id' => $sMapId,
+            'module' => 'vmap'
+        );
+
+        $oMap = new Map($aPath, $aValues, $this->aProperties);
+        $oMap->GET();
+
+        if (!empty($oMap->aFields['map_id'])) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/PrintParameter.class.inc b/web_service/ws/PrintParameter.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..d0f764cbf9bbc828d118b71ef7db0fa351d7594d
--- /dev/null
+++ b/web_service/ws/PrintParameter.class.inc
@@ -0,0 +1,83 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file PrintParameter.class.inc
+ * \class PrintParameter
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintParameter php class
+ *
+ * This class defines operation for one PrintParameter
+ * 
+ */
+class PrintParameter extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printparameter_id", "printtemplate_id", "name", "editable", "label", "placeholder", "defaultvalue", "print_template");
+    }
+
+    /**
+     * @SWG\Get(path="/printparameters/{printparameter_id}", 
+     *   tags={"PrintParameters"},
+     *   summary="Get PrintParameter",
+     *   description="Request to get PrintParameter by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="printparameter_id",
+     *     in="path",
+     *     description="printparameter id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about PrintParameter
+     */
+    function GET() {
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_print_parameter', 'printparameter_id');
+    }
+    
+    /**
+     * delete a printparameter
+     */
+    function DELETE(){
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printparameter', 'printparameter_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields['printparameter_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintParameters.class.inc b/web_service/ws/PrintParameters.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..e258080301770091e9644424202b82f7bf798e9a
--- /dev/null
+++ b/web_service/ws/PrintParameters.class.inc
@@ -0,0 +1,351 @@
+<?php
+
+/**
+ * \file PrintParameters.class.inc
+ * \class PrintParameters
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintParameters php class
+ *
+ * This class defines Rest Api to Vmap PrintParameters
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'PrintParameter.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class PrintParameters extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/printparameters",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printparameters")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="PrintParameters",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printparameter_id", "printtemplate_id", "name", "editable", "label", "placeholder", "defaultvalue", "print_template");
+    }
+
+    /**
+     * @SWG\Get(path="/printparameters",
+     *   tags={"PrintParameters"},
+     *   summary="Get PrintParameters",
+     *   description="Request to get PrintParameters",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     )
+     *  )
+     */
+
+    /**
+     * get PrintParameters
+     * @return  PrintParameters
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_print_parameter', 'printparameter_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/printparameters",
+     *   tags={"PrintParameters"},
+     *   summary="Add printparameter",
+     *   description="Request to add a printparameter",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="formData",
+     *     description="Print template id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="Name",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="editable",
+     *     in="formData",
+     *     description="editable",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="label",
+     *     in="formData",
+     *     description="Label",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="placeholder",
+     *     in="formData",
+     *     description="Placeholder",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="defaultvalue",
+     *     in="formData",
+     *     description="Default Value",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert printparameter
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'printparameter', $this->aProperties['schema_vmap'].'.seq_common', 'printparameter_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/printparameters/{printparameter_id}",
+     *   tags={"PrintParameters"},
+     *   summary="Update PrintParameter",
+     *   description="Request to update printparameter",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="printparameter_id",
+     *     in="path",
+     *     description="Print parameter id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="query",
+     *     description="Print template id",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="Name",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="editable",
+     *     in="query",
+     *     description="editable",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="label",
+     *     in="query",
+     *     description="Label",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="placeholder",
+     *     in="query",
+     *     description="Placeholder",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="defaultvalue",
+     *     in="query",
+     *     description="Default Value",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify printparameter
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'printparameter', 'printparameter_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/printparameters/",
+     *   tags={"PrintParameters"},
+     *   summary="delete PrintParameter",
+     *   description="Request to delete PrintParameter",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printparameter token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the printparameters",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/printparameters/{printparameter_id}",
+     *   tags={"PrintParameters"},
+     *   summary="delete PrintParameter",
+     *   description="Request to delete PrintParameter",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printparameter token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printparameter_id",
+     *     in="path",
+     *     description="id of the printparameter",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printparameters")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete printparameter
+     * @return id of printparameter deleted or error object if a printparameter is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'printparameter', 'printparameter_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintReport.class.inc b/web_service/ws/PrintReport.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..cf548e2ec4492562fd7d18e216da413ec8eb67c4
--- /dev/null
+++ b/web_service/ws/PrintReport.class.inc
@@ -0,0 +1,83 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file PrintReport.class.inc
+ * \class PrintReport
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintReport php class
+ *
+ * This class defines operation for one PrintReport
+ * 
+ */
+class PrintReport extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printreport_id", "name", "rt_format_id", "rt_orientation_id", "outputformats_id", "business_object_id", "multiobject", "htmldefinition", "jsonobjects", "business_object_title", "business_object_id_field", "business_object_database", "business_object_schema", "business_object_table", "business_object_geom_column");
+    }
+
+    /**
+     * @SWG\Get(path="/printreports/{printreport_id}", 
+     *   tags={"PrintReports"},
+     *   summary="Get PrintReport",
+     *   description="Request to get PrintReport by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="printreport_id",
+     *     in="path",
+     *     description="printreport id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about PrintReport
+     */
+    function GET() {        
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_printreport', 'printreport_id');        
+    }
+    
+    /**
+     * delete a printreport
+     */
+    function DELETE(){
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printreport', 'printreport_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields[printreport_id] = $this->aValues['id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintReportServices.class.inc b/web_service/ws/PrintReportServices.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..161868568fa05b5c1c6954312f59967fc44eb3d9
--- /dev/null
+++ b/web_service/ws/PrintReportServices.class.inc
@@ -0,0 +1,934 @@
+<?php
+
+require_once 'PrintServices.class.inc';
+require_once 'PrintReports.class.inc';
+require_once 'Querys.class.inc';
+require_once 'PrintMapServices.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc';
+
+/**
+ * \file printreportservices.class.inc
+ * \class PrintReportServices
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ *  \brief This file contains the PrintReportServices php class
+ *
+ * This class defines the rest api for printreportservices
+ *
+ */
+class PrintReportServices extends PrintServices {
+    /**
+     * @SWG\Definition(
+     *   definition="/printreportservices",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printreportservices")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="printreportservices",
+     *   description="Operations about printreportservices"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Post(path="/printreportservices",
+     *   tags={"PrintServices"},
+     *   summary="Creates a map print",
+     *   description="Creates a map print",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     * @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="printreport_id",
+     *     in="formData",
+     *     description="report to print out",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="ids",
+     *     in="formData",
+     *     description="id(s) of the business object element(s) to use in the scope",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="scope_json",
+     *     in="formData",
+     *     description="scope to incorpore",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="includes_json",
+     *     in="formData",
+     *     description="files to include",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="quality",
+     *     in="formData",
+     *     description="image quality",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="PrintReportServices Response",
+     *         @SWG\Schema(ref="#/definitions/printreportservices")
+     *     )
+     *  )
+     */
+    function POST() {
+
+        $this->aReturn = Array();
+
+        // Vérification des valeurs
+        if (empty($this->aValues['printreport_id'])) {
+            $this->aReturn['error']['errorMessage'] .= " printreport_id not defined";
+            return json_encode($this->aReturn);
+        }
+
+        /**
+         * Files to delete after print
+         */
+        $this->aFilesToDelete = array();
+
+        /**
+         * Logs to show
+         */
+        $this->aLogs = array();
+
+        /**
+         * Report id
+         */
+        $this->sReportId = $this->aValues['printreport_id'];
+
+        /**
+         * ids
+         */
+        $this->aIds = explode('|', $this->aValues['ids']);
+
+        /**
+         * JSON
+         */
+        $this->sJsonScope = $this->aValues['scope_json'];
+
+        /**
+         * API URL
+         */
+        $this->sRestUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'];
+
+        /**
+         * Declare where to include images and html definitions
+         */
+        $this->sJsonIncludes = $this->aValues['includes_json'];
+
+        /**
+         * Token to use
+         */
+        $this->sToken = $this->aValues['token'];
+
+        /**
+         * Image quality
+         */
+        $this->sQuality = $this->aProperties['print']['quality'];
+
+        /**
+         * Path to the PhantomJS .exe
+         */
+        $this->sPhantomjsPath = $this->aProperties['phantomjs_root_path'];
+
+        /**
+         * Path to the .js
+         */
+        $this->sProjectPath = $this->aProperties['vas_home'] . '/util/printserver/server/printreport.js';
+
+        /**
+         * Path to the client
+         */
+        $this->sPrintClientrUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['printserver_alias'] . '/client/report/index.html';
+
+        /**
+         * The image name
+         */
+        $this->sFileName = 'rapport_' . date("YmdHis", time()) . '_' . rand();
+
+        // Effectue la requête permettant de récupérer les infos sur le printreport
+        $aPrintReport = $this->getPrintReport($this->sReportId);
+
+        $this->sOrientation = $aPrintReport['rt_orientation_id'];
+
+        $this->sFormat = $aPrintReport['rt_format_id'];
+
+        $this->sOutputFormat = $aPrintReport['outputformats_id'];
+
+        $this->bMultiObject = $aPrintReport['multiobject'];
+
+        $this->sBusinessObjectId = $aPrintReport['business_object_id'];
+
+        $this->sIdField = $aPrintReport['business_object_id_field'];
+
+        $this->sGeomColumn = $aPrintReport['business_object_geom_column'];
+
+        $this->sJsonObjects = $aPrintReport['jsonobjects'];
+
+        $this->sHtmlDef = $aPrintReport['htmldefinition'];
+
+        // En cas de simple objet, mais plusieurs id
+        if (!$this->bMultiObject && count($this->aIds) > 1) {
+            // Génère un rapport pour chaque identifiant
+            return $this->generateManyReports();
+        }
+
+        if ($this->sOutputFormat === 'pdf') {
+
+            $this->sFileDirectory = $this->aProperties['vas_home'] . '/public/vmap/prints';
+
+            $this->sOutputFile = $this->sFileDirectory . '/' . $this->sFileName . '.pdf';
+
+            $this->sFileUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/' . $this->sFileName . '.pdf';
+
+            $this->sFilePath = $this->sOutputFile;
+        } else if ($this->sOutputFormat === 'doc') {
+
+            // Si format doc, alors création d'un dossier qui sera zippé
+            mkdir($this->aProperties['vas_home'] . '/public/vmap/prints/' . $this->sFileName);
+
+            $this->sFileDirectory = $this->aProperties['vas_home'] . '/public/vmap/prints/' . $this->sFileName;
+
+            $this->sOutputFile = $this->sFileDirectory . '/' . $this->sFileName . '.doc';
+
+            $this->sFileUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/' . $this->sFileName . '/' . $this->sFileName . '.doc';
+
+            $this->sFilePath = $this->sOutputFile;
+        }
+
+        // Effectue la requête permettant de récupérer les infos des objets séléctionnés
+        $this->aQuerys = $this->getQuerys($this->aIds);
+
+        // Ajoute le résultat de getQuerys au scope
+        $this->addToScope('BO', $this->aQuerys);
+
+        // Rrécupère les features contenues dans querys
+        $this->sFeatures = $this->getEWKTFeatures($this->aQuerys);
+
+        // Ajoute les images des cartes de sJsonObjects à $this->sJsonIncludes
+        $this->sJsonIncludes = $this->addJsonIncludes($this->sJsonIncludes, $this->sJsonObjects);
+
+        // Écrit les paramètres gros dans des fichiers
+        if (is_dir($this->aProperties['vas_home'])) {
+            if (!is_dir($this->aProperties['vas_home'] . '/public')) {
+                mkdir($this->aProperties['vas_home'] . '/public', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap/prints')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap/prints', 0777, true);
+            }
+        }
+        $sIncludesPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'includes_' . $this->sFileName, $this->sJsonIncludes);
+        $sScopePath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'scope_' . $this->sFileName, $this->sJsonScope);
+
+        // Arguments de la ligne de commande
+        $aArguments = array($this->sProjectPath, $this->sPrintClientrUrl, $this->sRestUrl, $this->sToken, $this->sOutputFile, $this->sReportId, $this->sFormat, $this->sOrientation, $this->sOutputFormat, $sIncludesPath, $sScopePath, $this->sQuality);
+
+        // Commande à lancer
+        $sCommand = '"' . $this->sPhantomjsPath . '" --ignore-ssl-errors=true --ssl-protocol=any --web-security=false --local-to-remote-url-access=true';
+
+        // Ajoute les arguments à a commande
+        for ($i = 0; $i < count($aArguments); $i++) {
+            $sCommand .= ' "' . $aArguments[$i] . '"';
+        }
+
+        session_write_close();
+
+        $aCommand = array();
+        exec($sCommand, $aCommand);
+
+        for ($i = 0; $i < count($aCommand); $i++) {
+            array_push($this->aLogs, $aCommand[$i]);
+        }
+
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        if ($this->sOutputFormat === 'doc') {
+            // Crée l'arboresance de retour au format zip si plusieurs fichiers
+            $this->zipFileDirectory();
+        }
+
+        // Supprime les fichiers générés pendant l'impression
+        $this->deleteFiles($this->aFilesToDelete);
+
+        $this->aReturn['printreportservices']['fileurl'] = $this->sFileUrl;
+        $this->aReturn['printreportservices']['filepath'] = $this->sFilePath;
+        $this->aReturn['printreportservices']['command'] = $sCommand;
+        $this->aReturn['printreportservices']['logs'] = $this->aLogs;
+        $this->aReturn['printreportservices']['result'] = $aCommand[count($aCommand) - 1];
+        $this->aReturn['status'] = $this->aReturn['printreportservices']['result'] === "Done" ? 1 : 0;
+
+        return json_encode($this->aReturn);
+    }
+
+    /**
+     * Get the print report def
+     * @param string $printRportId
+     * @return array
+     */
+    function getPrintReport($printRportId) {
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+
+        $aPath[2] = $printRportId;
+        $aValues['my_vitis_id'] = $printRportId;
+
+        $oPrintReport = new PrintReport($aPath, $aValues, $properties, $oConnection);
+        $oPrintReport->GET();
+
+        return $oPrintReport->aFields;
+    }
+
+    /**
+     * Query the objects and return the result
+     * @param array $aIds
+     * @return array
+     */
+    function getQuerys($aIds) {
+
+        $aQuerys = array();
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+
+        $aFilter = array(
+            'relation' => 'OR',
+            'operators' => array()
+        );
+        for ($i = 0; $i < count($aIds); $i++) {
+            array_push($aFilter['operators'], array('column' => $this->sIdField, 'compare_operator' => '=', 'value' => $aIds[$i]));
+        }
+        $sFilter = json_encode($aFilter);
+//        for ($i = 0; $i < count($aIds); $i++) {
+//            if ($i > 0) {
+//                $sFilter .= ' OR ';
+//            }
+//            $sFilter .= '("' . $this->sIdField . '"= \'' . $aIds[$i] . '\')';
+//        }
+
+        $aPath[2] = $this->sBusinessObjectId;
+
+        $aValues['get_geom'] = 'true';
+        $aValues['filter'] = $sFilter;
+        $aValues['my_vitis_id'] = $this->sBusinessObjectId;
+
+        $oQuerys = new Querys($aPath, $aValues, $properties);
+        $oQuerys->GET();
+
+        for ($i = 0; $i < count($oQuerys->aObjects); $i++) {
+            array_push($aQuerys, $oQuerys->aObjects[$i]->aFields);
+        }
+        return $aQuerys;
+    }
+
+    /**
+     * Add $aQuerys to $this->sJsonScope
+     * @param string $sType
+     * @param array $aQuerys
+     */
+    function addToScope($sType, $aQuerys) {
+
+        $aJsonScope = json_decode($this->sJsonScope, true);
+
+        if ($sType === 'BO') {
+            if ($this->bMultiObject) {
+                $aJsonScope['BO'] = $aQuerys;
+            } else {
+                $aJsonScope['BO'] = $aQuerys[0];
+            }
+        }
+
+        $this->sJsonScope = json_encode($aJsonScope);
+    }
+
+    /**
+     * Get the features separed by "|" from $aQuerys
+     * @param array $aQuerys
+     * @return string
+     */
+    function getEWKTFeatures($aQuerys) {
+        $sFeatures = '';
+        for ($i = 0; $i < count($aQuerys); $i++) {
+            if (!empty($aQuerys[$i][$this->sGeomColumn])) {
+                if ($sFeatures != '') {
+                    $sFeatures .= '|';
+                }
+                $sFeatures .= $aQuerys[$i][$this->sGeomColumn];
+            }
+        }
+        return $sFeatures;
+    }
+
+    /**
+     * Add to the $sJsonIncludes the elements defined in $sJsonObjects
+     * @param string $sJsonIncludes
+     * @param string $sJsonObjects
+     * @return string
+     */
+    function addJsonIncludes($sJsonIncludes, $sJsonObjects) {
+
+        $aJsonObjects = json_decode($sJsonObjects, true);
+        $aIncludes = json_decode($sJsonIncludes, true);
+        $aJsonScope = json_decode($this->sJsonScope, true);
+
+        if (!empty($sJsonObjects) && !is_array($aJsonObjects)) {
+            $this->aReturn['error']['errorMessage'] = "JsonObjects has not a valid JSON definition";
+        }
+
+        if (empty($aIncludes)) {
+            $aIncludes = array();
+        }
+
+        // Valeurs par défaut
+        $date = getdate();
+        $aJsonScope['date'] = $date['mday'] . '/' . $date['mon'] . '/' . $date['year'];
+
+        for ($i = 0; $i < count($aJsonObjects); $i++) {
+            // Type Carte
+            if ($aJsonObjects[$i]['type'] === 'map') {
+
+                $aMapDefinition = array();
+                $aMapDefinition['token'] = $this->sToken;
+
+                if (isset($aJsonObjects[$i]['target'])) {
+                    $sTarget = $aJsonObjects[$i]['target'];
+                } else {
+                    $this->aReturn['error']['errorMessage'] .= "JsonObjects: target not defined";
+                }
+
+                $sImageSize = $this->getTargetSize($sTarget);
+
+                if (isset($aJsonObjects[$i]['map_id'])) {
+                    $aMapDefinition['map_id'] = $aJsonObjects[$i]['map_id'];
+                } else {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects: map_id not defined";
+                }
+
+                if (!empty($sImageSize) && $sImageSize != null) {
+                    $aMapDefinition['image_size'] = $sImageSize;
+                } else {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects: can't get the image size map_id: " . $aJsonObjects[$i]['map_id'];
+                }
+
+                if (!empty($this->sFeatures)) {
+                    $aMapDefinition['features'] = $this->sFeatures;
+                }
+
+                if (isset($aJsonObjects[$i]['resolution_coeff'])) {
+                    $aMapDefinition['resolution_coeff'] = $aJsonObjects[$i]['resolution_coeff'];
+                }
+                if (isset($aJsonObjects[$i]['scale_target'])) {
+                    $aMapDefinition['scale_target'] = $aJsonObjects[$i]['scale_target'];
+                }
+                if (isset($aJsonObjects[$i]['features_zoom'])) {
+                    $aMapDefinition['features_zoom'] = $aJsonObjects[$i]['features_zoom'];
+                }
+
+                $aMapPrintResult = $this->printMapImage($aMapDefinition);
+
+                $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+                if (!empty($aMapPrintResult['printmapservices'])) {
+                    // Échelle
+                    if (!empty($aMapDefinition['scale_target']) && !empty($aMapPrintResult['printmapservices']['scale'])) {
+                        $aJsonScope[$aMapDefinition['scale_target']] = $aMapPrintResult['printmapservices']['scale'];
+                    }
+                    // Image
+                    if ($this->sOutputFormat === 'pdf') {
+                        if (!empty($aMapPrintResult['printmapservices']['imagePath'])) {
+                            array_push($this->aFilesToDelete, $aMapPrintResult['printmapservices']['imagePath']);
+                        }
+                        if ($aMapPrintResult['status'] == 1 && !empty($aMapPrintResult['printmapservices']['image'])) {
+                            $sImageUrl = $aMapPrintResult['printmapservices']['image'];
+                        }
+                    }
+                    if ($this->sOutputFormat === 'doc') {
+                        if ($aMapPrintResult['status'] == 1 && !empty($aMapPrintResult['printmapservices']['imagePath'])) {
+                            $sFileName = basename($aMapPrintResult['printmapservices']['imagePath']);
+                            // Copie l'image dans le dossier
+                            copy($aMapPrintResult['printmapservices']['imagePath'], $this->sFileDirectory . '/' . $sFileName);
+                            // Ajoute l'image de base à la liste des fichiers à supprimer
+                            array_push($this->aFilesToDelete, $aMapPrintResult['printmapservices']['imagePath']);
+                            $sImageUrl = $sFileName;
+                        }
+                    }
+                }
+
+                if (isset($sImageUrl)) {
+                    array_push($aIncludes, array(
+                        'target' => $sTarget,
+                        'imageUrl' => $sImageUrl
+                    ));
+                }
+            }
+            // Type Webservice
+            if ($aJsonObjects[$i]['type'] === 'webservice') {
+
+                if (!isset($aJsonObjects[$i]['ressource'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type webservice: ressource not defined";
+                    continue;
+                }
+                if (!isset($aJsonObjects[$i]['target'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type webservice: target not defined";
+                    continue;
+                }
+
+                // Regarde si il y a un id dans la ressource et stoque son identifiant dans $sIdIndex
+                $aTmp = explode('/', $aJsonObjects[$i]['ressource']);
+                for ($ii = count($aTmp); $ii >= 0; $ii--) {
+                    if (is_numeric(strpos($aTmp[$ii], '{'))) {
+                        if (is_numeric(strpos($aTmp[$ii], '}', strpos($aTmp[$ii], '{')))) {
+                            $sIdIndex = $ii;
+                        }
+                    }
+                }
+
+                // Regarde si il y a des valeurs entre {...} à changer
+                $aJsonObjects[$i]['ressource'] = $this->replaceStringValueByScope($aJsonObjects[$i]['ressource']);
+
+                // aPath
+                $aPath = explode('/', $aJsonObjects[$i]['ressource']);
+
+                // Identifiant
+                $sId = '';
+                if (isset($sIdIndex)) {
+                    $sId = $aPath[$sIdIndex];
+                }
+
+                // $aParams
+                if (isset($aJsonObjects[$i]['params'])) {
+                    if (is_array($aJsonObjects[$i]['params'])) {
+                        $aParams = $aJsonObjects[$i]['params'];
+                        // Vérifie si il y a des valeurs entre {...} à changer
+                        $aParams = $this->replaceArrayValueByScope($aParams);
+                    }
+                }
+
+                $aQueryResult = $this->queryRessource($aPath, $aParams, $sId);
+                $aJsonScope[$aJsonObjects[$i]['target']] = $aQueryResult;
+            }
+            // Type Objet
+            if ($aJsonObjects[$i]['type'] === 'object') {
+
+                if (!isset($aJsonObjects[$i]['target'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type object: target not defined";
+                    continue;
+                }
+                if (!isset($aJsonObjects[$i]['content'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type object: content not defined";
+                    continue;
+                }
+                if (!is_array($aJsonObjects[$i]['content'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type object: content not an object";
+                    continue;
+                }
+
+                $aJsonScope[$aJsonObjects[$i]['target']] = $aJsonObjects[$i]['content'];
+            }
+            // Type Image
+            if ($aJsonObjects[$i]['type'] === 'image') {
+
+                if (!isset($aJsonObjects[$i]['imageUrl'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type image: imageUrl not defined";
+                    continue;
+                }
+                if (!isset($aJsonObjects[$i]['target'])) {
+                    $this->aReturn['error']['errorMessage'] = "JsonObjects type image: target not defined";
+                    continue;
+                }
+
+                $sFileName = $aJsonObjects[$i]['imageUrl'];
+
+                // Sauvvegarde l'image au format png pour faire le lien en cas de .doc
+                if ($this->sOutputFormat === 'doc') {
+                    $sFileName = 'image_' . $i . '.png';
+                    $sOutputFile = $this->sFileDirectory . '/' . $sFileName;
+                    $this->saveImage($aJsonObjects[$i]['imageUrl'], $sOutputFile);
+                }
+
+                array_push($aIncludes, array(
+                    'target' => $aJsonObjects[$i]['target'],
+                    'imageUrl' => $sFileName
+                ));
+            }
+        }
+
+        $this->sJsonScope = json_encode($aJsonScope, true);
+        return json_encode($aIncludes);
+    }
+
+    /**
+     * Replace the {...} values by the scope value
+     * @param string $sString
+     * @return string
+     */
+    function replaceStringValueByScope($sString) {
+        $aJsonScope = json_decode($this->sJsonScope, true);
+
+        $sReplaceChain = '';
+        if (is_numeric(strpos($sString, '{{'))) {
+            if (is_numeric(strpos($sString, '}}', strpos($sString, '{{')))) {
+                $sReplaceChain = substr($sString, strpos($sString, '{{') + 2, strpos($sString, '}}') - strpos($sString, '{{') - 2);
+            } else {
+                return $sString;
+            }
+        } else {
+            return $sString;
+        }
+
+        // Mots clés
+        if ($sReplaceChain === 'id') {
+            $sReplaceValue = $this->aIds[0];
+        } else if ($sReplaceChain === 'ids') {
+            $sReplaceValue = implode('|', $this->aIds);
+        } else if ($sReplaceChain === "'ids'") {
+            $sReplaceValue = "";
+            for ($i = 0; $i < count($this->aIds); $i++) {
+                if ($i > 0) {
+                    $sReplaceValue .= ",";
+                }
+                $sReplaceValue .= "'" . $this->aIds[$i] . "'";
+            }
+        }
+
+        // Récupère la valeur de l'identifiant dans $aJsonObjects
+        if ($sReplaceChain !== '') {
+            $aReplaceChain = explode('.', $sReplaceChain);
+
+            if (isset($aJsonScope[$aReplaceChain[0]])) {
+                if (!empty($aJsonScope[$aReplaceChain[0]][$aReplaceChain[1]])) {
+                    $sReplaceValue = $aJsonScope[$aReplaceChain[0]][$aReplaceChain[1]];
+                }
+            }
+        }
+
+        $sString = str_replace('{{' . $sReplaceChain . '}}', $sReplaceValue, $sString);
+
+        // Récursive si il en reste encore
+        if (strpos($sString, '{{') > 0) {
+            if (strpos($sString, '}}', strpos($sString, '{{')) > 1) {
+                return $this->replaceStringValueByScope($sString);
+            }
+        }
+
+        return $sString;
+    }
+
+    /**
+     * Replace the {...} values by the scope value
+     * @param array $aArray
+     * @return array
+     */
+    function replaceArrayValueByScope($aArray) {
+        foreach ($aArray as $key => $value) {
+            if (is_string($value)) {
+                $aArray[$key] = $this->replaceStringValueByScope($value);
+            }
+            if (is_array($value)) {
+                // Récursive si il s'agit d'un tableau imbriqué
+                $aArray[$key] = $this->replaceArrayValueByScope($value);
+            }
+        }
+        return $aArray;
+    }
+
+    /**
+     * Get a template target size using PhantomJS
+     * @param string $sTarget
+     * @return string
+     */
+    function getTargetSize($sTarget) {
+
+        session_write_close();
+
+        $sTargetSize = null;
+
+        // Chemin du fichier PhantonJS
+        $sProjectPath = $this->aProperties['vas_home'] . '/util/printserver/server/targetsize.js';
+
+        // Arguments de la ligne de commande
+        $aArguments = array($sProjectPath, $this->sPrintClientrUrl, $this->sRestUrl, $this->sToken, $this->sReportId, $this->sFormat, $this->sOrientation, $sTarget);
+
+        // Commande à lancer
+        $sCommand = '"' . $this->sPhantomjsPath . '" --ignore-ssl-errors=true --ssl-protocol=any --web-security=false --local-to-remote-url-access=true';
+
+        // Ajoute les argumants à a commande
+        for ($i = 0; $i < count($aArguments); $i++) {
+            $sCommand .= ' "' . $aArguments[$i] . '"';
+        }
+
+        $aCommand = array();
+        exec($sCommand, $aCommand);
+
+        if (substr($aCommand[count($aCommand) - 1], 0, 4) == 'Done') {
+            $sTargetSize = substr($aCommand[count($aCommand) - 1], 6);
+        }
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        return $sTargetSize;
+    }
+
+    /**
+     * Save the image set on the given sImageUrl on the given sOutputFile
+     * @param string $sImageUrl
+     * @param string $sOutputFile
+     */
+    function saveImage($sImageUrl, $sOutputFile) {
+
+        // Chemin du fichier PhantonJS
+        $sProjectPath = $this->aProperties['vas_home'] . '/util/printserver/server/saveimage.js';
+
+        // Arguments de la ligne de commande
+        $aArguments = array($sProjectPath, $sImageUrl, $sOutputFile);
+
+        // Commande à lancer
+        $sCommand = '"' . $this->sPhantomjsPath . '" --ignore-ssl-errors=true --ssl-protocol=any --web-security=false --local-to-remote-url-access=true';
+
+        // Ajoute les argumants à a commande
+        for ($i = 0; $i < count($aArguments); $i++) {
+            $sCommand .= ' "' . $aArguments[$i] . '"';
+        }
+
+        $aCommand = array();
+        exec($sCommand, $aCommand);
+    }
+
+    /**
+     * Print a map and return the definition
+     * @param array $aMapDefinition
+     * @return string image url
+     */
+    function printMapImage($aMapDefinition) {
+
+        session_write_close();
+
+        $oMapPrint = new PrintMapServices($this->aPath, $aMapDefinition, $this->aProperties);
+        $sMapPrintResult = $oMapPrint->POST();
+        array_push($this->aLogs, $sMapPrintResult);
+        $aMapPrintResult = json_decode($sMapPrintResult, true);
+
+        return $aMapPrintResult;
+    }
+
+    /**
+     * Query a webservice ressource
+     * @param array $aPath
+     * @param array $aParams
+     * @param string $sId
+     */
+    function queryRessource($aPath, $aParams = array(), $sId = "") {
+
+        $sWebService = $aPath[0];
+        $sRessource = $aPath[1];
+
+        // Vérifie que le webservice existe
+        if (!is_dir(dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/' . $sWebService)) {
+            $this->aReturn['error']['errorMessage'] = ' Webservice ' . $sWebService . ' does not exists';
+            return null;
+        }
+
+        // Trouve le nom du fichier correspondant à la ressource
+        $aFiles = scandir(dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/' . $sWebService);
+
+        for ($i = 0; $i < count($aFiles); $i++) {
+            if (strtolower($aFiles[$i]) === $sRessource . '.class.inc') {
+                $sClassName = substr($aFiles[$i], 0, strpos($aFiles[$i], '.class.inc'));
+            }
+        }
+
+        if (!isset($sClassName)) {
+            $this->aReturn['error']['errorMessage'] = ' Ressource ' . $sRessource . ' does not exists in the webservice ' . $sWebService . '';
+            return null;
+        }
+
+        // Vérifie que la ressource existe
+        if (!is_file(dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/' . $sWebService . '/' . $sClassName . '.class.inc')) {
+            $this->aReturn['error']['errorMessage'] = ' unable to find file ' . $sWebService . '/' . $sClassName . '.class.inc';
+            return null;
+        }
+
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/' . $sWebService . '/' . $sClassName . '.class.inc';
+
+        $aValues = $this->aValues;
+        unset($aValues['printreport_id']);
+        unset($aValues['ids']);
+        unset($aValues['module']);
+        if (!empty($sId)) {
+            $aValues['my_vitis_id'] = $sId;
+        }
+        if (count($aParams) > 0) {
+            foreach ($aParams as $key => $value) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oRessource = new $sClassName($aPath, $aValues, $this->aProperties, $this->oConnection);
+        $oRessource->GET();
+
+        $aQuery = array();
+
+        // Objet simple
+        if (isset($oRessource->aFields)) {
+            $aQuery = $oRessource->aFields;
+        }
+        // Objet multiple
+        if (isset($oRessource->aObjects)) {
+            for ($i = 0; $i < count($oRessource->aObjects); $i++) {
+                array_push($aQuery, $oRessource->aObjects[$i]->aFields);
+            }
+        }
+
+        return $aQuery;
+    }
+
+    /**
+     * Create zip by $this->sFileDirectory
+     * If only one file is found inside $this->sFileDirectory, the directory will be deleted and the file copied on the parent's
+     * The one or more files are already zipped, the function will unzip them: we don't want a zip inside an other zip
+     * and the file copied on the vmap/prints folder
+     */
+    function zipFileDirectory() {
+        $aScanedFiles = scandir($this->sFileDirectory);
+        $aFiles = array();
+
+        for ($i = 0; $i < count($aScanedFiles); $i++) {
+            if ($aScanedFiles[$i] != '.' && $aScanedFiles[$i] != '..') {
+                array_push($aFiles, $aScanedFiles[$i]);
+            }
+        }
+
+        // Si il y a plus d'un fichier, crée un zip qui sera donné en sortie
+        if (count($aFiles) > 1) {
+
+            // Dézippe les fihiers zippés (on ne ve pas un zip dans un zip)
+            for ($i = 0; $i < count($aFiles); $i++) {
+                $ext = pathinfo($aFiles[$i], PATHINFO_EXTENSION);
+                $dir = pathinfo($aFiles[$i], PATHINFO_BASENAME);
+                $sFile = pathinfo($aFiles[$i], PATHINFO_FILENAME);
+
+                if ($ext == 'zip') {
+
+                    unZip($this->sFileDirectory . '/' . $sFile . '.zip', $this->sFileDirectory . '/' . $sFile);
+
+                    // Supprime le fichier zippé
+                    unlink($this->sFileDirectory . '/' . $sFile . '.zip');
+                }
+            }
+
+            $test = createZip($this->sFileDirectory, $this->sFileDirectory . '.zip');
+            $this->sFileUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/' . $this->sFileName . '.zip';
+            $this->sFilePath = $this->sFileDirectory . '.zip';
+
+            // Ajoute aux fichiers à supprimer le dossier crée
+            array_push($this->aFilesToDelete, $this->sFileDirectory);
+        } else {
+
+            // Copie le fichier dans le fichier au dessus (car pas besoin de zip)
+            copy($this->sFileDirectory . '/' . $this->sFileName . '.' . $this->sOutputFormat, $this->sFileDirectory . '.' . $this->sOutputFormat);
+
+            $this->sFileUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/' . $this->sFileName . '.' . $this->sOutputFormat;
+            $this->sFilePath = $this->sFileDirectory . '.' . $this->sOutputFormat;
+
+            // Ajoute aux fichiers à supprimer le dossier crée
+            array_push($this->aFilesToDelete, $this->sFileDirectory);
+        }
+    }
+
+    /**
+     * Function that calls this->POST for each id in aValues['ids']
+     * @return string
+     */
+    function generateManyReports() {
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+
+        $this->aReturn['printreportservices'] = array();
+        $this->aReturn['printreportservices']['printreports'] = array();
+        $this->aReturn['printreportservices']['result'] = 'Done';
+
+        // Crée un dossier dans lequel placer les fichiers
+        mkdir($this->aProperties['vas_home'] . '/public/vmap/prints/' . $this->sFileName);
+        $this->sFileDirectory = $this->aProperties['vas_home'] . '/public/vmap/prints/' . $this->sFileName;
+
+        // Génère les fichiers
+        for ($i = 0; $i < count($this->aIds); $i++) {
+
+            $aValues['ids'] = $this->aIds[$i];
+
+            $oPrintReport = new PrintReportServices($aPath, $aValues, $this->aProperties);
+            $oPrintReportResult = json_decode($oPrintReport->POST(), true);
+
+            if (isset($oPrintReportResult['printreportservices'])) {
+                if (isset($oPrintReportResult['printreportservices']['filepath'])) {
+
+                    // Ajoute le résultat dans printreportservices.printreports
+                    array_push($this->aReturn['printreportservices']['printreports'], $oPrintReportResult['printreportservices']);
+
+                    // Copie l'image dans le dossier et l'ajoute à la liste des fichiers à supprimer
+                    $sGeneratedFile = $oPrintReportResult['printreportservices']['filepath'];
+
+                    $sGeneratedFileExt = pathinfo($sGeneratedFile, PATHINFO_EXTENSION);
+
+                    copy($sGeneratedFile, $this->sFileDirectory . '/' . $this->aIds[$i] . '.' . $sGeneratedFileExt);
+                    array_push($this->aFilesToDelete, $sGeneratedFile);
+
+                    // Dit si tout c'est bien passé
+                    if ($oPrintReportResult['printreportservices']['result'] !== "Done") {
+                        $this->aReturn['printreportservices']['result'] .= " Error with id:" . $this->aIds[$i];
+                    }
+                }
+            }
+        }
+        // Crée l'arboresance de retour au format zip si plusieurs fichiers
+        $this->zipFileDirectory();
+
+        // Supprime les fichiers générés pendant l'impression
+        $this->deleteFiles($this->aFilesToDelete);
+        // Valeurs retour
+        $this->aReturn['printreportservices']['fileurl'] = $this->sFileUrl;
+        $this->aReturn['status'] = $this->aReturn['printreportservices']['result'] === "Done" ? 1 : 0;
+
+        return json_encode($this->aReturn);
+    }
+
+}
+
+?>
diff --git a/web_service/ws/PrintReports.class.inc b/web_service/ws/PrintReports.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..4cb6d7b43ccc69ce699650ab0346721b79c75a1e
--- /dev/null
+++ b/web_service/ws/PrintReports.class.inc
@@ -0,0 +1,373 @@
+<?php
+
+/**
+ * \file PrintReports.class.inc
+ * \class PrintReports
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintReports php class
+ *
+ * This class defines Rest Api to Vmap PrintReports
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'PrintReport.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class PrintReports extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/printreports",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printreports")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="PrintReports",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printreport_id", "name", "rt_format_id", "rt_orientation_id", "outputformats_id", "business_object_id", "multiobject", "htmldefinition", "jsonobjects", "business_object_title", "business_object_id_field", "business_object_database", "business_object_schema", "business_object_table", "business_object_geom_column");
+    }
+
+    /**
+     * @SWG\Get(path="/printreports",
+     *   tags={"PrintReports"},
+     *   summary="Get PrintReports",
+     *   description="Request to get PrintReports",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     )
+     *  )
+     */
+    
+    /**
+     * get PrintReports
+     * @return  PrintReports
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_printreport', 'printreport_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/printreports",
+     *   tags={"PrintReports"},
+     *   summary="Add printreport",
+     *   description="Request to add a printreport",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_format_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_orientation_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="outputformats_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="htmldefinition",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="jsonobjects",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="multiobject",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert printreport
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'printreport', $this->aProperties['schema_vmap'].'.seq_common', 'printreport_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/printreports/{printreport_id}",
+     *   tags={"PrintReports"},
+     *   summary="Update PrintReport",
+     *   description="Request to update printreport",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printreport_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_format_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_orientation_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="outputformats_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="htmldefinition",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="jsonobjects",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify printreport
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'printreport', 'printreport_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/printreports/",
+     *   tags={"PrintReports"},
+     *   summary="delete PrintReport",
+     *   description="Request to delete PrintReport",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printreport token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the printreports",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/printreports/{printreport_id}",
+     *   tags={"PrintReports"},
+     *   summary="delete PrintReport",
+     *   description="Request to delete PrintReport",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printreport token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printreport_id",
+     *     in="path",
+     *     description="id of the printreport",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printreports")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete printreport
+     * @return id of printreport deleted or error object if a printreport is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'printreport', 'printreport_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintServices.class.inc b/web_service/ws/PrintServices.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..8fb94aab9b34ea63010beb77dd1b08b155bba9e7
--- /dev/null
+++ b/web_service/ws/PrintServices.class.inc
@@ -0,0 +1,66 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+/**
+ * \file printservices.class.inc
+ * \class PrintServices
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ *  \brief This file contains the PrintServices php class
+ * 
+ */
+class PrintServices extends Vmap {
+
+    /**
+     * Write a param into a file
+     * @param string $sPath
+     * @param string $sFileName
+     * @param string $sParam
+     * @return string
+     */
+    function writeToFile($sPath, $sFileName, $sParam) {
+        $sFile = $sPath . '/' . $sFileName . '.txt';
+        file_put_contents($sFile, $sParam);
+        array_push($this->aFilesToDelete, $sFile);
+        return $sFile;
+    }
+
+    function rrmdir($dir) {
+        if (is_dir($dir)) {
+            $objects = scandir($dir);
+            foreach ($objects as $object) {
+                if ($object != "." && $object != "..") {
+                    if (is_dir($dir . "/" . $object))
+                        $this->rrmdir($dir . "/" . $object);
+                    else
+                        unlink($dir . "/" . $object);
+                }
+            }
+            rmdir($dir);
+        }
+    }
+
+    /**
+     * Supprime les fichiers passés en argument
+     * @param array $aFilesToDelete
+     */
+    function deleteFiles($aFilesToDelete) {
+        for ($i = 0; $i < count($aFilesToDelete); $i++) {
+            if (is_dir($aFilesToDelete[$i])) {
+//                array_map('unlink', glob("$aFilesToDelete[$i]/*.*"));
+                $this->rrmdir($aFilesToDelete[$i]);
+            }
+            if (is_file($aFilesToDelete[$i])) {
+                unlink($aFilesToDelete[$i]);
+            }
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintStyle.class.inc b/web_service/ws/PrintStyle.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..48df6caccbc1c05489a6fa73c72ac932e402d35e
--- /dev/null
+++ b/web_service/ws/PrintStyle.class.inc
@@ -0,0 +1,114 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file PrintStyle.class.inc
+ * \class PrintStyle
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintStyle php class
+ *
+ * This class defines operation for one PrintStyle
+ * 
+ */
+class PrintStyle extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printstyle_id", "name", "definition", "users");
+    }
+
+    /**
+     * @SWG\Get(path="/printstyles/{printstyle_id}", 
+     *   tags={"PrintStyles"},
+     *   summary="Get PrintStyle",
+     *   description="Request to get PrintStyle by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="printstyle_id",
+     *     in="path",
+     *     description="printstyle id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about PrintStyle
+     */
+    function GET() {
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'printstyle', 'printstyle_id');
+        $this->getUsers();
+    }
+
+    /**
+     *  get users of user
+     */
+    function getUsers() {
+        require $this->sRessourcesFile;
+        if (in_array("users", $this->aSelectedFields)) {
+            $aParams['sSchemaFramework'] = array('value' => $this->aProperties['schema_framework'], 'type' => 'schema_name');
+            $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+            $aParams['printstyle_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getPrintStyleUsers'], $aParams);
+            $sListUserId = "";
+            $aListUserLogin = array();
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+                if ($sListUserId == "") {
+                    $sListUserId = $aLigne["user_id"];
+                } else {
+                    $sListUserId .= "|" . $aLigne["user_id"];
+                }
+                $aListUserLogin[] = $aLigne["login"];
+            }
+            $oPDOresult = $this->oConnection->oBd->fermeResultat();
+            $this->aFields['users'] = $sListUserId;
+            $this->aFields['users_label'] = implode(',', $aListUserLogin);
+        }
+    }
+
+    /**
+     * delete a printstyle
+     */
+    function DELETE() {
+        // Supprime les utilisateurs rattachés au style.
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'user_printstyle', 'printstyle_id', $this->aValues["my_vitis_id"]);
+        // Supprime le style
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printstyle', 'printstyle_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields[printstyle_id] = $this->aValues['my_vitis_id'];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintStyles.class.inc b/web_service/ws/PrintStyles.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..9087aa77db60ec5a2bd814db0a86825bc3decda6
--- /dev/null
+++ b/web_service/ws/PrintStyles.class.inc
@@ -0,0 +1,355 @@
+<?php
+
+/**
+ * \file PrintStyles.class.inc
+ * \class PrintStyles
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintStyles php class
+ *
+ * This class defines Rest Api to Vmap PrintStyles
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'PrintStyle.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class PrintStyles extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/printstyles",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printstyles")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="PrintStyles",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printstyle_id", "name", "definition", "users");
+    }
+
+    /**
+     * @SWG\Get(path="/printstyles",
+     *   tags={"PrintStyles"},
+     *   summary="Get PrintStyles",
+     *   description="Request to get PrintStyles",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     )
+     *  )
+     */
+
+    /**
+     * get PrintStyles
+     * @return  PrintStyles
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'printstyle', 'printstyle_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/printstyles",
+     *   tags={"PrintStyles"},
+     *   summary="Add printstyle",
+     *   description="Request to add a printstyle",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="definition",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert printstyle
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'printstyle', $this->aProperties['schema_vmap'].'.seq_common', 'printstyle_id');
+        // Si création OK -> maj des utilisateurs rattachés à au style.
+        if ($aReturn['sStatus'] == 1){
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $oPrintStyle = new PrintStyle($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+            $oPrintStyle->GET();
+            // Utilisateurs à rattacher au style ?
+            if (!empty($this->aValues['users'])) {
+                require $this->sRessourcesFile;
+                $aUsers = explode('|', $this->aValues['users']);
+                foreach ($aUsers as $iUserId) {                    
+                    $sSql = $aSql['insertPrintStyleUsers'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'printstyle_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                        'user_id' => array('value' => $iUserId, 'type' => 'number')
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            }
+        }
+        else{
+            $sMessage = $aReturn['sMessage'];
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/printstyles/{printstyle_id}",
+     *   tags={"PrintStyles"},
+     *   summary="Update PrintStyle",
+     *   description="Request to update printstyle",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="printstyle_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="definition",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify printstyle
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'printstyle', 'printstyle_id');
+        // Si création OK -> maj des utilisateurs rattachés à au style.
+        if ($aReturn['sStatus'] == 1){
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            // Supprime les utilisateurs rattachés au style.
+            $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'user_printstyle', 'printstyle_id', $this->aValues["my_vitis_id"]);
+            // Utilisateurs à rattacher au style ?
+            if (!empty($this->aValues['users'])) {
+                require $this->sRessourcesFile;
+                $aUsers = explode('|', $this->aValues['users']);
+                foreach ($aUsers as $iUserId) {                    
+                    $sSql = $aSql['insertPrintStyleUsers'];
+                    $aSQLParams = array(
+                        'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                        'printstyle_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                        'user_id' => array('value' => $iUserId, 'type' => 'number')
+                    );
+                    $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                    if ($this->oConnection->oBd->enErreur()) {
+                        $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                        $aXmlRacineAttribute['status'] = 0;
+                        $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                    }
+                }
+            }
+        }
+        else{
+            $sMessage = $aReturn['sMessage'];
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/printstyles/",
+     *   tags={"PrintStyles"},
+     *   summary="delete PrintStyle",
+     *   description="Request to delete PrintStyle",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printstyle token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the printstyles",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/printstyles/{printstyle_id}",
+     *   tags={"PrintStyles"},
+     *   summary="delete PrintStyle",
+     *   description="Request to delete PrintStyle",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printstyle token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printstyle_id",
+     *     in="path",
+     *     description="id of the printstyle",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printstyles")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete printstyle
+     * @return id of printstyle deleted or error object if a printstyle is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'printstyle', 'printstyle_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintTemplate.class.inc b/web_service/ws/PrintTemplate.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..2d9b13d1a10f91fd84ba8d2bf6fa6dafab64f30e
--- /dev/null
+++ b/web_service/ws/PrintTemplate.class.inc
@@ -0,0 +1,110 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file PrintTemplate.class.inc
+ * \class PrintTemplate
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintTemplate php class
+ *
+ * This class defines operation for one PrintTemplate
+ * 
+ */
+class PrintTemplate extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printtemplate_id", "name", "rt_format_id", "rt_orientation_id", "definition", "outputformats_id", "groups");        
+    }
+
+    /**
+     * @SWG\Get(path="/printtemplates/{printtemplate_id}", 
+     *   tags={"PrintTemplates"},
+     *   summary="Get PrintTemplate",
+     *   description="Request to get PrintTemplate by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="path",
+     *     description="printtemplate id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about PrintTemplate
+     */
+    function GET() {        
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_template', 'printtemplate_id');        
+        $this->getGroups();
+    }
+    
+    /**
+     *  get groups of print template
+     */
+    function getGroups() {
+        require $this->sRessourcesFile;
+        if (in_array("groups", $this->aSelectedFields)){
+            $aParams['sSchemaFramework'] = array('value' => $this->aProperties['schema_framework'], 'type' => 'schema_name');
+            $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+            $aParams['printtemplate_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getPrintTemplateGroups'], $aParams);
+            $sListGroupId = "";
+            $aListGroupName = array();
+            while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+                    if ($sListGroupId == ""){
+                            $sListGroupId = $aLigne["group_id"];
+                    }else{
+                            $sListGroupId .= "|".$aLigne["group_id"];
+                    }
+                    $aListGroupName[] = $aLigne["name"];
+            }
+            $oPDOresult=$this->oConnection->oBd->fermeResultat();
+            $this->aFields['groups'] = $sListGroupId;
+            $this->aFields['groups_label'] = implode(',', $aListGroupName);
+        }
+    }
+    
+    /**
+     * delete a printtemplate
+     */
+    function DELETE(){
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printtemplate', 'printtemplate_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+                $this->aFields['printtemplate_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintTemplateServices.class.inc b/web_service/ws/PrintTemplateServices.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..079ea0a492b8e9484c20f8e6b22285411629d6e5
--- /dev/null
+++ b/web_service/ws/PrintTemplateServices.class.inc
@@ -0,0 +1,405 @@
+<?php
+
+require_once 'PrintTemplate.class.inc';
+require_once 'UserPrintTemplate.class.inc';
+require_once 'PrintServices.class.inc';
+require_once 'PrintMapServices.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+/**
+ * \file printtemplateservices.class.inc
+ * \class PrintTemplateServices
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ *  \brief This file contains the PrintTemplateServices php class
+ *
+ * This class defines the rest api for printtemplateservices
+ * 
+ */
+class PrintTemplateServices extends PrintServices {
+    /**
+     * @SWG\Definition(
+     *   definition="/printtemplateservices",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printtemplateservices")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="printtemplateservices",
+     *   description="Operations about printtemplateservices"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Post(path="/printtemplateservices",
+     *   tags={"PrintServices"},
+     *   summary="Creates a map print",
+     *   description="Creates a map print",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     * @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="formData",
+     *     description="template to print out",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="printstyle_id",
+     *     in="formData",
+     *     description="template to print out",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="maps_json",
+     *     in="formData",
+     *     description="target + map_definition",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="includes_json",
+     *     in="formData",
+     *     description="target + imageUrl|base64Image|html",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="scope_json",
+     *     in="formData",
+     *     description="scope to incorpore",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="quality",
+     *     in="formData",
+     *     description="image quality",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="PrintTemplateServices Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplateservices")
+     *     )
+     *  )
+     */
+    function POST() {
+
+        $aReturn = Array();
+
+        // Vérification des valeurs
+        if (empty($this->aValues['printtemplate_id'])) {
+            $aReturn['error']['errorMessage'] .= " printtemplate_id not defined";
+            return json_encode($aReturn);
+        }
+
+        /**
+         * Files to delete after print
+         */
+        $this->aFilesToDelete = array();
+
+        /**
+         * Logs to show
+         */
+        $this->aLogs = array();
+
+        /**
+         * Template id
+         */
+        $sTemplateId = $this->aValues['printtemplate_id'];
+
+        $aPrintTemplate = $this->getPrintTemplate($sTemplateId);
+
+        /**
+         * Template id
+         */
+        $sPrintStyleId = $this->aValues['printstyle_id'];
+
+        /**
+         * 'A3', 'A4', 'A5', 'Legal', 'Letter', 'Tabloid'
+         */
+        $sFormat = $aPrintTemplate['rt_format_id'];
+
+        /**
+         * portrait/paysage
+         */
+        $sOrientation = $aPrintTemplate['rt_orientation_id'];
+
+        /**
+         * Declare where to include images and html definitions
+         */
+        $sJsonIncludes = $this->aValues['includes_json'];
+
+        /**
+         * Declare where to include maps
+         */
+        $sJsonMaps = $this->aValues['maps_json'];
+
+        /**
+         * JSON
+         */
+        $this->sJsonScope = $this->aValues['scope_json'];
+
+        /**
+         * API URL
+         */
+        $RestUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'];
+
+        /**
+         * Token to use
+         */
+        $sToken = $this->aValues['token'];
+
+        /**
+         * Image quality
+         */
+        $sQuality = $this->aProperties['print']['quality'];
+
+        /**
+         * Path to the PhantomJS .exe
+         */
+        $sPhantomjsPath = $this->aProperties['phantomjs_root_path'];
+
+        /**
+         * Path to the .js
+         */
+        $sProjectPath = $this->aProperties['vas_home'] . '/util/printserver/server/printtemplate.js';
+
+        /**
+         * Path to the client
+         */
+        $sPrintClientrUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['printserver_alias'] . '/client/template/index.html';
+
+        /**
+         * The image name
+         */
+        $sFileName = 'impression_' . date("YmdHis", time()) . '_' . rand();
+
+        /**
+         * Path to the output file
+         */
+        $sOutputFile = $this->aProperties['vas_home'] . '/public/vmap/prints/' . $sFileName . '.pdf';
+
+        /**
+         * The image URL
+         */
+        $sImageUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['public_alias'] . '/vmap/prints/' . $sFileName . '.pdf';
+
+        // Ajoute les images des cartes de $sJsonMaps à $sJsonIncludes
+        $sJsonIncludes = $this->addMapsToIncludes($sJsonIncludes, $sJsonMaps);
+
+        // EncodeUriComponent les définitions html
+        $sJsonIncludes = $this->encodeHtmlIncludes($sJsonIncludes);
+
+        // Écrit les paramètres gros dans des fichiers
+        if (is_dir($this->aProperties['vas_home'])) {
+            if (!is_dir($this->aProperties['vas_home'] . '/public')) {
+                mkdir($this->aProperties['vas_home'] . '/public', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap', 0777, true);
+            }
+            if (!is_dir($this->aProperties['vas_home'] . '/public/vmap/prints')) {
+                mkdir($this->aProperties['vas_home'] . '/public/vmap/prints', 0777, true);
+            }
+        }
+        $sIncludesPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'includes_' . $sFileName, $sJsonIncludes);
+        $sScopePath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'scope_' . $sFileName, $this->sJsonScope);
+
+        // Arguments de la ligne de commande
+        $aArguments = array($sProjectPath, $sPrintClientrUrl, $RestUrl, $sToken, $sOutputFile, $sTemplateId, $sPrintStyleId, $sFormat, $sOrientation, $sIncludesPath, $sScopePath, $sQuality);
+
+        // Commande à lancer
+        $sCommand = '"' . $sPhantomjsPath . '" --ignore-ssl-errors=true --ssl-protocol=any --web-security=false --local-to-remote-url-access=true';
+
+        // Ajoute les argumants à a commande
+        for ($i = 0; $i < count($aArguments); $i++) {
+            $sCommand .= ' "' . $aArguments[$i] . '"';
+        }
+
+        // Ferme la session php (pour que phantomJS puisse faire des requetes Ajax avec ce token)
+        session_write_close();
+
+        $aCommand = array();
+        exec($sCommand, $aCommand);
+
+        for ($i = 0; $i < count($aCommand); $i++) {
+            array_push($this->aLogs, $aCommand[$i]);
+        }
+
+        $aReturn['printtemplateservices']['image'] = $sImageUrl;
+        $aReturn['printtemplateservices']['command'] = $sCommand;
+        $aReturn['printtemplateservices']['logs'] = $this->aLogs;
+        $aReturn['printtemplateservices']['result'] = $aCommand[count($aCommand) - 1];
+        $aReturn['status'] = $aReturn['printtemplateservices']['result'] === "Done" ? 1 : 0;
+
+        // Supprime les fichiers générés pendant l'impression
+        $this->deleteFiles($this->aFilesToDelete);
+
+        return json_encode($aReturn);
+    }
+
+    function getPrintTemplate($sPrintTemplateId) {
+
+        $aValues = $this->aValues;
+        $aPath = $this->aPath;
+        $properties = $this->aProperties;
+        $oConnection = $this->oConnection;
+
+        $aPath[2] = $sPrintTemplateId;
+        $aValues['my_vitis_id'] = $sPrintTemplateId;
+
+        $aPrintTemplate = new UserPrintTemplate($aPath, $aValues, $properties, $oConnection);
+        $aPrintTemplate->GET();
+
+        return $aPrintTemplate->aFields;
+    }
+
+    /**
+     * Encode the includes that use html definitions
+     * @param string $sJsonIncludes
+     * @return string
+     */
+    function encodeHtmlIncludes($sJsonIncludes) {
+
+        $aIncludes = json_decode($sJsonIncludes, true);
+
+        for ($i = 0; $i < count($aIncludes); $i++) {
+            if (!empty($aIncludes[$i]['html'])) {
+                $aIncludes[$i]['html'] = rawurlencode($aIncludes[$i]['html']);
+            }
+        }
+
+        return json_encode($aIncludes);
+    }
+
+    /**
+     * Effectue les impressions des cartes définies dans $sJsonMaps
+     * et les ajoute à la défintion $sJsonIncludes
+     * @param string $sJsonIncludes
+     * @param string $sJsonMaps
+     * reutn string
+     */
+    function addMapsToIncludes($sJsonIncludes, $sJsonMaps) {
+
+        $aMapsDefinition = json_decode($sJsonMaps, true);
+        $aIncludes = json_decode($sJsonIncludes, true);
+
+        if (empty($aIncludes)) {
+            $aIncludes = array();
+        }
+
+        $aMapIncludes = $this->getMapIncludes($aMapsDefinition);
+
+        for ($i = 0; $i < count($aMapIncludes); $i++) {
+            array_push($aIncludes, $aMapIncludes[$i]);
+        }
+
+        return json_encode($aIncludes);
+    }
+
+    /**
+     * Effectue les impressions des cartes et retourne leur définition target/imageUrl
+     * @param array $aMapsDefinition
+     * @return array
+     */
+    function getMapIncludes($aMapsDefinition) {
+
+        $aMapsIncludes = array();
+
+        // Ajoute à $aMapsIncludes les définitions des cartes
+        for ($i = 0; $i < count($aMapsDefinition); $i++) {
+
+            if (empty($aMapsDefinition[$i]['target']))
+                continue;
+            if (empty($aMapsDefinition[$i]['map_definition']))
+                continue;
+
+            // Cas ou map_json soit un objet au lieu d'une chaine
+            if (!empty($aMapsDefinition[$i]['map_definition']['map_json'])) {
+                if (gettype($aMapsDefinition[$i]['map_definition']['map_json']) == 'array' || gettype($aMapsDefinition[$i]['map_definition']['map_json']) == 'object') {
+                    $aMapsDefinition[$i]['map_definition']['map_json'] = json_encode($aMapsDefinition[$i]['map_definition']['map_json']);
+                }
+            }
+
+            // Ajout du token
+            $aMapsDefinition[$i]['map_definition']['token'] = $this->aValues['token'];
+
+            $oTmpMapPrint = new PrintMapServices($this->aPath, $aMapsDefinition[$i]['map_definition'], $this->aProperties);
+            $sTmpMapPrintResult = $oTmpMapPrint->POST();
+
+            // Ajoute la définition si tout est ok
+            if (!empty($sTmpMapPrintResult)) {
+
+                $oTmpMapPrintResult = json_decode($sTmpMapPrintResult);
+                array_push($this->aLogs, $oTmpMapPrintResult);
+
+                if ($oTmpMapPrintResult->status == 1) {
+                    if (!empty($oTmpMapPrintResult->printmapservices->image)) {
+
+                        $oMapInclude = array(
+                            'target' => $aMapsDefinition[$i]['target'],
+                            'imageUrl' => $oTmpMapPrintResult->printmapservices->image
+                        );
+
+                        if ($oTmpMapPrintResult->printmapservices->scale !== null && $aMapsDefinition[$i]['target'] == '#map_image') {
+                            $this->setMapScale($oTmpMapPrintResult->printmapservices->scale);
+                        }
+
+                        array_push($aMapsIncludes, $oMapInclude);
+                        array_push($this->aFilesToDelete, $oTmpMapPrintResult->printmapservices->imagePath);
+                    }
+                } else {
+                    writeToErrorLog('Print map error: ' . $sTmpMapPrintResult);
+                }
+            }
+
+            unset($oMapInclude);
+            unset($oTmpMapPrint);
+            unset($sTmpMapPrintResult);
+        }
+
+        return $aMapsIncludes;
+    }
+
+    /**
+     * Set the map scale in the JsonScope if JsonScope.map_scale is NaN
+     * @param string $sScale
+     */
+    function setMapScale($sScale) {
+
+        $aJsonScope = json_decode($this->sJsonScope, true);
+
+        $aJsonScope['map_scale'] = $sScale;
+
+        $this->sJsonScope = json_encode($aJsonScope);
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/PrintTemplates.class.inc b/web_service/ws/PrintTemplates.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..01a2642f3697fa4984dd54fffb48ee769f3f1e02
--- /dev/null
+++ b/web_service/ws/PrintTemplates.class.inc
@@ -0,0 +1,380 @@
+<?php
+
+/**
+ * \file PrintTemplates.class.inc
+ * \class PrintTemplates
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the PrintTemplates php class
+ *
+ * This class defines Rest Api to Vmap PrintTemplates
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'PrintTemplate.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class PrintTemplates extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/printtemplates",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printtemplates")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="PrintTemplates",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printtemplate_id", "name", "rt_format_id", "rt_orientation_id", "definition", "outputformats_id");
+    }
+
+    /**
+     * @SWG\Get(path="/printtemplates",
+     *   tags={"PrintTemplates"},
+     *   summary="Get PrintTemplates",
+     *   description="Request to get PrintTemplates",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     )
+     *  )
+     */
+
+    /**
+     * get PrintTemplates
+     * @return  PrintTemplates
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_template', 'printtemplate_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/printtemplates",
+     *   tags={"PrintTemplates"},
+     *   summary="Add printtemplate",
+     *   description="Request to add a printtemplate",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_format_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_orientation_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="definition",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="outputformats_id",
+     *     in="formData",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert printtemplate
+     * @return array containing the status and the message
+     */
+    function POST() {
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'printtemplate', $this->aProperties['schema_vmap'] . '.seq_common', 'printtemplate_id');
+        // Groupes à rattacher à la carte ?
+        if (!empty($this->aValues['groups'])) {
+            require $this->sRessourcesFile;
+            $aGroups = explode('|', $this->aValues['groups']);
+            foreach ($aGroups as $iGroupId) {
+                $sSql = $aSql['insertPrintTemplateGroups'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'printtemplate_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'group_id' => array('value' => $iGroupId, 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/printtemplates/{printtemplate_id}",
+     *   tags={"PrintTemplates"},
+     *   summary="Update PrintTemplate",
+     *   description="Request to update printtemplate",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_format_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="rt_orientation_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="definition",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="outputformats_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify printtemplate
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'printtemplate', 'printtemplate_id');
+        // Supprime les groupes rattachés au modèle.
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printtemplate_group', 'printtemplate_id', $this->aValues["my_vitis_id"]);
+        // Groupes à rattacher à la carte ?
+        if (!empty($this->aValues['groups'])) {
+            require $this->sRessourcesFile;
+            $aGroups = explode('|', $this->aValues['groups']);
+            foreach ($aGroups as $iGroupId) {                
+                $sSql = $aSql['insertPrintTemplateGroups'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'printtemplate_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'group_id' => array('value' => $iGroupId, 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/printtemplates/",
+     *   tags={"PrintTemplates"},
+     *   summary="delete PrintTemplate",
+     *   description="Request to delete PrintTemplate",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printtemplate token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the printtemplates",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/printtemplates/{printtemplate_id}",
+     *   tags={"PrintTemplates"},
+     *   summary="delete PrintTemplate",
+     *   description="Request to delete PrintTemplate",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="printtemplate token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="path",
+     *     description="id of the printtemplate",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/printtemplates")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete printtemplate
+     * @return id of printtemplate deleted or error object if a printtemplate is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'printtemplate', 'printtemplate_id');
+        return $aReturn['sMessage'];
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Proprietaire.class.inc b/web_service/ws/Proprietaire.class.inc
deleted file mode 100755
index 41b65cb2cfac295ccda6b0cd6f706c83f253b856..0000000000000000000000000000000000000000
--- a/web_service/ws/Proprietaire.class.inc
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-
-/**
- * \file Proprietaire.class.inc
- * \class Proprietaire
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Proprietaire php class
- *
- * This class defines operation for one Proprietaire
- * 
- */
-class Proprietaire extends Cadastre {
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Query.class.inc b/web_service/ws/Query.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..093857f4864444494d97051f2f84cece89037a78
--- /dev/null
+++ b/web_service/ws/Query.class.inc
@@ -0,0 +1,43 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Query.class.inc
+ * \class Query
+ *
+ * \author Yoann Perollet <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the Query php class
+ *
+ * This class defines operation for one Query
+ * 
+ */
+class Query extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array();
+    }
+
+    /**
+     * get informations about query
+     */
+    function GET() {
+
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Querys.class.inc b/web_service/ws/Querys.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..a5e4b7deed246263e5d67a6856fb62af7d503fa9
--- /dev/null
+++ b/web_service/ws/Querys.class.inc
@@ -0,0 +1,1627 @@
+<?php
+
+/**
+ * \file Querys.class.inc
+ * \class Querys
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the Querys php class
+ *
+ * This class defines Rest Api to Vitis querys
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once 'Query.class.inc';
+require_once 'BusinessObject.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+require_once 'vmlib/logUtil.inc';
+
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/Vm.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BD.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+class Querys extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/Querys",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/Querys")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Querys",
+     *   description="Operations about querying business objects"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->aValues['getGroup'] = false;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * @SWG\Get(path="/querys/{business_object_id}/summary",
+     *   tags={"Querys"},
+     *   summary="Get business object summary querys",
+     *   description="Request to get summary querys of a business object",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *  @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_geom",
+     *     in="query",
+     *     description="geom to intersect",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_column",
+     *     in="query",
+     *     description="column to intersect | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_buffer",
+     *     in="query",
+     *     description="intersection buffer",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="get_geom",
+     *     in="query",
+     *     description="true if you want to get the geometry",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="get_image",
+     *     in="query",
+     *     description="true if you want to get the image",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_field",
+     *     in="query",
+     *     description="geom to return | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_srid",
+     *     in="query",
+     *     description="geom projetion in result | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/querys/{business_object_id}/list",
+     *   tags={"Querys"},
+     *   summary="Get business object list querys",
+     *   description="Request to get list querys of a business object",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *  @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_geom",
+     *     in="query",
+     *     description="geom to intersect",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_column",
+     *     in="query",
+     *     description="column to intersect | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_buffer",
+     *     in="query",
+     *     description="intersection buffer",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="get_geom",
+     *     in="query",
+     *     description="true if you want to get the geometry",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="get_image",
+     *     in="query",
+     *     description="true if you want to get the image",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_field",
+     *     in="query",
+     *     description="geom to return | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_srid",
+     *     in="query",
+     *     description="geom projetion in result | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     default="4"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/querys/{business_object_id}/form",
+     *   tags={"Querys"},
+     *   summary="Get business object form querys",
+     *   description="Request to get the form querys of a business object",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *  @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="attributs",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_geom",
+     *     in="query",
+     *     description="geom to intersect",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_column",
+     *     in="query",
+     *     description="column to intersect | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_buffer",
+     *     in="query",
+     *     description="intersection buffer",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="get_geom",
+     *     in="query",
+     *     description="true if you want to get the geometry",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="get_image",
+     *     in="query",
+     *     description="true if you want to get the image",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_field",
+     *     in="query",
+     *     description="geom to return | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_srid",
+     *     in="query",
+     *     description="geom projetion in result | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/querys/{business_object_id}/table",
+     *   tags={"Querys"},
+     *   summary="Get business object form querys",
+     *   description="Request to get the form querys of a business object",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *  @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="attributs",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter",
+     *     required=false,
+     *     type="string",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_geom",
+     *     in="query",
+     *     description="geom to intersect",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_column",
+     *     in="query",
+     *     description="column to intersect | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="intersect_buffer",
+     *     in="query",
+     *     description="intersection buffer",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="get_geom",
+     *     in="query",
+     *     description="true if you want to get the geometry",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="get_image",
+     *     in="query",
+     *     description="true if you want to get the image",
+     *     required=false,
+     *     type="boolean",
+     *   ),
+     * @SWG\Parameter(
+     *     name="geom_field",
+     *     in="query",
+     *     description="geom to return | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="result_srid",
+     *     in="query",
+     *     description="geom projetion in result | Undefined",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/querys/{business_object_id}/geometry",
+     *   tags={"Querys"},
+     *   summary="Get business object form querys",
+     *   description="Request to get the form querys of a business object",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *  @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="intersect_geom",
+     *     in="query",
+     *     description="EWKT intersect geometry",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="snapping_mode",
+     *     in="query",
+     *     description="Snapping mode (segment_edge_node, edge_node, node)",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="snapping_limit",
+     *     in="query",
+     *     description="Returned objets limit",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Querys
+     * @return  Querys
+     */
+    function GET($bOnlyReturnStatus = FALSE) {
+        if (isset($this->aPath[3]) && ($this->aPath[3] == 'geometry')) {
+            return $this->getBoGeomsFromIntersect($this->aPath[2]);
+        } else if (isset($this->aPath[3])) {
+            return $this->queryBusinessObject($this->aPath[3]);
+        } else {
+            return $this->queryBusinessObject('form', true);
+        }
+    }
+
+    /**
+     * Query the business object
+     * @param string $type
+     * @param boolean $bOnlyResult
+     * @return array
+     */
+    function queryBusinessObject($type, $bOnlyResult = false) {
+        require $this->sRessourcesFile;
+
+        if (!empty($this->oConnection->oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+
+        // Objet BusinessObject correspondant
+        $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        $date = new DateTime();
+
+        // Paramètres retenus dans l'url
+        $filter = !empty($this->aValues['filter']) ? $this->aValues['filter'] : '';
+        $intersect_geom = !empty($this->aValues['intersect_geom']) ? $this->aValues['intersect_geom'] : '';
+        $intersect_column = !empty($this->aValues['intersect_column']) ? $this->aValues['intersect_column'] : '';
+        $intersect_buffer = !empty($this->aValues['intersect_buffer']) ? $this->aValues['intersect_buffer'] : '';
+        $get_geom = !empty($this->aValues['get_geom']) ? $this->aValues['get_geom'] : '';
+        $get_image = !empty($this->aValues['get_image']) ? $this->aValues['get_image'] : '';
+        $result_srid = !empty($this->aValues['result_srid']) ? $this->aValues['result_srid'] : '';
+        $geom_field = !empty($this->aValues['geom_field']) ? $this->aValues['geom_field'] : '';
+        $limit = !empty($this->aValues['limit']) ? $this->aValues['limit'] : '';
+        $offset = !empty($this->aValues['offset']) ? $this->aValues['offset'] : '';
+        $order_by = !empty($this->aValues['order_by']) ? $this->aValues['order_by'] : '';
+        $sort_order = !empty($this->aValues['sort_order']) ? $this->aValues['sort_order'] : '';
+
+        // Paramètres retenus dans le business object
+        $geom_column = $oBusinessObject->aFields['geom_column'];
+        $bo_id_field = $oBusinessObject->aFields['id_field'];
+        $bo_title = $oBusinessObject->aFields['title'];
+        $bo_formtitle = $oBusinessObject->aFields['formtitle'];
+        $bo_summarytitle = $oBusinessObject->aFields['summarytitle'];
+        $bo_id = $oBusinessObject->aFields['business_object_id'];
+        $database = $oBusinessObject->aFields['database'];
+        $schema = $oBusinessObject->aFields['schema'];
+        $table = $oBusinessObject->aFields['table'];
+        $add_form_size = $oBusinessObject->aFields['add_form_size'];
+        $edit_form_size = $oBusinessObject->aFields['edit_form_size'];
+        $display_form_size = $oBusinessObject->aFields['display_form_size'];
+        $aParams = array();
+
+        // Base de données
+        if (!empty($database) && $database != $this->oConnection->oBd->base) {
+            $this->oConnection->oBd = new Vm($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        // Chaine sql
+        if ($type === 'form' || $type === 'table') {
+            $sSql = 'SELECT * FROM "[sSchema]"."[sTable]"';
+            $aParams['sSchema'] = array('value' => $schema, 'type' => 'schema_name');
+            $aParams['sTable'] = array('value' => $table, 'type' => 'table_name');
+        } else {
+            $sSql = $oBusinessObject->aFields['sql_' . $type];
+        }
+
+        // Valeurs par défaut
+        $intersect_column = empty($intersect_column) ? $geom_column : $intersect_column;
+//        $intersect_buffer = empty($intersect_buffer) ? 0.01 : $intersect_buffer;
+        $geom_field = empty($geom_field) ? $intersect_column : $geom_field;
+        $get_geom = empty($geom_field) || empty($get_geom) ? false : $get_geom;
+        $use_intersect = empty($intersect_geom) || empty($intersect_column) ? false : true;
+        $get_image = empty($get_image) ? false : $get_image;
+
+        if (isset($oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+
+        // Position des attributs dans la requête
+        $iAttributesPos = $this->getAttributsPosition($sSql);
+
+        // Colonne utilisée pour [bo_image]
+        $sBoImageColumn = $this->getBOImageColumn($sSql);
+
+        // Intersection
+        if ($use_intersect === true) {
+
+            // Projection de la colonne intersectée
+            $intersect_column_proj = $this->getColumnProjection($sSql, $iAttributesPos, $intersect_column);
+
+            if (empty($intersect_column_proj)) {
+                $intersect_column_proj = '2154';
+            }
+
+            $aIntersectOperator = array(
+                'column' => $intersect_column,
+                'compare_operator' => 'intersect',
+                'compare_operator_options' => array(
+                    'source_proj' => $intersect_column_proj,
+                    'intersect_buffer' => $intersect_buffer,
+                    'intersect_buffer_geom_type' => "point|line",
+                ),
+                'value' => $intersect_geom
+            );
+
+            $filter = $this->addFilterOperator($filter, $aIntersectOperator);
+        }
+
+        // filtre
+        $aDecodedFilter = $this->decodeJSONFilter($filter, $schema, $table);
+
+        // Ajout dans la requête
+        $sSecuredFilter = $aDecodedFilter['request'];
+        // Ajout des paramètres
+        foreach ($aDecodedFilter['params'] as $key => $value) {
+            $aParams[$key] = $value;
+        }
+
+        // Début de la requête
+        $aParams['bo_id_field'] = array('value' => $bo_id_field, 'type' => 'column_name');
+        $sSql = substr_replace($sSql, ' "[bo_id_field]" as bo_id_value,', $iAttributesPos, 0);
+
+        if ($get_geom === true || $get_geom === 'true') {
+            $aParams['geom_field'] = array('value' => $geom_field, 'type' => 'column_name');
+            if (!empty($result_srid)) {
+                $aParams['result_srid'] = array('value' => $result_srid, 'type' => 'integer');
+                $geom_field_geojson = 'ST_AsEWKT(ST_Transform([geom_field], [result_srid]::integer)) as bo_intersect_geom';
+            } else {
+                $geom_field_geojson = 'ST_AsEWKT([geom_field]) as bo_intersect_geom';
+            }
+            $sSql = substr_replace($sSql, ' ' . $geom_field_geojson . ',', $iAttributesPos, 0);
+        }
+
+        // Récupère le nombre d'enregistrements disponibles avec ce filtre
+        $iTotalRowNumber = $this->getTotalRowNumber($schema, $table, $sSecuredFilter, $aParams);
+
+        // Fin de la requête
+        if (!empty($sSecuredFilter) && strlen($sSecuredFilter) > 1) {
+            $sSql .= ' WHERE ' . $sSecuredFilter;
+        }
+        if (!empty($order_by)) {
+            $sSql .= ' ORDER BY [order_by]';
+            $aParams['order_by'] = array('value' => $order_by, 'type' => 'double_quote');
+            if (!empty($sort_order)) {
+                $sSql .= ' [sort_order]';
+                $aParams['sort_order'] = array('value' => $sort_order, 'type' => 'column_name');
+            }
+        }
+        if (!empty($limit)) {
+            $sSql .= ' LIMIT [limit]';
+            $aParams['limit'] = array('value' => $limit, 'type' => 'string');
+        }
+        if (!empty($offset)) {
+            $sSql .= ' OFFSET [offset]';
+            $aParams['offset'] = array('value' => $offset, 'type' => 'string');
+        }
+
+        // Execute la requête
+        $this->aValues['my_vitis_id'] = "";
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aParams);
+
+        if ($this->oConnection->oBd->enErreur()) {
+            $aXmlRacineAttribute['status'] = 0;
+            writeToErrorLog($this->oConnection->oBd->getBDMessage());
+            $oError = new VitisError(2, $this->oConnection->oBd->getBDMessage());
+        } else {
+            if (!$this->oConnection->oBd->enErreur() && $this->oConnection->oBd->nombreLigne($oResult) > 0) {
+                while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+
+                    if ($type !== 'table') {
+
+                        // Image à la une
+                        if ($get_image === true || $get_image === 'true') {
+                            if (isset($aLigne['[bo_image]'])) {
+                                if (!empty($sBoImageColumn)) {
+                                    $aLigne['bo_image_path'] = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vitis/' . $bo_id . '/documents/' . $aLigne['bo_id_value'] . '/' . $sBoImageColumn . '/' . $aLigne['[bo_image]'] . "?d=" . $date->getTimestamp();
+                                    unset($aLigne['[bo_image]']);
+                                } else {
+                                    $aLigne['bo_image_path'] = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vitis/' . $bo_id . '/documents/' . $aLigne['bo_id_value'] . '/image/' . $aLigne['[bo_image]'] . "?d=" . $date->getTimestamp();
+                                    unset($aLigne['[bo_image]']);
+                                }
+                            }
+                        }
+
+                        // Permet de récupérer la liste des éléments, leur ordre et leur valeur
+                        $aLigne['bo_' . $type . '_attributs'] = Array();
+                        $aLigne['bo_' . $type] = Array();
+                        foreach ($aLigne as $key => $value) {
+                            if (substr($key, 0, 3) !== 'bo_') {
+                                array_push($aLigne['bo_' . $type . '_attributs'], $key);
+                                $aLigne['bo_' . $type][$key] = $value;
+                                unset($aLigne[$key]);
+                            }
+                        }
+
+                        if (isset($aLigne['bo_' . $type][$geom_column])) {
+                            unset($aLigne['bo_' . $type][$geom_column]);
+                        }
+
+                        // Si on désire uniquement le résultat
+                        if ($bOnlyResult === true) {
+                            $aResult = $aLigne['bo_' . $type];
+                            if (isset($aLigne['bo_intersect_geom'])) {
+                                $aResult[$geom_column] = $aLigne['bo_intersect_geom'];
+                            }
+                            $aLigne = $aResult;
+                        } else {
+
+
+                            // Récupère le forulaire JSON
+                            if ($type === 'form') {
+                                $jsonContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/published.json');
+                                if (is_file($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.js')) {
+                                    $jsContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.js');
+                                } else {
+                                    $jsContent = false;
+                                }
+                                if (is_file($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.css')) {
+                                    $cssContent = file_get_contents($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.css');
+                                } else {
+                                    $cssContent = false;
+                                }
+
+                                if ($jsContent !== false)
+                                    $js = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.js' . "?d=" . $date->getTimestamp();
+                                if ($cssContent !== false)
+                                    $css = $this->aProperties['web_server_name'] . '/' . $this->aProperties['ws_data_alias'] . '/vmap/business_object/' . $bo_id . '/forms/ressources/published.css' . "?d=" . $date->getTimestamp();
+
+                                $aLigne['bo_json_form'] = json_decode($jsonContent);
+                                $aLigne['bo_json_form_js'] = $js;
+                                $aLigne['bo_json_form_css'] = $css;
+                            }
+
+                            // Attributs métier
+                            $aLigne['bo_type'] = $bo_id;
+                            $aLigne['bo_title'] = $bo_title;
+                            $aLigne['bo_formtitle'] = $bo_formtitle;
+                            $aLigne['bo_summarytitle'] = $bo_summarytitle;
+                            $aLigne['add_form_size'] = $add_form_size;
+                            $aLigne['edit_form_size'] = $edit_form_size;
+                            $aLigne['display_form_size'] = $display_form_size;
+
+                            if (!empty($oBusinessObject->aFields['id_field']))
+                                $aLigne['bo_id_field'] = $oBusinessObject->aFields['id_field'];
+
+                            if (!empty($geom_column))
+                                $aLigne['geom_column'] = $geom_column;
+
+                            $aRights = $this->oConnection->getTableRights($schema, $table);
+
+                            $aLigne['have_update_rights'] = $this->haveUpdateRights($aRights, $schema, $table, $bo_id, $oBusinessObject->aFields['id_field']);
+                            $aLigne['have_card_rights'] = $this->haveCardRights($aRights, $schema, $table, $bo_id);
+                            $aLigne['have_delete_rights'] = $this->haveDeleteRights($aRights);
+                            $aLigne['have_insert_rights'] = $this->haveInsertRights($aRights);
+
+                            // Enlève les arguments non demandés
+                            foreach ($aLigne as $key => $value) {
+                                if ($this->isAttribute($key) === false) {
+                                    unset($aLigne[$key]);
+                                }
+                            }
+                        }
+
+                        // Fichiers à récupérer ?
+                        $sDataDir = $this->aProperties['ws_data_dir'] . "/vitis/" . $bo_id . "/documents/" . $aLigne['bo_id_value'];
+                        $sDataUrl = $this->aProperties['web_server_name'] . "/" . $this->aProperties['ws_data_alias'] . "/vitis/" . $bo_id . "/documents/" . $aLigne['bo_id_value'];
+
+                        foreach ($aLigne['bo_' . $type] as $key => $value) {
+                            if (is_dir($sDataDir . "/" . $key)) {
+                                $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                            }
+                        }
+                    }
+
+                    // Nombre total d'éléments dans la table
+                    if (!empty($iTotalRowNumber)) {
+                        $this->aFields['total_row_number'] = $iTotalRowNumber;
+                    }
+
+                    // Attributs récupérés
+                    $oObject = new QueryResponse();
+                    $oObject->aFields = $aLigne;
+                    array_push($this->aObjects, $oObject);
+                }
+            }
+        }
+
+        // Message de sortie
+        if (isset($oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        } else {
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+    }
+
+    /**
+     * Get the [bo_image] column from SQL, return false if not founded
+     * @param string $sSQL
+     *
+     * @return string
+     */
+    function getBOImageColumn($sSQL){
+
+        $sImageColumn = false;
+        $aSQL = explode(',', $sSQL);
+
+        for ($i=0; $i < count($aSQL); $i++) {
+            if (strpos($aSQL[$i], '[bo_image]') !== false) {
+                $aBoLinkSQL = explode(' ', trim($aSQL[$i]));
+                if (!empty(trim($aBoLinkSQL[0]))) {
+                    $sImageColumn = trim($aBoLinkSQL[0]);
+                    $sImageColumn = str_replace('"', '', $sImageColumn);
+                    $sImageColumn = str_replace("'", '', $sImageColumn);
+                }
+            }
+        }
+
+        return $sImageColumn;
+    }
+
+    /**
+     * Add a filter operator
+     * @param string $sFilter
+     * @param array $aOperator
+     * @return string
+     */
+    function addFilterOperator($sFilter, $aOperator) {
+
+        if (is_object($sFilter) || is_array($sFilter)) {
+            $sFilter = json_encode($sFilter);
+        }
+
+        try {
+            $aJSONFilter = json_decode($sFilter, true);
+        } catch (Exception $ex) {
+            $aJSONFilter = null;
+        }
+
+        if (is_array($aJSONFilter)) {
+            if (is_array($aJSONFilter['operators'])) {
+                array_push($aJSONFilter['operators'], $aOperator);
+            } else {
+                $aJSONFilter['operators'] = array($aOperator);
+            }
+        } else {
+            $aJSONFilter = array(
+                'relation' => 'AND',
+                'operators' => array($aOperator)
+            );
+        }
+
+        return json_encode($aJSONFilter);
+    }
+
+    /**
+     *
+     * @param string $schema
+     * @param string $table
+     * @param string $sSecuredFilter
+     * @param array $aParams
+     * @return string
+     */
+    function getTotalRowNumber($schema, $table, $sSecuredFilter, $aParams) {
+
+        $aParams['sSchema'] = array('value' => $schema, 'type' => 'schema_name');
+        $aParams['sTable'] = array('value' => $table, 'type' => 'table_name');
+
+        $sSql = 'SELECT count(*) as total_row_number FROM "[sSchema]"."[sTable]"';
+        if (!empty($sSecuredFilter) && strlen($sSecuredFilter) > 1) {
+            $sSql .= ' WHERE ' . $sSecuredFilter;
+        }
+
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($sSql, $aParams);
+        $aResult = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+
+        if (!empty($aResult[0])) {
+            if (!empty($aResult[0]['total_row_number'])) {
+                return $aResult[0]['total_row_number'];
+            }
+        }
+    }
+
+    /**
+     * Check if the attr has to be returned
+     * @param string $sElement
+     * @return boolean
+     */
+    function isAttribute($sElement) {
+        if (!isset($this->aValues['attributs'])) {
+            return true;
+        }
+        if (empty($this->aValues['attributs'])) {
+            return true;
+        }
+
+        $aAttributs = explode('|', $this->aValues['attributs']);
+
+        if (!is_array($aAttributs)) {
+            return true;
+        }
+        if (count($aAttributs) == 0) {
+            return true;
+        }
+        if (array_search($sElement, $aAttributs) === 0) {
+            return true;
+        }
+        if (array_search($sElement, $aAttributs) == null) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Check if connection rights contains update and if the form is present
+     * @param string $aRights
+     * @param string $schema
+     * @param string $table
+     * @param string $bo_id
+     * @param string $bo_id_field
+     * @return string true if the update is possible, false if is not
+     */
+    function haveUpdateRights($aRights, $schema, $table, $bo_id, $bo_id_field) {
+        if (!file_exists($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/published.json'))
+            return "false";
+
+        if (in_array("UPDATE", $aRights))
+            return "true";
+        else
+            return "false";
+    }
+
+    /**
+     * heck if connection rights contains select and if the form is present
+     * @param string $aRights
+     * @param string $schema
+     * @param string $table
+     * @param string $bo_id
+     * @return string true if the card is visible, false if is not
+     */
+    function haveCardRights($aRights, $schema, $table, $bo_id) {
+        if (!file_exists($this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $bo_id . '/forms/published.json'))
+            return "false";
+
+        if (in_array("SELECT", $aRights))
+            return "true";
+        else
+            return "false";
+    }
+
+    /**
+     * heck if connection rights contains delete
+     * @param string $aRights
+     * @return string true if the object is deletable
+     */
+    function haveDeleteRights($aRights) {
+        if (in_array("DELETE", $aRights))
+            return "true";
+        else
+            return "false";
+    }
+
+    /**
+     * heck if connection rights contains insert
+     * @param string $aRights
+     * @return string true if the object is deletable
+     */
+    function haveInsertRights($aRights) {
+        if (in_array("INSERT", $aRights))
+            return "true";
+        else
+            return "false";
+    }
+
+    /**
+     * Get the position of the firt attribute in a SQL request
+     * @param string $sSql
+     * @return int the position of the firt attribute
+     */
+    function getAttributsPosition($sSql) {
+        // Position du permier select de la requête
+        $iSelectPos = strpos(strtoupper($sSql), 'SELECT');
+        $iSelectPos = is_numeric($iSelectPos) ? $iSelectPos + 6 : 0;
+
+        // Position du permier distinct de la requête
+        $iDistinctPos = strpos(strtoupper($sSql), 'SELECT DISTINCT', $iSelectPos);
+        $iDistinctPos = is_numeric($iDistinctPos) ? $iDistinctPos + 9 : 0;
+
+        // Position du permier all de la requête
+        $iALLPos = strpos(strtoupper($sSql), 'SELECT ALL', $iSelectPos);
+        $iALLPos = is_numeric($iALLPos) ? $iALLPos + 4 : 0;
+
+        // Position des attributs dans la requête
+        $iAttributesPos = $iSelectPos + $iDistinctPos + $iALLPos;
+
+        return $iAttributesPos;
+    }
+
+    /**
+     * Get the projection of a column from an SQL request
+     * @param type $sSql SQL request witch contains the table, schema etc..
+     * @param type $columnName name of the column to look the projection
+     */
+    function getColumnProjection($sSql, $iAttributesPos, $columnName) {
+        $sSql_tmp = substr_replace($sSql, ' ST_SRID([intersect_column]) as bo_intersect_column_srid,', $iAttributesPos, 0) . ' where ST_SRID([intersect_column]) != 0 limit 1';
+
+        $aParams = array(
+            'intersect_column' => array('value' => $columnName, 'type' => 'column_name')
+        );
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql_tmp, $aParams);
+
+
+        if ($this->oConnection->oBd->enErreur()) {
+            writeToErrorLog($this->oConnection->oBd->getBDMessage());
+        } else {
+            if (!isset($this->oConnection->oBd->enErreur)) {
+                $this->oConnection->oBd->enErreur = false;
+            }
+            if (!$this->oConnection->oBd->enErreur && $this->oConnection->oBd->nombreLigne($oResult) > 0) {
+                $aData = array();
+                while ($aObject = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                    foreach ($aObject as $sParamKey => $sParamValue) {
+                        if ($sParamKey === 'bo_intersect_column_srid')
+                            $intersect_column_proj = $sParamValue;
+                    }
+                }
+            }
+        }
+        return $intersect_column_proj;
+    }
+
+    /**
+     * Get the geometries from a business object intersecting intersect_geom
+     */
+    function getBoGeomsFromIntersect($sBusinessObjectId) {
+
+        if (!empty($this->oConnection->oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $this->oConnection->oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+        if (empty($sBusinessObjectId) || empty($this->aValues['intersect_geom']) || empty($this->aValues['snapping_mode'])) {
+            $oError = new VitisError(0, 'Parameters business_object_id, intersect_geom, snapping_mode required');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+
+        // Objet BusinessObject correspondant
+        $aPath = array('vmap', 'businessobjects', $sBusinessObjectId);
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => 'application/json',
+            'sEncoding' => 'UTF-8',
+            'sSourceEncoding' => 'UTF-8',
+            'my_vitis_id' => $sBusinessObjectId,
+            'module' => 'vmap',
+        );
+        $oBusinessObject = new BusinessObject($aPath, $aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        // Vérifie l'éxistance de l'objet métier
+        if (empty($oBusinessObject->aFields['business_object_id'])) {
+            $oError = new VitisError(0, 'Business object ' . $sBusinessObjectId . ' not founded');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        }
+
+        // Paramètres retenus dans l'url
+        $sSchema = $oBusinessObject->aFields['schema'];
+        $sTable = $oBusinessObject->aFields['table'];
+        $intersectGeom = $this->aValues['intersect_geom'];
+        $sSnapMode = $this->aValues['snapping_mode'];
+        $iSnappingLimit = !empty($this->aValues['snapping_limit']) ? $this->aValues['snapping_limit'] : 100000;
+
+        // Paramètres retenus dans le business object
+        $sGeomColumn = $oBusinessObject->aFields['geom_column'];
+        $sDatabase = $oBusinessObject->aFields['database'];
+
+        // Base de données
+        if (!empty($sDatabase) && $sDatabase != $this->oConnection->oBd->base) {
+            $this->oConnection->oBd = new Vm($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $sDatabase, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        // Paramètres de la requête
+        $aParams = array();
+        $aParams['sSchema'] = array('value' => $sSchema, 'type' => 'schema_name');
+        $aParams['sTable'] = array('value' => $sTable, 'type' => 'table_name');
+        $aParams['sGeomColumn'] = array('value' => $sGeomColumn, 'type' => 'column_name');
+        $aParams['iSnappingLimit'] = array('value' => $iSnappingLimit, 'type' => 'integer');
+
+        // Projection de la colonne intersectée
+        $iColumnProj = $this->oConnection->oBd->getColumnSRID($sSchema, $sTable, $sGeomColumn);
+        if (empty($iColumnProj)) {
+            $iColumnProj = '2154';
+        }
+
+        // Filtre
+        $aFilter = array(
+            'column' => $sGeomColumn,
+            'compare_operator' => 'intersect',
+            'compare_operator_options' => array(
+                'source_proj' => $iColumnProj,
+            ),
+            'value' => $intersectGeom
+        );
+        $aDecodedFilter = $this->decodeJSONFilter($aFilter, $sSchema, $sTable);
+
+        $sSecuredFilter = $aDecodedFilter['request'];
+        foreach ($aDecodedFilter['params'] as $key => $value) {
+            $aParams[$key] = $value;
+        }
+
+        // Compte le nomber d'éléments qui seront affichés
+        $sSqlCount = 'SELECT COUNT(ST_NPoints([sGeomColumn])) FROM "[sSchema]"."[sTable]" AS geom WHERE ' . $sSecuredFilter . ' AND [sGeomColumn] IS NOT NULL';
+        $oResult = $this->oConnection->oBd->executeWithParams($sSqlCount, $aParams);
+        if ($this->oConnection->oBd->enErreur()) {
+            $aXmlRacineAttribute['status'] = 0;
+            writeToErrorLog($this->oConnection->oBd->getBDMessage());
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+            return $aReturn['sMessage'];
+        } else {
+            $aCountResult = $this->oConnection->oBd->getResultTableAssoc($oResult);
+        }
+
+        // Si le nombre d'éléments est correct, alors effectue la vraie requête
+        if ($aCountResult[0]['count'] < $iSnappingLimit) {
+
+            // Mise en place de la requête
+            switch ($sSnapMode) {
+                case 'segment_edge_node':
+                case 'edge_node':
+                    $sSql = 'SELECT ST_AsEWKT([sGeomColumn])';
+                    break;
+                case 'node':
+                    $sSql = 'SELECT ST_AsEWKT(ST_Collect(ST_StartPoint([sGeomColumn]), ST_EndPoint([sGeomColumn])))';
+                    break;
+                default:
+                    $sSql = 'SELECT ST_AsEWKT([sGeomColumn])';
+                    break;
+            }
+            $sSql .= ' AS geom FROM "[sSchema]"."[sTable]" WHERE ' . $sSecuredFilter . ' AND [sGeomColumn] IS NOT NULL';
+
+            // Execution de la requête
+            $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aParams);
+            if ($this->oConnection->oBd->enErreur()) {
+                $aXmlRacineAttribute['status'] = 0;
+                writeToErrorLog($this->oConnection->oBd->getBDMessage());
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+                return $aReturn['sMessage'];
+            } else {
+                $aResult = $this->oConnection->oBd->getResultTableAssoc($oResult);
+            }
+
+            return json_encode($aResult);
+        } else {
+            return json_encode($aCountResult);
+        }
+    }
+
+    /**
+     * @SWG\Put(path="/querys/{business_object_id}",
+     *   tags={"Querys"},
+     *   summary="Update an element of a business object",
+     *   description="Request to update an element of a business object",
+     *   operationId="PUT",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="body",
+     *     in="body",
+     *     description="",
+     *     required=false,
+     *     type="body",
+     *     format="string",
+     *     @SWG\Schema(ref="#/definitions/businessobjects")
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     ),
+     *
+     *  )
+     */
+
+    /**
+     * modify an element by business_object_id
+     * @return array containing the status and the message
+     */
+    function PUT() {
+
+        $sBusinessObjectId = $this->aPath['2'];
+
+        if (!isset($sBusinessObjectId)) {
+            return 'business_object_id required';
+        }
+
+        $this->aPath['3'] = $sBusinessObjectId;
+        $this->aValues['my_vitis_id'] = $sBusinessObjectId;
+
+        $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        $bo_database = $oBusinessObject->aFields['database'];
+        $bo_schema = $oBusinessObject->aFields['schema'];
+        $bo_table = $oBusinessObject->aFields['table'];
+        $bo_id_field = $oBusinessObject->aFields['id_field'];
+        $bo_event = $oBusinessObject->aFields['event_id'];
+
+        if (!empty($bo_database) && $bo_database != $this->oConnection->oBd->base) {
+            $this->oConnection->oBd = new Vm($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $bo_database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        $this->aValues['my_vitis_id'] = $this->aValues[$bo_id_field];
+
+        // Définit si il a des fichiers a uploader
+        $bUploadFiles = false;
+        foreach ($this->aValues as $key => $value) {
+            if (strrpos($key, '_file')) {
+                $sName = substr($key, 0, strrpos($key, '_file'));
+                if (isset($this->aValues[$sName . '_name'])) {
+                    $bUploadFiles = true;
+                }
+            }
+        }
+
+        // Fichiers à uploader ?
+        if ($bUploadFiles) {
+            // Création du dossier contenneur si il n'existe pas
+            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
+            if (!is_dir($sDirPath)) {
+                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            // Mise en place des fichiers
+            $this->aValues = $this->extractFilesFromValues($this->aValues, $sDirPath);
+        }
+
+        $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field);
+
+        // Lance l'évènement webSocket
+        if (!empty($bo_event)) {
+            sendWebsocketMessage($this->aProperties['websocket_server'], $this->aProperties['websocket_port'], $this->aProperties['websocket_alias'], array(
+                'action' => 'event',
+                'service' => 'VmapEvents',
+                'data' => $bo_event
+            ));
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * Extract the files from aValues and modify the paths
+     * @param array $aValues
+     * @param string $sDirPath
+     * @param string $sFilePrefix
+     * @return array Parsed $aValues
+     */
+    function extractFilesFromValues($aValues, $sDirPath) {
+
+        foreach ($aValues as $key => $value) {
+            if (strrpos($key, '_file')) {
+
+                $sName = substr($key, 0, strrpos($key, '_file'));
+                $sFileName = $aValues[$sName . '_name'];
+
+                if (!empty($sFileName)) {
+
+                    $sDirColumnPath = $sDirPath . '/' . $sName;
+                    if (!is_dir($sDirColumnPath)) {
+                        mkdir($sDirColumnPath, 0777, true);
+                    }
+
+                    // CÅ•ee le fichier sur le serveur
+                    $fp = fopen($sDirColumnPath . '/' . $sFileName, "w");
+                    fwrite($fp, $value);
+                    fclose($fp);
+
+                    // Mise en place pour la base de données
+                    $aValues[$sName] = $aValues[$sName . '_name'];
+                    unset($aValues[$sName . '_file']);
+                    unset($aValues[$sName . '_name']);
+                }
+            }
+        }
+
+        return $aValues;
+    }
+
+    /**
+     * Create the element files container
+     * @param string $sBoId
+     * @param string $sId
+     * @return string Path to the created directory
+     */
+    function createElementFilesFolder($sBoId, $sId) {
+
+        // Répertoires présents ?
+        if (is_dir($this->aProperties['ws_data_dir'])) {
+            $sDirPath = $this->aProperties['ws_data_dir'] . '/vitis';
+            if (!is_dir($sDirPath)) {
+                mkdir($sDirPath, 0777, true);
+            }
+            $sDirPath = $sDirPath . '/' . $sBoId;
+            if (!is_dir($sDirPath)) {
+                mkdir($sDirPath, 0777, true);
+            }
+            $sDirPath = $sDirPath . '/documents';
+            if (!is_dir($sDirPath)) {
+                mkdir($sDirPath, 0777, true);
+            }
+            $sDirPath = $sDirPath . '/' . $sId;
+            if (!is_dir($sDirPath)) {
+                mkdir($sDirPath, 0777, true);
+            }
+        }
+
+        return $sDirPath;
+    }
+
+    /**
+     * @SWG\Post(path="/querys/{business_object_id}",
+     *   tags={"Querys"},
+     *   summary="Insert an element of a business object",
+     *   description="Request to insert an element of a business object",
+     *   operationId="POST",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="business object id",
+     *     required=true,
+     *     type="integer",
+     *     format="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="body",
+     *     in="body",
+     *     description="",
+     *     required=false,
+     *     type="body",
+     *     format="string",
+     *     @SWG\Schema(ref="#/definitions/businessobjects")
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     ),
+     *
+     *  )
+     */
+
+    /**
+     * modify an element by business_object_id
+     * @return array containing the status and the message
+     */
+    function POST() {
+
+        $sBusinessObjectId = $this->aPath['2'];
+
+        if (!isset($sBusinessObjectId)) {
+            return 'business_object_id required';
+        }
+
+        $this->aPath['3'] = $sBusinessObjectId;
+        $this->aValues['my_vitis_id'] = $sBusinessObjectId;
+
+        $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        $bo_database = $oBusinessObject->aFields['database'];
+        $bo_schema = $oBusinessObject->aFields['schema'];
+        $bo_table = $oBusinessObject->aFields['table'];
+        $bo_id_field = $oBusinessObject->aFields['id_field'];
+        $bo_event = $oBusinessObject->aFields['event_id'];
+
+        if (!empty($bo_database) && $bo_database != $this->oConnection->oBd->base) {
+            $this->oConnection->oBd = new Vm($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $bo_database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        // $this->aValues['my_vitis_id'] = $this->aValues[$bo_id_field];
+        unset($this->aValues['my_vitis_id']);
+
+        $aReturn = $this->genericPost($bo_schema, $bo_table, '', $bo_id_field);
+
+        // Fichiers à uploader ?
+        if (!empty($_FILES) && !empty($this->aValues['my_vitis_id'])) {
+
+            // Création du dossier contenneur
+            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
+            if (!is_dir($sDirPath)) {
+                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                return $sMessage;
+            }
+            // Écriture du fichier
+            foreach ($_FILES as $sName => $aFile) {
+
+                $sDirColumnPath = $sDirPath . '/' . $sName;
+                if (!is_dir($sDirColumnPath)) {
+                    mkdir($sDirColumnPath, 0777, true);
+                }
+
+                $this->aValues[$sName] = $aFile['name'];
+
+                // Écrit le fichier dans son enplacement
+                uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'], $aFile['size'] + 1);
+            }
+            $this->genericPut($bo_schema, $bo_table, $bo_id_field);
+        }
+
+        // Lance l'évènement webSocket
+        if (!empty($bo_event)) {
+            sendWebsocketMessage($this->aProperties['websocket_server'], $this->aProperties['websocket_port'], $this->aProperties['websocket_alias'], array(
+                'action' => 'event',
+                'service' => 'VmapEvents',
+                'data' => $bo_event
+            ));
+        }
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/querys/{business_object_id}",
+     *   tags={"Querys"},
+     *   summary="delete elements of a business object",
+     *   description="Request to delete elements of a business object",
+     *   operationId="DELETE",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="business_object token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="business_object_id",
+     *     in="path",
+     *     description="id of the businessobjects",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id list of the elements to delete separed by |",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/businessobjects")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete business_object
+     * @return id of business_object deleted or error object if a business_object is not deleted
+     */
+    function DELETE() {
+
+        $sBusinessObjectId = $this->aPath['2'];
+
+        if (!isset($sBusinessObjectId)) {
+            return 'business_object_id required';
+        }
+
+        if (empty($this->aValues['idList']) && !empty($this->aPath['3'])) {
+            $this->aValues['idList'] = $this->aPath['3'];
+        }
+
+        $this->aPath['3'] = $sBusinessObjectId;
+        $this->aValues['my_vitis_id'] = $sBusinessObjectId;
+
+        $oBusinessObject = new BusinessObject($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oBusinessObject->GET();
+
+        $bo_database = $oBusinessObject->aFields['database'];
+        $bo_schema = $oBusinessObject->aFields['schema'];
+        $bo_table = $oBusinessObject->aFields['table'];
+        $bo_id_field = $oBusinessObject->aFields['id_field'];
+        $bo_event = $oBusinessObject->aFields['event_id'];
+
+        $aIdList = explode("|", $this->aValues['idList']);
+
+        $sIdList = "";
+        for ($i = 0; $i < count($aIdList); $i++) {
+            if ($i > 0)
+                $sIdList .= ", ";
+            $sIdList .= "'" . $aIdList[$i] . "'";
+        }
+
+        if (!empty($bo_database) && $bo_database != $this->oConnection->oBd->base) {
+            $this->oConnection->oBd = new Vm($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $bo_database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        $this->oConnection->oBd->delete($bo_schema, $bo_table, $bo_id_field, $this->aValues['idList']);
+
+        if ($this->oConnection->oBd->enErreur()) {
+            $aXmlRacineAttribute['status'] = 0;
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        } else {
+            $this->deleteElementsDocuments($sBusinessObjectId, $aIdList);
+            $this->aFields['idList'] = $sIdList;
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        }
+
+        $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+        $sMessage = $aReturn['sMessage'];
+
+        // Lance l'évènement webSocket
+        if (!empty($bo_event)) {
+            sendWebsocketMessage($this->aProperties['websocket_server'], $this->aProperties['websocket_port'], $this->aProperties['websocket_alias'], array(
+                'action' => 'event',
+                'service' => 'VmapEvents',
+                'data' => $bo_event
+            ));
+        }
+
+        return $sMessage;
+    }
+
+    /**
+     * Delete the documents binded to the elements specified in $aIds
+     * @param string $sBusinessObjectId
+     * @param array $aIds
+     */
+    function deleteElementsDocuments($sBusinessObjectId, $aIds) {
+        for ($i = 0; $i < count($aIds); $i++) {
+            if (!empty($aIds[$i])) {
+                $sDir = $this->aProperties['ws_data_dir'] . '/vitis/' . $sBusinessObjectId . '/documents/' . $aIds[$i];
+                if (is_dir($sDir)) {
+                    clearDir($sDir);
+                }
+            }
+        }
+    }
+
+}
+
+class QueryResponse extends Vitis {
+
+    function __construct() {
+
+    }
+
+}
+
+?>
diff --git a/web_service/ws/RapportsCadastreParcelle.class.inc b/web_service/ws/RapportsCadastreParcelle.class.inc
deleted file mode 100755
index 8736a4688e21441de45cbc3b77fd3fa33fb0d475..0000000000000000000000000000000000000000
--- a/web_service/ws/RapportsCadastreParcelle.class.inc
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file rapportscadastreparcelle.class.inc
- * \class RapportsCadastreParcelle
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * 	\brief This file contains the RapportsCadastreParcelle php class
- *
- * This class defines the rest api for rapportscadastreparcelle
- * 
- */
-class RapportsCadastreParcelle extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/rapportscadastreparcelle",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/rapportscadastreparcelle")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="rapportscadastreparcelle",
-     *   description="Operations about rapportscadastreparcelle"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/rapportscadastreparcelle",
-     *   tags={"RapportsCadastreParcelle"},
-     *   summary="Create the releve de propriete sheet",
-     *   description="Request to get the element",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="parcelles",
-     *     in="query",
-     *     description="id_par des parcelles (ex: 340039000AI0166|340332000AC0005)",
-     *     required=true,
-     *     default="",
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="rapport_type",
-     *     in="query",
-     *     description="type de rapport: ToutesInfos, BatieNonBatie, Proprietaire, SubdivisionFiscale, EmprisePosPlu, Locaux, ProprietaireLocaux",
-     *     required=true,
-     *     default="",
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="RapportsCadastreParcelle Response",
-     *         @SWG\Schema(ref="#/definitions/rapportscadastreparcelle")
-     *     )
-     *  )
-     */
-    function GET() {
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        /**
-         * Tableau contenant les id_par des parcelles à utiliser
-         * @type array
-         */
-        $aParcelles = explode("|", $this->aValues["parcelles"]);
-
-        /**
-         * Type de rapport
-         * @type string
-         */
-        $rapportType = $this->aValues['rapport_type'];
-
-        /**
-         * Objet BD
-         * @type object
-         */
-        $oBD = new BD($this->aProperties["cadastre"]["rp"]["login"], $this->aProperties["cadastre"]["rp"]["pass"], $this->aProperties["database"], $this->aProperties["server"], $this->aProperties["port"], $this->aProperties["sgbd"], $this->aProperties["page_encoding"]);
-        $this->oConnection->oBd = $oBD;
-        /**
-         * Properties
-         * @type array
-         */
-        $properties = $this->aProperties;
-
-        /**
-         * Returned array
-         * @type array
-         */
-        $aReturn = Array();
-
-
-        // Mémorise la date de début
-        $iDebutPdf = (date("G") * 60) * 60 + (date("i") * 60) + date("s");
-        $DebutPdf = date("G") . 'h ' . date("i") . 'min ' . date("s") . 's';
-
-        // Connexion avec uVitis pour récupérer les données majic
-
-        $oBD = new BD($properties["cadastre"]["rp"]["login"], $properties["cadastre"]["rp"]["pass"], $properties["database"], $properties["server"], $properties["port"], $properties["sgbd"], $properties["page_encoding"]);
-        $this->oConnection->oBd = $oBD;
-
-        // Récupère l'année
-        $sYear = $this->vmapGet('majic', '"ANNEE_REFERENCE"', array('ANNEE'), '', array('limit' => 1))[0]['ANNEE'];
-
-        // Patch pour décoder les properties UTF-8 parce que les rapports sont générés en ISO
-        if (is_array($properties["cadastre"]["fiche_urb"]["intersect"]["views"])) {
-            $properties["cadastre"]["fiche_urb"]["intersect"]["views"] = $this->decodeUtf8Array($properties["cadastre"]["fiche_urb"]["intersect"]["views"]);
-        }
-
-        // Charge les données
-        if ($rapportType != 'Locaux' && $rapportType != 'ProprietaireLocaux') {
-            require_once(dirname($_SERVER['SCRIPT_FILENAME']) . "/class/majic_libV2/Mj_Compte_Communal_Parcelles.class.inc");
-            $oRapport = new Mj_Compte_Communal_Parcelles($aParcelles, $oBd, $properties, "polygon");
-        } else {
-            require_once(dirname($_SERVER['SCRIPT_FILENAME']) . "/class/majic_libV2/Mj_Bati_Parcelles.class.inc");
-            $oRapport = new Mj_Bati_Parcelles($aParcelles, $oBd, $properties);
-        }
-
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"])) {
-            mkdir($properties["cadastre"]["rp"]["rp_dir"]);
-        }
-        // Crée les dossiers correspondants
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear))
-            @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear);
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType))
-            @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType);
-
-
-        // Crée les XML
-        if ($oRapport->isError()) {
-            http_response_code(500);
-            writeToErrorLog('Erreur lors de l\'extraction des données avec la librairie majic : ' . $oRapport->sMessage);
-            $aReturn['error']['errorMessage'] = "Erreur lors de la génération du rapport.";
-            return json_encode($aReturn);
-        } else {
-            // Création du fichier XML.
-            $sFile = "";
-            foreach ($aParcelles as $parcelle) {
-                $sFile .= $parcelle;
-            }
-            if (count($aParcelles) > 2) {
-                $sFile = UniqFileName();
-            }
-
-            $sXmlFileName = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/" . $sFile . ".xml";
-
-            if ($rapportType === 'ToutesInfos')
-                $sXslFileName = dirname($_SERVER['SCRIPT_FILENAME']) . "/class/majic_lib/xsl/Mj_Rapport.xsl";
-            else
-                $sXslFileName = dirname($_SERVER['SCRIPT_FILENAME']) . "/class/majic_lib/xsl/Mj_Rapport_Parcelle_" . $rapportType . ".xsl";
-
-            if (!file_exists($sXmlFileName)) {
-                $oRapport->asXMLFile("", $sXmlFileName, "Rapport_Parcelle", "UTF-8", "ISO-8859-1");
-            }
-        }
-
-
-        // Crée les PDF et XSL
-        if ($rapportType === 'ToutesInfos') {
-
-            // Chemin vers le fichier
-            $filePath = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/" . $sFile . ".pdf";
-
-            if (!file_exists($filePath)) {
-
-                // Pour faire du pdf
-                $sPdfFileName = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/" . $sFile . ".pdf";
-
-                // Création du fichier PDF.
-                $sCommandLine = $properties["fop_root_dir"] . "/fop -xsl " . $sXslFileName . " -xml " . $sXmlFileName . " -pdf " . $sPdfFileName;
-
-                exec($sCommandLine, $aCommand, $iResult);
-
-                if ($iResult) {
-                    http_response_code(500);
-                    $aReturn['error']['errorMessage'] .= "Erreur lors de la génération du rapport.";
-                    writeToErrorLog("Erreur lors de la génération d'un rapport au format PDF.");
-                    writeToErrorLog("Ligne de commande : " . $sCommandLine);
-                }
-            }
-
-            $downloadFilePath = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/cadastre/downloadrapport?sYear=' . $sYear . '&sType=Rapport_Parcelle_' . $rapportType . '&sFileName=' . urlencode($sFile) . '.pdf';
-        } else {
-
-            // Pour faire de l'excel
-            $sFileName = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/transform.xml";
-
-            // Chemin vers le fichier
-            $filePath = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/" . $sFile . ".xls";
-
-            if (!file_exists($filePath)) {
-                $doc = new DOMDocument();
-                $xsl = new XSLTProcessor();
-                if (file_exists($sXslFileName)) {
-                    $doc->load($sXslFileName);
-                    $xsl->importStyleSheet($doc);
-                    $doc->load($sXmlFileName);
-                    $oHandle = fopen($sFileName, 'w');
-                    if ($oHandle == false) {
-                        http_response_code(500);
-                        $aReturn['error']['errorMessage'] .= "Impossible de créer le fichier " . $sFileName . ". Impossible de générer le rapport.";
-                    } else {
-                        fwrite($oHandle, $xsl->transformToXML($doc));
-                        fclose($oHandle);
-                        $sRapportCree = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/Rapport_Parcelle_" . $rapportType . "/" . $sFile . ".xls";
-                        // copie du fichier pour créer le fichier excel
-                        if (!copy($sFileName, $sRapportCree)) {
-                            http_response_code(500);
-                            $aReturn['error']['errorMessage'] .= "La copie du fichier '" . $sFileName . "' vers '" . $sRapportCree . "' n'a pas réussi. Impossible de générer le rapport.";
-                        }
-                    }
-                } else {
-                    writeToErrorLog("Le fichier " . $sXslFileName . " n'existe pas.");
-                }
-            } else {
-                $aReturn['data']['alreadyExists'] = true;
-            }
-
-            $downloadFilePath = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/cadastre/downloadrapport?sYear=' . $sYear . '&sType=Rapport_Parcelle_' . $rapportType . '&sFileName=' . urlencode($sFile) . '.xls';
-        }
-
-        $iFinPdf = (date("G") * 60) * 60 + (date("i") * 60) + date("s");
-        $FinPdf = date("G") . 'h ' . date("i") . 'min ' . date("s") . 's';
-
-        $aReturn['data']['rapport'] = $downloadFilePath;
-        $aReturn['data']['format'] = pathinfo($filePath, PATHINFO_EXTENSION);
-        $aReturn['data']['debut'] = $DebutPdf;
-        $aReturn['data']['fin'] = $FinPdf;
-        $aReturn['data']['temps'] = $iFinPdf - $iDebutPdf . 's';
-
-        return json_encode($aReturn);
-    }
-
-    /**
-     * Fonction permettant de décoder un tableau multidimensionnel UTF8 en ISO.
-     * /param $s Tableau à décoder.
-     */
-    function decodeUtf8Array($s) {
-        if (is_array($s)) {
-            $result = array();
-            foreach ($s as $id => $value) {
-                if (is_array($value))
-                    $result[$id] = $this->decodeUtf8Array($value);
-                else
-                    $result[$id] = utf8_decode($value);
-            }
-            return $result;
-        } else
-            return $s;
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/ReleveDePropriete.class.inc b/web_service/ws/ReleveDePropriete.class.inc
deleted file mode 100755
index 0d445f67f48f1c0f6113ce1d9efe74052a73325f..0000000000000000000000000000000000000000
--- a/web_service/ws/ReleveDePropriete.class.inc
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-/**
- * \file relevedepropriete.class.inc
- * \class ReleveDePropriete
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- *  \brief This file contains the ReleveDePropriete php class
- *
- * This class defines the rest api for relevedepropriete
- * 
- */
-class ReleveDePropriete extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/relevedepropriete",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/relevedepropriete")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="relevedepropriete",
-     *   description="Operations about relevedepropriete"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-    }
-
-    /**
-     * @SWG\Get(path="/relevedepropriete",
-     *   tags={"ReleveDePropriete"},
-     *   summary="Create the releve de propriete sheet",
-     *   description="Request to get the element",
-     *   operationId="GET",
-     *   produces={"application/json"},
-     * @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="type",
-     *     in="query",
-     *     description="standard / tiers / parcelle",
-     *     required=true,
-     *     default="parcelle",
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="IDDNUPRO",
-     *     in="query",
-     *     description="concaténation entre ID_COM et DNUPRO",
-     *     required=false,
-     *     default="L00048",
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_PAR",
-     *     in="query",
-     *     description="ID_PAR",
-     *     required=false,
-     *     default="340039000AI0166",
-     *     type="string"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="ReleveDePropriete Response",
-     *         @SWG\Schema(ref="#/definitions/relevedepropriete")
-     *     )
-     *  )
-     */
-    function GET() {
-
-        if (!in_array('vmap_cadastre_user', $this->oConnection->aPrivileges)) {
-            $oError = new VitisError(0, 'INSUFFICIENT_PRIVILEGES');
-            $aXmlRacineAttribute['status'] = 0;
-            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-            return $sMessage;
-        }
-
-        $ID_PAR = $this->aValues['ID_PAR'];
-        $IDDNUPRO = $this->aValues['IDDNUPRO'];
-        $sType = $this->aValues['type'];
-        $properties = $this->aProperties;
-        $aReturn = Array();
-
-        // Vérifie que l'utilisateur a les droits sur la commune
-        $communeRights = false;
-        if ($ID_PAR != '')
-            $communeRights = $this->haveCommuneRights(substr($ID_PAR, 0, 6));
-        if ($IDDNUPRO != '')
-            $communeRights = $this->haveCommuneRights(substr($IDDNUPRO, 0, 6));
-
-        // Vérifie les droits sur la commune
-        if ($communeRights == false) {
-            http_response_code(403);
-            writeToErrorLog("L'utilisateur n'a pas les droits sur la commune");
-            $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-            return json_encode($aReturn);
-        }
-
-        // Vérifie la validité des informations passées en properties
-        if (!is_dir($properties["fop_root_dir"])) {
-            http_response_code(500);
-            writeToErrorLog("Dossier fop introuvable: " . $properties["fop_root_dir"]);
-            $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-            return json_encode($aReturn);
-        }
-        if (!is_dir(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/majic_lib')) {
-            http_response_code(500);
-            writeToErrorLog("Dossier majic_lib introuvable");
-            $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-            return json_encode($aReturn);
-        }
-
-        $oBD = new BD($properties["cadastre"]["rp"]["login"], $properties["cadastre"]["rp"]["pass"], $properties["database"], $properties["server"], $properties["port"], $properties["sgbd"], $properties["page_encoding"]);
-        $this->oConnection->oBd = $oBD;
-
-        // Récupère l'année
-        $sYear = $this->vmapGet('majic', '"ANNEE_REFERENCE"', array('ANNEE'), '', array('limit' => 1))[0]['ANNEE'];
-
-        if (strlen($sYear) < 1) {
-            http_response_code(500);
-            writeToErrorLog("Impossible de récupérer l'année de référence dans le schema Majic");
-            $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-            return json_encode($aReturn);
-        }
-
-        // Récupère le chemin du fichier
-        switch ($sType) {
-            case "tiers" :
-            case "standard" :
-                $fileName = $IDDNUPRO;
-                break;
-
-            case "parcelle" :
-                $fileName = $ID_PAR;
-                break;
-        }
-
-        $filePath = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . '/' . $sType . '/' . $fileName . ".pdf";
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"]))
-            @mkdir($properties["cadastre"]["rp"]["rp_dir"]);
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear))
-            @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear);
-        if (!file_exists($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . '/' . $sType))
-            @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . '/' . $sType);
-
-
-        if (file_exists($filePath)) {
-            $aReturn['data']['releveDePropriete'] = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/cadastre/downloadrapport?sYear=' . $sYear . '&sType=' . $sType . '&sFileName=' . urlencode($fileName) . '.pdf';
-            $aReturn['data']['alreadyExists'] = true;
-        } else {
-            if (!file_exists($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear)) {
-                if (@mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear)) {
-                    @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/standard");
-                    @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/tiers");
-                    @mkdir($properties["cadastre"]["rp"]["rp_dir"] . "/" . $sYear . "/parcelle");
-                } else {
-                    http_response_code(500);
-                    writeToErrorLog("Erreur lors de la création des répertoires de l'année courante pour les relevés de propriété.");
-                    $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-                    return json_encode($aReturn);
-                }
-            }
-
-            // Création d'un nouvel objet Relevé de Propriété
-            switch ($sType) {
-                case "tiers" :
-                case "standard" :
-                    require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/majic_lib/Mj_Compte_Communal.class.inc';
-                    $oRP = new Mj_Compte_Communal($IDDNUPRO, $oBD);
-                    if ($oRP->isError()) {
-                        http_response_code(500);
-                        writeToErrorLog("Erreur lors de l'extraction des données Majic.");
-                        $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-                        return json_encode($aReturn);
-                    } else {
-                        if ($sType === "tiers") {
-                            $sDir = $sYear . "/tiers/";
-                        } else {
-                            $sDir = $sYear . "/standard/";
-                        }
-                        $sFile = str_replace("*", "~", $IDDNUPRO);
-                    }
-                    break;
-
-                case "parcelle" :
-                    require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/majic_lib/Mj_Compte_Communal_Parcelle.class.inc';
-                    $oRP = new Mj_Compte_Communal_Parcelle("", $ID_PAR, $oBD);
-                    if ($oRP->isError()) {
-                        http_response_code(500);
-                        writeToErrorLog("Erreur lors de l'extraction des données Majic.");
-                        $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-                        return json_encode($aReturn);
-                    } else {
-                        $sDir = $sYear . "/parcelle/";
-                        $sFile = str_replace("*", "~", $ID_PAR);
-                    }
-                    break;
-            }
-            if (!$bError) {
-                $sXMLFile = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sDir . $sFile . ".xml";
-                if ($sType === "tiers") {
-                    $sXSLFile = dirname($_SERVER['SCRIPT_FILENAME']) . '/class/majic_lib/xsl/Mj_fo_tiers.xsl';
-                } else {
-                    $sXSLFile = dirname($_SERVER['SCRIPT_FILENAME']) . '/class/majic_lib/xsl/Mj_fo.xsl';
-                }
-                $sPDFFile = $properties["cadastre"]["rp"]["rp_dir"] . "/" . $sDir . $sFile . ".pdf";
-
-                if (!file_exists($sPDFFile)) {
-                    $oRP->asXMLFile("", $sXMLFile, "Mj");
-                }
-
-                $sCommand = $properties["fop_root_dir"] . "/fop -xml " . $sXMLFile . " -xsl " . $sXSLFile . " -pdf " . $sPDFFile;
-
-                exec($sCommand, $aCommand, $iResult);
-
-                if (!$iResult) {
-                    $aReturn['data']['releveDePropriete'] = $properties['web_server_name'] . '/' . $properties['services_alias'] . '/cadastre/downloadrapport?sYear=' . $sYear . '&sType=' . $sType . '&sFileName=' . urlencode($sFile) . '.pdf';
-                } else {
-                    writeToErrorLog("Erreur lors de la génération du fichier PDF de relevé de propriété :");
-                    writeToErrorLog("Ligne de commande : " . $sCommand);
-                    writeToErrorLog("Message d'erreur : ");
-                    foreach ($aCommand as $sValeur) {
-                        writeToErrorLog($sValeur);
-                    }
-                    http_response_code(500);
-                    writeToErrorLog("Erreur lors de la génération du fichier PDF de relevé de propriété.");
-                    $aReturn['error']['errorMessage'] = "Erreur lors de la génération du fichier PDF de relevé de propriété.";
-                    return json_encode($aReturn);
-                }
-            }
-        }
-
-        return json_encode($aReturn);
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Sections.class.inc b/web_service/ws/Sections.class.inc
deleted file mode 100755
index 9b94963a1e9982c5fe479c0d4a3926ea91369363..0000000000000000000000000000000000000000
--- a/web_service/ws/Sections.class.inc
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-/**
- * \file Sections.class.inc
- * \class Sections
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Sections php class
- *
- * This class defines Rest Api to Vmap Sections
- * 
- */
-require_once 'Cadastre.class.inc';
-require_once 'Section.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
-
-class Sections extends Cadastre {
-    /**
-     * @SWG\Definition(
-     *   definition="/sections",
-     *   allOf={
-     *     @SWG\Schema(ref="#/definitions/sections")
-     *   }
-     * )
-     * * @SWG\Tag(
-     *   name="sections",
-     *   description="Operations about sections"
-     * )
-     */
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "id_sec", "code_com", "commune", "replace(pre, '000', '')||replace(section, '0', '') as section", "pre", "idu", "tex", "texte", "geom");
-    }
-
-    //(pre, '000', '')||replace(section, '0', '') as section
-    /**
-     * @SWG\Get(path="/sections",
-     *   tags={"Section"},
-     *   summary="Get Sections",
-     *   description="Request to get Sections",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="order_by",
-     *     in="query",
-     *     description="list of ordering fields",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="sort_order",
-     *     in="query",
-     *     description="sort order",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="limit",
-     *     in="query",
-     *     description="number of element",
-     *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="offset",
-     *     in="query",
-     *     description="index of first element",
-     *     required=false,
-     *     type="string",
-     *     format="int32"
-     *   ),
-     * @SWG\Parameter(
-     *     name="attributs",
-     *     in="query",
-     *     description="list of attributs",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="filter",
-     *     in="query",
-     *     description="filter results",
-     *     required=false,
-     *     type="string"
-     *   ),
-     * @SWG\Parameter(
-     *     name="distinct",
-     *     in="query",
-     *     description="delete duplicates",
-     *     required=false,
-     *     type="boolean"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/sections")
-     *     )
-     *  )
-     */
-
-    /**
-     * get Sections
-     * @return  Sections
-     */
-    function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['section'], 'id_sec');
-        return $aReturn['sMessage'];
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/Service.class.inc b/web_service/ws/Service.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..3c74a25bdffbc0d90ea4cad2e60e8eb531b8bb88
--- /dev/null
+++ b/web_service/ws/Service.class.inc
@@ -0,0 +1,96 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Service.class.inc
+ * \class Service
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Service php class
+ *
+ * This class defines operation for one Service
+ * 
+ */
+class Service extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("service_id", "name", "service_type_id", "description", "url", "key", "thumbnail", "lang", "imagery", "service_type_version", "service_type_type", "service_options", "service_vm4ms", "service_login", "service_password");
+    }
+
+    /**
+     * @SWG\Get(path="/services/{service_id}", 
+     *   tags={"Services"},
+     *   summary="Get Service",
+     *   description="Request to get Service by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="service_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about Service
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'service', 'service_id');
+
+        // Remplace les balises
+        $this->aFields['url'] = str_replace('[ms_cgi_url]', $this->aProperties['ms_cgi_url'], $this->aFields['url']);
+    }
+
+    /**
+     * delete a theme
+     */
+    function DELETE() {
+        // Supprime la vignette.
+        $oService = new Service($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+        $oService->GET();
+        if (!empty($oService->aFields['thumbnail'])) {
+            $sFile = $oService->aProperties['dir_export'] . '/vmap/' . $oService->aFields['thumbnail'];
+            if (file_exists($sFile))
+                unlink($sFile);
+        }
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'service', 'service_id', $this->aValues['my_vitis_id'], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields['theme_id'] = $this->aValues['my_vitis_id'];
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/Parcelle.class.inc b/web_service/ws/ServiceType.class.inc
similarity index 53%
rename from web_service/ws/Parcelle.class.inc
rename to web_service/ws/ServiceType.class.inc
index 876bd73b88aa3226c52cc80a4ff623bf880af4d1..5ac6cf029f31c418bc0a11ece8673a7320c8e026 100755
--- a/web_service/ws/Parcelle.class.inc
+++ b/web_service/ws/ServiceType.class.inc
@@ -1,20 +1,20 @@
 <?php
 
-require_once 'Cadastre.class.inc';
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 
 /**
- * \file Parcelle.class.inc
- * \class Parcelle
+ * \file ServiceType.class.inc
+ * \class ServiceType
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Parcelle php class
+ * \brief This file contains the ServiceType php class
  *
- * This class defines operation for one Parcelle
+ * This class defines operation for one ServiceType
  * 
  */
-class Parcelle extends Cadastre {
+class ServiceType extends Vmap {
 
     public $oError;
 
@@ -28,14 +28,14 @@ class Parcelle extends Cadastre {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "id_sec", "code_com", "commune", "parcelle", "section", "pre", "coar", "codm", "indp", "idu", "id_par", "sup_fiscale", "numero", "feuille", "geom");
+        $this->aSelectedFields = Array("service_type_id");
     }
 
     /**
-     * @SWG\Get(path="/parcelles/{id_par}", 
-     *   tags={"Parcelle"},
-     *   summary="Get Parcelle",
-     *   description="Request to get Parcelle by id",
+     * @SWG\Get(path="/servicetypes/{service_type_id}", 
+     *   tags={"ServiceTypes"},
+     *   summary="Get ServiceType",
+     *   description="Request to get ServiceType by id",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -46,29 +46,26 @@ class Parcelle extends Cadastre {
      *     type="string"
      *   ),
      *   @SWG\Parameter(
-     *     name="id_par",
+     *     name="service_type_id",
      *     in="path",
-     *     description="parcelle id",
+     *     description="",
      *     required=true,
-     *     type="integer",
-     *   format="int32"
+     *     type="integer"
      *   ),
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/parcelles")
+     *         @SWG\Schema(ref="#/definitions/servicetypes")
      *     )
      *  )
      */
 
     /**
-     * get informations about Parcelle
+     * get informations about servicetypes
      */
     function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['parcelle'], 'id_par');
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'rt_service_type', 'service_type_id');
     }
-
 }
-
 ?>
\ No newline at end of file
diff --git a/web_service/ws/Communes.class.inc b/web_service/ws/ServiceTypes.class.inc
similarity index 70%
rename from web_service/ws/Communes.class.inc
rename to web_service/ws/ServiceTypes.class.inc
index 88a95ecb63638a3f746589bb8321d9c253e8d7d5..209d7c640425e8b86bd7e7e88c5c69f2bea74df8 100755
--- a/web_service/ws/Communes.class.inc
+++ b/web_service/ws/ServiceTypes.class.inc
@@ -1,32 +1,32 @@
 <?php
 
 /**
- * \file Communes.class.inc
- * \class Communes
+ * \file ServiceTypes.class.inc
+ * \class ServiceTypes
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Communes php class
+ * \brief This file contains the ServiceTypes php class
  *
- * This class defines Rest Api to Vmap Communes
+ * This class defines Rest Api to Vmap ServiceTypes
  * 
  */
-require_once 'Cadastre.class.inc';
-require_once 'Commune.class.inc';
+require_once 'Vmap.class.inc';
+require_once 'ServiceType.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
 
-class Communes extends Cadastre {
+class ServiceTypes extends Vmap {
     /**
      * @SWG\Definition(
-     *   definition="/communes",
+     *   definition="/servicetypes",
      *   allOf={
-     *     @SWG\Schema(ref="#/definitions/communes")
+     *     @SWG\Schema(ref="#/definitions/servicetypes")
      *   }
      * )
      * * @SWG\Tag(
-     *   name="Communes",
-     *   description="Operations about cadastre"
+     *   name="ServiceTypes",
+     *   description=""
      * )
      */
 
@@ -40,14 +40,14 @@ class Communes extends Cadastre {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "code_com", "nom", "geom");
+        $this->aSelectedFields = Array("service_type_id");
     }
 
     /**
-     * @SWG\Get(path="/communes",
-     *   tags={"Commune"},
-     *   summary="Get Communes",
-     *   description="Request to get Communes",
+     * @SWG\Get(path="/servicetypes",
+     *   tags={"ServiceTypes"},
+     *   summary="Get ServiceTypes",
+     *   description="Request to get ServiceTypes",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -76,17 +76,14 @@ class Communes extends Cadastre {
      *     in="query",
      *     description="number of element",
      *     required=false,
-     *     type="integer",
-     *     default="4",
-     *     format="int32"
+     *     type="integer"
      *   ),
      * @SWG\Parameter(
      *     name="offset",
      *     in="query",
      *     description="index of first element",
      *     required=false,
-     *     type="string",
-     *     format="int32"
+     *     type="string"
      *   ),
      * @SWG\Parameter(
      *     name="attributs",
@@ -112,20 +109,18 @@ class Communes extends Cadastre {
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/communes")
+     *         @SWG\Schema(ref="#/definitions/servicetypes")
      *     )
      *  )
      */
 
     /**
-     * get Communes
-     * @return  Communes
+     * get ServiceTypes
+     * @return the array of objects
      */
     function GET() {
-        $aReturn = $this->genericGet('public', $this->aProperties['cadastre']['views']['commune'], 'id_com');
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'rt_service_type', 'service_type_id');
         return $aReturn['sMessage'];
     }
-
 }
-
 ?>
\ No newline at end of file
diff --git a/web_service/ws/Services.class.inc b/web_service/ws/Services.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..d5e8deda7e33af0f4f91e3d230c1ebe0488fbeeb
--- /dev/null
+++ b/web_service/ws/Services.class.inc
@@ -0,0 +1,493 @@
+<?php
+
+/**
+ * \file Services.class.inc
+ * \class Services
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the Services php class
+ *
+ * This class defines Rest Api to Vmap Services
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'Service.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class Services extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/services",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/services")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Services",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("service_id", "name", "service_type_id", "description", "url", "key", "thumbnail", "lang", "imagery", "service_type_version", "service_type_type", "service_options", "service_vm4ms", "service_login", "service_password");
+    }
+
+    /**
+     * @SWG\Get(path="/services",
+     *   tags={"Services"},
+     *   summary="Get Services",
+     *   description="Request to get Services",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Services
+     * @return  Services
+     */
+    function GET() {
+        $this->genericGet($this->aProperties['schema_vmap'], 'service', 'service_id', false, 'vmap_admin_map_vmap_services');
+
+        // Remplace les balises
+        for ($i = 0; $i < count($this->aObjects); $i++) {
+            if (!empty($this->aObjects[$i]->aFields['url'])) {
+                $this->aObjects[$i]->aFields['url'] = str_replace('[ms_cgi_url]', $this->aProperties['ms_cgi_url'], $this->aObjects[$i]->aFields['url']);
+            }
+        }
+
+        // Reformatte la réponse 
+        if (isset($this->aValues['sEncoding'])) {
+            $sEncoding = $this->aValues['sEncoding'];
+        } else {
+            $sEncoding = null;
+        }if (isset($this->aValues['sSourceEncoding'])) {
+            $sSourceEncoding = $this->aValues['sSourceEncoding'];
+        } else {
+            $sSourceEncoding = null;
+        }if (isset($this->aValues['output'])) {
+            $output = $this->aValues['output'];
+        } else {
+            $output = null;
+        }
+        $aXmlRacineAttribute['status'] = 1;
+        $sMessage = $this->asDocument('', 'vitis', $sEncoding, True, $aXmlRacineAttribute, $sSourceEncoding, $output);
+        $aReturn = array('sStatus' => $aXmlRacineAttribute['status'], "sMessage" => $sMessage);
+
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Post(path="/services",
+     *   tags={"Services"},
+     *   summary="Add service",
+     *   description="Request to add a service",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   consumes= { "multipart/form-data"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="formData",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="service_type_id",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="url",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="key",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="service_type_version",
+     *     in="formData",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="thumbnail",
+     *     in="formData",
+     *     description="Thumbnail of the service",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     )
+     *
+     *  )
+     * 
+     * )
+     */
+
+    /**
+     * insert service
+     * @return array containing the status and the message
+     */
+    function POST() {
+
+        // Vignette à uploader ?
+        if (!empty($_FILES['thumbnail'])) {
+            // la colonne thumbnail vaudra le nom du fichier
+            $this->aValues["thumbnail"] = $_FILES['thumbnail']["name"];
+        }
+
+        // Redimmensionnement de l'image.
+        if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+            // Renomme l'image en jpg
+            $aPointsArray = explode('.', $this->aValues["thumbnail"]);
+            $aPointsArray[count($aPointsArray) - 1] = 'jpg';
+            $this->aValues["thumbnail"] = join('.', $aPointsArray);
+        }
+
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'service', $this->aProperties['schema_vmap'] . '.seq_common', 'service_id');
+
+        // Vignette à uploader ?
+        if (!empty($_FILES['thumbnail'])) {
+            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_services/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $_FILES['thumbnail']["name"];
+
+            // Crée les répertoires si ils n'existent pas
+            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_services', $this->aValues["my_vitis_id"]);
+            $sDirColumnPath = $sDirPath . '/thumbnail';
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
+
+            $sErrorMessage = uploadFile("thumbnail", "", $sImageDir, $_FILES['thumbnail']['size'] + 1);
+
+            if ($sErrorMessage != "") {
+                writeToErrorLog($sErrorMessage);
+            } else {
+                // Redimmensionnement de l'image.
+                if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+                    $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
+                }
+            }
+        }
+
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/services/{service_id}",
+     *   tags={"Services"},
+     *   summary="Update Service",
+     *   description="Request to update service",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="service_id",
+     *     in="path",
+     *     description="",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="service_type_id",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="name",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="description",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="url",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="key",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="service_type_version",
+     *     in="query",
+     *     description="",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="thumbnail",
+     *     in="formData",
+     *     description="Thumbnail of the service",
+     *     required=false,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     ),
+     * 
+     *  )
+     */
+
+    /**
+     * modify service
+     * @return array containing the status and the message
+     */
+    function PUT() {
+        // Vignette à uploader ?
+        if (!empty($this->aValues["thumbnail_file"])) {
+
+            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_services/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $this->aValues["thumbnail_name"];
+
+            // Crée les répertoires si ils n'existent pas
+            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_services', $this->aValues["my_vitis_id"]);
+            $sDirColumnPath = $sDirPath . '/thumbnail';
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
+
+            // la colonne thumbnail vaudra le nom du fichier
+            $this->aValues["thumbnail"] = $this->aValues["thumbnail_name"];
+            $fp = fopen($sImageDir, "w");
+            fwrite($fp, $this->aValues["thumbnail_file"]);
+            fclose($fp);
+
+            // Redimmensionnement de l'image.
+            if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+                $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
+                // Renomme l'image en jpg
+                $aPointsArray = explode('.', $this->aValues["thumbnail"]);
+                $aPointsArray[count($aPointsArray) - 1] = 'jpg';
+                $this->aValues["thumbnail"] = join('.', $aPointsArray);
+            }
+        }
+
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'service', 'service_id');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/services/",
+     *   tags={"Services"},
+     *   summary="delete Service",
+     *   description="Request to delete Service",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="service token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the services",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/services/{service_id}",
+     *   tags={"Services"},
+     *   summary="delete Service",
+     *   description="Request to delete Service",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="service token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="service_id",
+     *     in="path",
+     *     description="id of the service",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/services")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete service
+     * @return id of service deleted or error object if a service is not deleted
+     */
+    function DELETE() {
+        if (!empty($this->aValues['idList'])) {
+            $aIdList = $this->aValues['idList'];
+        }
+        if (!empty($this->aPath['2'])) {
+            $aIdList = $this->aPath['2'];
+            $this->aValues['idList'] = $this->aPath['2'];
+        }
+
+        require $this->sRessourcesFile;
+        $sSql = $aSql['getTotalServiceLayers'];
+        $aSQLParams = array(
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'idList' => array('value' => $aIdList, 'type' => 'group')
+        );
+        $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            if ($this->oConnection->oBd->objetSuivant($resultat)->nb_layers > 0) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                $oError = new VitisError(1, 'ERROR_SERVICE_DELETE_VMAP_MAP_SERVICE');
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            } else {
+                $aReturn = $this->genericDelete($this->aProperties['schema_vmap'], 'service', 'service_id');
+                $sMessage = $aReturn['sMessage'];
+                // Supprime les fichiers uploadés
+                $this->deleteElementsDocuments('vmap_admin_map_vmap_services', $aIdList);
+            }
+            return $sMessage;
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/UserModule.class.inc b/web_service/ws/UserModule.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..0a3b4422e5cb3c5634f2a79362e98b258c801a77
--- /dev/null
+++ b/web_service/ws/UserModule.class.inc
@@ -0,0 +1,70 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file UserModule.class.inc
+ * \class UserModule
+ *
+ * \author Yoann Perollet <yoann.perollet@veremes.com>.
+ *
+ * 	\brief This file contains the UserModule php class
+ *
+ * This class defines operation for one UserModule
+ * 
+ */
+class UserModule extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("module_id", "label", "description", "rolname", "rolname_list");
+    }
+
+    /**
+     * @SWG\Get(path="/usermodules/{module_id}", 
+     *   tags={"Modules"},
+     *   summary="Get UserModule",
+     *   description="Request to get UserModule by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="module_id",
+     *     in="path",
+     *     description="module id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/usermodules")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about usermodule
+     */
+    function GET() {
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'module', 'module_id');
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/UserModules.class.inc b/web_service/ws/UserModules.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..f994b0efce3331fb6dfce60d8199f6f33eaec3ec
--- /dev/null
+++ b/web_service/ws/UserModules.class.inc
@@ -0,0 +1,167 @@
+<?php
+
+/**
+ * \file UserModules.class.inc
+ * \class UserModules
+ *
+ * \author Yoann Perollet <yoann.perollet@veremes.com>.
+ *
+ * 	\brief This file contains the UserModules php class
+ *
+ * This class defines Rest Api to Gtf usermodules
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once 'UserModule.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+
+class UserModules extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/usermodules",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/usermodules")
+     *   }
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("module_id", "label", "description", "rolname", "rolname_list");
+    }
+
+    /**
+     * @SWG\Get(path="/usermodules",
+     *   tags={"Modules"},
+     *   summary="Get User UserModules",
+     *   description="Request to get UserModules",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/usermodules")
+     *     )
+     *  )
+     */
+
+    /**
+     * get UserModules
+     * @return  UserModules
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        // Structure json des modules et leurs paramètres.
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'module', 'module_id');
+        if ($aReturn['sStatus'] == 1) {
+
+            $oUserModules = new stdClass();
+            $oUserModules->usermodules = array();
+
+            if (empty($this->aValues['my_vitis_id'])) {
+                // Nombre d'enregistrements total
+                $oUserModules->total_row_number = $this->aFields['total_row_number'];
+            }
+
+            $iListCount = 0;
+            $oUserModules->status = $aReturn['sStatus'];
+            $aUserModulesIds = [];
+            foreach ($this->aObjects as $oModule) {
+                if (!empty($oModule->aFields['rolname_list'])) {
+                    $aRoleNames = explode('|', $oModule->aFields['rolname_list']);
+                } else {
+                    // Rétrocompatibilité
+                    $aRoleNames = array($oModule->aFields['rolname']);
+                }
+
+                for ($i = 0; $i < count($aRoleNames); $i++) {
+                    if (in_array($aRoleNames[$i], $this->oConnection->aPrivileges)) {
+                        $iListCount++;
+                        $oUserModule = new stdClass();
+                        $oUserModule->infos = new stdClass();
+                        $sModuleId = $oModule->aFields['module_id'];
+                        if (!in_array($sModuleId, $aUserModulesIds)) {
+                            $oUserModule->infos->icon = 'icon-' . $sModuleId;
+                            $oUserModule->infos->image = '';
+                            $oUserModule->infos->tooltip = $oModule->aFields['label'];
+                            $oUserModules->usermodules[] = $oUserModule;
+                            $oUserModule->$sModuleId = new stdClass();
+                            $aUserModulesIds[] = $sModuleId;
+                        }
+                    }
+                }
+            }
+
+            // Nombre d'enregistrements affichés
+            $oUserModules->list_count = $iListCount;
+
+            $this->aFields = $oUserModules;
+
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        } else
+            $sMessage = $aReturn['sMessage'];
+        return $sMessage;
+    }
+
+}
+
+?>
diff --git a/web_service/ws/Section.class.inc b/web_service/ws/UserPrintStyle.class.inc
similarity index 54%
rename from web_service/ws/Section.class.inc
rename to web_service/ws/UserPrintStyle.class.inc
index 83116512f0b0225e7b8b6c12d8673dcb0e4910e8..ad1aa9ced2622cb04061305f15f8f61bd1bc2559 100755
--- a/web_service/ws/Section.class.inc
+++ b/web_service/ws/UserPrintStyle.class.inc
@@ -1,20 +1,20 @@
 <?php
 
-require_once 'Cadastre.class.inc';
+require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 
 /**
- * \file Section.class.inc
- * \class Section
+ * \file UserPrintStyle.class.inc
+ * \class UserPrintStyle
  *
  * \author Armand Bahi <armand.bahi@veremes.com>.
  *
- * \brief This file contains the Section php class
+ * \brief This file contains the UserPrintStyle php class
  *
- * This class defines operation for one Section
+ * This class defines operation for one UserPrintStyle
  * 
  */
-class Section extends Cadastre {
+class UserPrintStyle extends Vmap {
 
     public $oError;
 
@@ -25,18 +25,17 @@ class Section extends Cadastre {
      * @param type $properties properties
      * @param type $bShortcut false to reinit variables
      * @param type $oConnection connection object
-     * @param type $oConnection connection object
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("id_com", "id_sec", "code_com", "commune", "section", "pre", "idu", "tex", "texte", "geom");
+        $this->aSelectedFields = Array("printstyle_id", "name", "definition");
     }
 
     /**
-     * @SWG\Get(path="/sections/{id_sec}", 
-     *   tags={"Section"},
-     *   summary="Get Section",
-     *   description="Request to get Section by id",
+     * @SWG\Get(path="/userprintstyles/{printstyle_id}", 
+     *   tags={"PrintStyles"},
+     *   summary="Get UserPrintStyle",
+     *   description="Request to get UserPrintStyle by id",
      *   operationId="GET",
      *   produces={"application/xml", "application/json", "application/x-vm-json"},
      *   @SWG\Parameter(
@@ -47,29 +46,27 @@ class Section extends Cadastre {
      *     type="string"
      *   ),
      *   @SWG\Parameter(
-     *     name="id_sec",
+     *     name="printstyle_id",
      *     in="path",
-     *     description="section id",
+     *     description="printstyle id",
      *     required=true,
-     *     type="integer",
-     *   format="int32"
+     *     type="integer"
      *   ),
      *   @SWG\Response(
      *         response=200,
      *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/sections")
+     *         @SWG\Schema(ref="#/definitions/userprintstyles")
      *     )
      *  )
      */
 
     /**
-     * get informations about Section
+     * get informations about UserPrintStyle
      */
     function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['section'], 'id_sec');
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_user_printstyle', 'printstyle_id');
+        $this->aFields['definition'] = str_replace(array("\r", "\n", "\t"), '', $this->aFields['definition']);
     }
-
 }
 
 ?>
\ No newline at end of file
diff --git a/web_service/ws/UserPrintStyles.class.inc b/web_service/ws/UserPrintStyles.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..b0d329ce8d094d597d2cb60a3dcb3b16e046551a
--- /dev/null
+++ b/web_service/ws/UserPrintStyles.class.inc
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * \file UserPrintStyles.class.inc
+ * \class UserPrintStyles
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * \brief This file contains the UserPrintStyles php class
+ *
+ * This class defines Rest Api to Vmap UserPrintStyles
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once 'UserPrintStyle.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+class UserPrintStyles extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/userprintstyles",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/printstyles")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="UserPrintStyles",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printstyle_id", "name", "definition");
+    }
+
+    /**
+     * @SWG\Get(path="/userprintstyles",
+     *   tags={"PrintStyles"},
+     *   summary="Get UserPrintStyles",
+     *   description="Request to get UserPrintStyles",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/userprintstyles")
+     *     )
+     *  )
+     */
+
+    /**
+     * get UserPrintStyles
+     * @return  UserPrintStyles
+     */
+    function GET() {
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_user_printstyle', 'printstyle_id');
+
+        if ($aReturn['sStatus'] == 1) {
+            $oUserPrintStyles = new stdClass();
+            $oUserPrintStyles->userprintstyles = array();
+            if (empty($this->aValues['my_vitis_id'])) {
+                $oUserPrintStyles->list_count = $this->aFields['list_count'];
+                $oUserPrintStyles->total_row_number = $this->aFields['total_row_number'];
+            }
+            $oUserPrintStyles->status = $aReturn['sStatus'];
+            foreach ($this->aObjects as $oPrintStyle) {
+                $oUserPrintStyle = new stdClass();
+                if (!empty($oPrintStyle->aFields['printstyle_id'])) {
+                    $oUserPrintStyle->printstyle_id = $oPrintStyle->aFields['printstyle_id'];
+                }
+                if (!empty($oPrintStyle->aFields['name'])) {
+                    $oUserPrintStyle->name = $oPrintStyle->aFields['name'];
+                }
+                if (!empty($oPrintStyle->aFields['definition'])) {
+                    $oUserPrintStyle->definition = $oPrintStyle->aFields['definition'];
+                }
+                $oUserPrintStyles->userprintstyles[] = $oUserPrintStyle;
+            }
+            $this->aFields = $oUserPrintStyles;
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        }
+
+        return $sMessage;
+    }
+
+}
+
+?>
diff --git a/web_service/ws/UserPrintTemplate.class.inc b/web_service/ws/UserPrintTemplate.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..3f1db7b4190dc3422a323250c22318d734c20212
--- /dev/null
+++ b/web_service/ws/UserPrintTemplate.class.inc
@@ -0,0 +1,117 @@
+<?php
+
+require_once 'Vmap.class.inc';
+require_once 'UserPrintTemplates.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file UserPrintTemplate.class.inc
+ * \class UserPrintTemplate
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the UserPrintTemplate php class
+ *
+ * This class defines operation for one UserPrintTemplate
+ * 
+ */
+class UserPrintTemplate extends Vmap {
+
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("printtemplate_id", "name", "rt_format_id", "rt_orientation_id", "definition", "outputformats_id", "sql", "ressource_id", "business_object_id", "printstyles");
+    }
+
+    /**
+     * @SWG\Get(path="/userprinttemplates/{printtemplate_id}", 
+     *   tags={"PrintTemplates"},
+     *   summary="Get UserPrintTemplate",
+     *   description="Request to get UserPrintTemplate by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="printtemplate_id",
+     *     in="path",
+     *     description="printtemplate id",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/userprinttemplates")
+     *     )
+     *  )
+     */
+
+    /**
+     * get informations about userprinttemplate
+     */
+    function GET() {
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_template', 'printtemplate_id');
+//        $this->aFields['definition'] = $this->getPrintTemplateWithStyles();
+        
+        $this->aFields['printstyles'] = $this->getPrintStylesFromUser();
+    }
+
+    /**
+     * Get the printstyles associated to current user
+     * @return array
+     */
+//    function getPrintTemplateWithStyles() {
+//        $aPrintStyles = $this->getPrintStylesFromUser();        
+//        $sPrintStyle = $this->concatPrintStyles($aPrintStyles);        
+//        $sTemplateDefinition = $sPrintStyle . $this->aFields['definition'];
+//        
+//        return $sTemplateDefinition;
+//    }
+
+    /**
+     * Get the printstyles associated to current user
+     * @return array
+     */
+    function getPrintStylesFromUser() {
+        $oUserPrintStyles = new UserPrintStyles($this->aPath, $this->aValues, $this->aProperties);
+        $oUserPrintStyles->aValues['my_vitis_id'] = null;
+        $oUserPrintStyles->aValues['filter'] = '';
+        $oUserPrintStyles->GET();
+
+        $aPrintStyles = $oUserPrintStyles->aFields->userprintstyles;
+
+        return $aPrintStyles;
+    }
+
+    /**
+     * Concat the definitions of the given print styles
+     * @param array $aPrintStyles
+     * @return string
+     */
+//    function concatPrintStyles($aPrintStyles) {
+//        $sPrintStyle = "";
+//        for ($i = 0; $i < count($aPrintStyles); $i++) {
+//            $sPrintStyle .= $aPrintStyles[$i]->definition;
+//        }
+//
+//        return $sPrintStyle;
+//    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/UserPrintTemplates.class.inc b/web_service/ws/UserPrintTemplates.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..61dbbaf7543997da9c3f49447535be353ecd902f
--- /dev/null
+++ b/web_service/ws/UserPrintTemplates.class.inc
@@ -0,0 +1,237 @@
+<?php
+
+/**
+ * \file UserPrintTemplates.class.inc
+ * \class UserPrintTemplates
+ *
+ * \author Yoann Perollet <yoann.perollet@veremes.com>.
+ *
+ * 	\brief This file contains the UserPrintTemplates php class
+ *
+ * This class defines Rest Api to Gtf userprinttemplates
+ *
+ */
+require_once 'Vmap.class.inc';
+require_once 'UserPrintTemplate.class.inc';
+require_once 'UserPrintStyles.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+
+class UserPrintTemplates extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/userprinttemplates",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/userprinttemplates")
+     *   }
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aValues['getGroup'] = true;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+        $this->aSelectedFields = Array("printtemplate_id", "name", "rt_format_id", "rt_orientation_id", "definition", "outputformats_id", "printstyles");
+    }
+
+    /**
+     * @SWG\Get(path="/userprinttemplates",
+     *   tags={"PrintTemplates"},
+     *   summary="Get User UserPrintTemplates",
+     *   description="Request to get UserPrintTemplates",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/userprinttemplates")
+     *     )
+     *  )
+     */
+
+    /**
+     * get UserPrintTemplates
+     * @return  UserPrintTemplates
+     */
+    function GET() {
+        require $this->sRessourcesFile;
+        // Structure json des modèles d'impression et leurs paramètres.
+        $aSesGroup = explode(',', $this->oConnection->sesGroup);
+        for ($i = 0; $i < count($aSesGroup); $i++) {
+            $aSesGroup[$i] = floatval($aSesGroup[$i]);
+        }
+        if (isset($this->aValues['filter']) && !empty($this->aValues['filter'])) {
+            $old_filter = $this->aValues['filter'];
+        } else {
+            $old_filter = '';
+        }
+        $aFilter = array(
+            'relation' => 'AND',
+            'operators' => array(
+                array('column' => 'group_id', 'compare_operator' => 'IN', 'value' => $aSesGroup)
+            )
+        );
+        if (isset($this->aValues['filter']) && $this->aValues['filter'] != "") {
+            array_push($aFilter['operators'], json_decode($this->aValues['filter']));
+        }
+        $this->aValues['filter'] = json_encode($aFilter);
+
+        $aReturn = $this->genericGet($this->aProperties['schema_vmap'], 'v_user_template', 'printtemplate_id');
+        $this->aValues['filter'] = $old_filter;
+
+        if ($aReturn['sStatus'] == 1) {
+
+            // Styles d'impression liés à l'utilisateur
+            $aPrintStyles = $this->getPrintStylesFromUser();
+
+            // Enrichi les objets
+            foreach ($this->aObjects as $key => $oPrintTemplate) {
+
+                if (!empty($oPrintTemplate->aFields['rt_format_id'])) {
+                    $oPrintTemplate->aFields['format'] = $oPrintTemplate->aFields['rt_format_id'];
+                }
+                if (!empty($oPrintTemplate->aFields['rt_orientation_id'])) {
+                    $oPrintTemplate->aFields['orientation'] = $oPrintTemplate->aFields['rt_orientation_id'];
+                }
+                $oPrintTemplate->aFields['printstyles'] = $aPrintStyles;
+                $oPrintTemplate->aFields['variables'] = $this->getPrintTemplateParameters($oPrintTemplate->aFields['printtemplate_id']);
+
+                // Nettoyage
+                if (isset($oPrintTemplate->aFields['rt_format_id'])) {
+                    unset($oPrintTemplate->aFields['rt_format_id']);
+                }
+                if (isset($oPrintTemplate->aFields['rt_orientation_id'])) {
+                    unset($oPrintTemplate->aFields['rt_orientation_id']);
+                }
+            }
+            $aXmlRacineAttribute['status'] = 1;
+            $aReturn['sMessage'] = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        }
+
+
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * Get the printstyles associated to current user
+     * @return array
+     */
+    function getPrintStylesFromUser() {
+        $oUserPrintStyles = new UserPrintStyles($this->aPath, $this->aValues, $this->aProperties);
+        $oUserPrintStyles->aValues['my_vitis_id'] = null;
+        $oUserPrintStyles->aValues['filter'] = '';
+        $oUserPrintStyles->GET();
+
+        $aPrintStyles = $oUserPrintStyles->aFields->userprintstyles;
+
+        return $aPrintStyles;
+    }
+
+    /**
+     * Get the print parameters associated to the print template
+     * @return array
+     */
+    function getPrintTemplateParameters($sPrintTemplateId) {
+        require $this->sRessourcesFile;
+
+        $aVariables = array();
+
+        // Paramètres du modèle d'impression.
+        $sSql = $aSql['getPrintTemplateParameters'];
+        $aSQLParams = array(
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'printtemplate_id' => array('value' => $sPrintTemplateId, 'type' => 'number')
+        );
+        $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            while ($aPrintParameter = $this->oConnection->oBd->ligneSuivante($resultat)) {
+                $oPrintParameter = new stdClass();
+                $oPrintParameter->printtemplate_id = $aPrintParameter['printtemplate_id'];
+                $oPrintParameter->name = $aPrintParameter['name'];
+                $oPrintParameter->editable = $aPrintParameter['editable'];
+                $oPrintParameter->label = $aPrintParameter['label'];
+                $oPrintParameter->description = $aPrintParameter['placeholder'];
+                $oPrintParameter->value = $aPrintParameter['defaultvalue'];
+                $aVariables[] = $oPrintParameter;
+            }
+        }
+
+        return $aVariables;
+    }
+
+    /**
+     * Concat the definitions of the given print styles
+     * @param array $aPrintStyles
+     * @return string
+     */
+//    function concatPrintStyles($aPrintStyles) {
+//
+//        $sPrintStyle = "";
+//        for ($i = 0; $i < count($aPrintStyles); $i++) {
+//            $sPrintStyle .= $aPrintStyles[$i]->definition;
+//        }
+//
+//        return $sPrintStyle;
+//    }
+
+}
+
+?>
diff --git a/web_service/ws/Versions.class.inc b/web_service/ws/Versions.class.inc
index 590e00622dbb1c95900d983006e4fd74a2df5b15..0db8644feefb322a38799677697375dab8d83a48 100755
--- a/web_service/ws/Versions.class.inc
+++ b/web_service/ws/Versions.class.inc
@@ -1,8 +1,8 @@
 <?php
 
-require_once 'Cadastre.class.inc';
+require_once 'Vmap.class.inc';
 /**
-* \file Versions.class.inc
+* \file versions.class.inc
 * \class Versions
 *
 * \author Yoann Perollet <yoann.perollet@veremes.com>.
@@ -64,7 +64,7 @@ class Versions  extends Vmap{
      * @return versions
      */
     function GET(){
-		$this->getVersion("cadastre");
+		$this->getVersion("vmap");
         //$this->aFields = $this->aVersions;
        
         //
diff --git a/web_service/ws/Vex.class.inc b/web_service/ws/Vex.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..af5a0f5926050969a4d370be619b250455eabad3
--- /dev/null
+++ b/web_service/ws/Vex.class.inc
@@ -0,0 +1,513 @@
+<?php
+
+/**
+ * \file Vex.class.inc
+ * \class Vex
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the Vex php class
+ *
+ * This class defines Rest Api to Vitis vex
+ * 
+ */
+require_once 'Vmap.class.inc';
+require_once 'VexExport.class.inc';
+require_once 'VexImport.class.inc';
+require_once 'VexGetter.class.inc';
+require_once 'VexParser.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+class Vex extends Vmap {
+    /**
+     * @SWG\Definition(
+     *   definition="/vex",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/vex")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Vex",
+     *   description=""
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Get(path="/vex",
+     *   tags={"Vex"},
+     *   summary="",
+     *   description="",
+     *   operationId="GET",
+     *   produces={"application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="vex url",
+     *         @SWG\Schema(ref="#/definitions/vex")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/vex/vmap_objects",
+     *   tags={"Vex"},
+     *   summary="Get vMap objects list",
+     *   description="Return the list of maps, calques, business objects and layers",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Web services list",
+     *         @SWG\Schema(ref="#/vex/web_services")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/vex/web_services",
+     *   tags={"Vex"},
+     *   summary="Get web services list",
+     *   description="Return the list of the web services of one or many business objects",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_objects",
+     *     in="query",
+     *     description="business objects list",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Web services list",
+     *         @SWG\Schema(ref="#/vex/web_services")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/vex/sql_objects",
+     *   tags={"Vex"},
+     *   summary="Get avaliable sql objects list",
+     *   description="Return the list of the schemas, tables, views avaliable to dump",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="database",
+     *     in="query",
+     *     description="Database to search in",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Web services list",
+     *         @SWG\Schema(ref="#/vex/web_services")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Get(path="/vex/existing_vmap_objects",
+     *   tags={"Vex"},
+     *   summary="Get existing vMap objects",
+     *   description="Return the list of the existing vMap objects with the same names than those paseed in parametters",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="maps",
+     *     in="query",
+     *     description="Map names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="services",
+     *     in="query",
+     *     description="Service names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="calques",
+     *     in="query",
+     *     description="Calque names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="vm4ms_layers",
+     *     in="query",
+     *     description="Vm4ms Layer names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="business_objects",
+     *     in="query",
+     *     description="Business object names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="events",
+     *     in="query",
+     *     description="Event names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="repports",
+     *     in="query",
+     *     description="Report names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Web services list",
+     *         @SWG\Schema(ref="#/vex/web_services")
+     *     )
+     *  )
+     */
+
+    /**
+     * @SWG\Get(path="/vex/existing_web_services",
+     *   tags={"Vex"},
+     *   summary="Get existing web services",
+     *   description="Return the list of the existing web services with the same names than those paseed in parametters",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="web_services",
+     *     in="query",
+     *     description="Web services names separed by pipes",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Web services list",
+     *         @SWG\Schema(ref="#/vex/web_services")
+     *     )
+     *  )
+     */
+    function GET() {
+        if ($this->aPath[2] === 'vmap_objects') {
+            $oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexGetter->getVMapObjectsList();
+        }
+        if ($this->aPath[2] === 'web_services') {
+            $oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexGetter->getWebServicesList();
+        }
+        if ($this->aPath[2] === 'sql_objects') {
+            $oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexGetter->getSqlObjects();
+        }
+        if ($this->aPath[2] === 'existing_vmap_objects') {
+            $oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexGetter->getExistingVMapObjectsList();
+        }
+        if ($this->aPath[2] === 'existing_web_services') {
+            $oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexGetter->getExistingWebServicesList();
+        }
+    }
+
+    // POST
+
+    /**
+     * @SWG\Post(path="/vex/parse_vex",
+     *   tags={"Vex"},
+     *   summary="Get Vex file contents",
+     *   description="Request to parse the given vex file and get his contents",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="vex_file",
+     *     in="formData",
+     *     description="vex file",
+     *     required=true,
+     *     type="file"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Generated VEX URL",
+     *         @SWG\Schema(ref="#/vex/export_vex")
+     *     )
+     *  )
+     * )
+     */
+    /**
+     * @SWG\Post(path="/vex/export_vex",
+     *   tags={"Vex"},
+     *   summary="Get Vex file",
+     *   description="Request to generate and get a .vex file",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="vmap_objects",
+     *     in="formData",
+     *     description="Maps, calques, business objects in JSON",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="web_services",
+     *     in="formData",
+     *     description="Web services folders names",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="sql_objects",
+     *     in="formData",
+     *     description="Database, schemas, tables, to export in JSON",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Generated VEX URL",
+     *         @SWG\Schema(ref="#/vex/export_vex")
+     *     )
+     *  )
+     * )
+     */
+
+    /**
+     * @SWG\Post(path="/vex/import/vmap_objects",
+     *   tags={"Vex"},
+     *   summary="Import vMap objects",
+     *   description="Request to import .vex vMap object",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="vmap_objects",
+     *     in="formData",
+     *     description="Maps, services, calques, vm4ms_layers, business_objects, business_objects_forms, events, reports definitions in JSON",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="database",
+     *     in="formData",
+     *     description="database",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="schema",
+     *     in="formData",
+     *     description="schema",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="srid",
+     *     in="formData",
+     *     description="srid",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="",
+     *         @SWG\Schema(ref="#/vex/import/vmap_objects")
+     *     )
+     *  )
+     * )
+    /**
+     * @SWG\Post(path="/vex/import/web_services",
+     *   tags={"Vex"},
+     *   summary="Import web services",
+     *   description="Request to import .vex web services",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="web_services",
+     *     in="formData",
+     *     description="Web services content",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="",
+     *         @SWG\Schema(ref="#/vex/import/vmap_objects")
+     *     )
+     *  )
+     * )
+     */
+    /**
+     * @SWG\Post(path="/vex/import/sql",
+     *   tags={"Vex"},
+     *   summary="Import sql",
+     *   description="Request to import .vex SQL",
+     *   operationId="POST",
+     *   produces={"application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="sql_model",
+     *     in="formData",
+     *     description="SQL model",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="sql_data",
+     *     in="formData",
+     *     description="SQL data",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="database",
+     *     in="formData",
+     *     description="Database",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="schema",
+     *     in="formData",
+     *     description="Schema",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *  @SWG\Parameter(
+     *     name="srid",
+     *     in="formData",
+     *     description="SRID",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="",
+     *         @SWG\Schema(ref="#/vex/import/vmap_objects")
+     *     )
+     *  )
+     * )
+     */
+    function POST() {
+        if ($this->aPath[2] === 'parse_vex') {
+            $oVexParser = new VexParser($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexParser->parseVex();
+        }
+        if ($this->aPath[2] === 'export_vex') {
+            $oVexExport = new VexExport($this->aPath, $this->aValues, $this->aProperties);
+            return $oVexExport->exportVex();
+        }
+        if ($this->aPath[2] === 'import') {
+            $oVexImport = new VexImport($this->aPath, $this->aValues, $this->aProperties);
+            if ($this->aPath[3] === 'vmap_objects') {
+                return $oVexImport->importVMapObjects();
+            }
+            if ($this->aPath[3] === 'web_services') {
+                return $oVexImport->importWebServices();
+            }
+            if ($this->aPath[3] === 'sql') {
+                return $oVexImport->importSQL();
+            }
+        }
+    }
+
+    function PUT() {
+        
+    }
+
+    function DELETE() {
+        
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/Vex.class.sql.inc b/web_service/ws/Vex.class.sql.inc
new file mode 100755
index 0000000000000000000000000000000000000000..9ca1e46fecc28754224c1b7c6c71733c4e1575f7
--- /dev/null
+++ b/web_service/ws/Vex.class.sql.inc
@@ -0,0 +1,15 @@
+<?php
+
+$aSql['getAvaliableSRID'] = "SELECT srid from spatial_ref_sys";
+$aSql['getLayers'] = "SELECT * FROM s_vmap.v_layer";
+$aSql['getLayersById'] = "SELECT * FROM s_vmap.v_layer WHERE layer_id IN ([idList])";
+$aSql['getLayersByName'] = "SELECT * FROM s_vmap.v_layer WHERE name IN ([namesList])";
+$aSql['getBusinessObjects'] = "SELECT \"business_object_id\", \"database\", \"schema\", \"table\", \"id_field\" FROM s_vmap.business_object";
+$aSql['getBusinessObjectByIds'] = "SELECT * FROM s_vmap.business_object WHERE business_object_id IN ([idList])";
+$aSql['getGeometryColumns'] = 'SELECT f_geometry_column FROM public.geometry_columns WHERE f_table_schema = \'[sSchemaFramework]\' AND f_table_name = \'[sTable]\'';
+$aSql['updateTableColumnSRID'] = 'SELECT UpdateAndTransformGeometrySRID([sSchema], [sTable], [sColumn], [iSRID]);';
+$aSql['getTables'] = "SELECT tablename, schemaname FROM pg_catalog.pg_tables WHERE schemaname = [sSchema]";
+$aSql['getViews'] = "SELECT viewname, schemaname FROM pg_catalog.pg_views  WHERE schemaname = [sSchema]";
+$aSql['getSequences'] = "SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = [sSchema]";
+
+?>
\ No newline at end of file
diff --git a/web_service/ws/VexExport.class.inc b/web_service/ws/VexExport.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..eed7f7d5b8185a5c8d19b17d10d95d7afc03c272
--- /dev/null
+++ b/web_service/ws/VexExport.class.inc
@@ -0,0 +1,1675 @@
+<?php
+
+/**
+ * \file VexExport.class.inc
+ * \class VexExport
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the VexExport php class
+ *
+ * This class defines php functions to export VEX files
+ *
+ */
+require_once 'Vex.class.inc';
+require_once 'VexGetter.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+/**
+ * Permet l'export de fichiers VEX en utilisant les paramètres
+ * vmap_objects, web_services, sql_objects passés dans $this->aValues
+ */
+class VexExport extends Vmap {
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * Generate a VEX file
+     */
+    function exportVex() {
+
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // OS sur lequel tourne php
+        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+            $this->sOSType = 'windows';
+        } else {
+            echo 'Le serveur ne tourne pas sous Windows !';
+            $this->sOSType = 'linux';
+        }
+
+        // Nom du fichier temporaire
+        $this->sTmpName = $this->UniqFileName();
+
+        // Crée un dossier temporaire de travail
+        $this->sTmpPath = $this->createTmpFolder($this->sTmpName);
+
+        // SQL
+        if (!isset($this->oError) && !isset($this->oConnection->oError) && !$this->oConnection->oBd->enErreur()) {
+            $this->exportSQL();
+        }
+
+        // Objets vMap
+        if (!isset($this->oError) && !isset($this->oConnection->oError) && !$this->oConnection->oBd->enErreur()) {
+            $this->exportVMapObjects();
+        }
+
+        // Services WEB
+        if (!isset($this->oError) && !isset($this->oConnection->oError) && !$this->oConnection->oBd->enErreur()) {
+            $this->exportWebServices();
+        }
+
+        // Crée le fichier VEX
+        if (!isset($this->oError) && !isset($this->oConnection->oError) && !$this->oConnection->oBd->enErreur()) {
+            $this->sVexPath = $this->createVexFile();
+        }
+
+        // Supprime le dossier temporaire de travail
+        $this->deleteTmpFolder($this->sTmpPath);
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (is_file($this->sVexPath)) {
+            $handle = fopen($this->sVexPath, "r");
+            $contents = fread($handle, filesize($this->sVexPath));
+            fclose($handle);
+
+            // Supprime le dossier vex
+            $this->deleteVexFile($this->sVexPath);
+
+            return $contents;
+        } else {
+            $oError = new VitisError(1, 'Impossoble de générer le fichier VEX');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+    }
+
+    /**
+     * Crée un répertoire temporaire
+     * @param string $sName
+     * @return string
+     */
+    function createTmpFolder($sName) {
+        $sTmpPath = $this->aProperties['vas_home'] . '/tmp/' . $sName;
+        if (is_dir($sTmpPath)) {
+            clearDir($sTmpPath);
+        }
+        mkdir($sTmpPath, 0777, true);
+        return $sTmpPath;
+    }
+
+    /**
+     * Supprime le répertoire temporaire
+     * @param string $sTmpPath
+     */
+    function deleteTmpFolder($sTmpPath) {
+        if (is_dir($sTmpPath)) {
+            clearDir($sTmpPath);
+        }
+    }
+
+    /**
+     * Crée le fichier VEX
+     */
+    function createVexFile() {
+        $sVexPath = $this->sTmpPath . '.vex';
+        createZip($this->sTmpPath, $sVexPath);
+        return $sVexPath;
+    }
+
+    /**
+     * Supprime le fichier vex
+     * @param string $sVexPath
+     */
+    function deleteVexFile($sVexPath) {
+        if (is_file($sVexPath)) {
+            @unlink($sVexPath);
+        }
+    }
+
+    // Export SQL
+
+    /**
+     * Exporte le SQL
+     */
+    function exportSQL() {
+
+        if (empty($this->aValues['sql_objects'])) {
+            return false;
+        }
+
+        $aSQLObjects = json_decode($this->aValues['sql_objects'], true);
+
+        if (empty($aSQLObjects)) {
+            return false;
+        }
+        if (empty($aSQLObjects['schemas'])) {
+            return false;
+        }
+
+        /**
+         * Objet VexGetter permettant de recueillir des informations essentielles
+         */
+        $this->oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+
+        // Dossier sql
+        mkdir($this->sTmpPath . '/sql', 0777, true);
+
+        // Liste des schémas utilisés
+        $this->aSchemas = [];
+
+        // Fichier SQl contenant le modèle de données SQL
+        $this->sSqlFileModelPath = $this->sTmpPath . '/sql/export_model_sql.sql';
+        $this->sSqlLogModelPath = $this->sTmpPath . '/sql/export_model_sql.log';
+
+        // Fichier SQl contenant les données SQL
+        $this->sSqlFileDataPath = $this->sTmpPath . '/sql/export_data_sql.sql';
+        $this->sSqlLogDataPath = $this->sTmpPath . '/sql/export_data_sql.log';
+
+        if (!isset($this->oError)) {
+            $this->dumpSqlTables($aSQLObjects);
+        }
+        if (is_file($this->sSqlFileModelPath)) {
+            if (!isset($this->oError)) {
+                $this->makeSQLFileReplacements($this->sSqlFileModelPath, true, true, true);
+            }
+        }
+        if (is_file($this->sSqlFileDataPath)) {
+            if (!isset($this->oError)) {
+                $this->makeSQLFileReplacements($this->sSqlFileDataPath, true);
+            }
+        }
+    }
+
+    /**
+     * Fait un dump des tables demandées
+     *
+     * @param array $aSQLObjects tables à exporter au format suivant:
+     * {
+     *  "type":"database",
+     *  "name":"[database]",
+     *  "schemas":[{
+     *      "type":"schema",
+     *      "name":"[schema1]",
+     *      "tables":["[table1]","[table2]"]
+     *      }]
+     *  }
+     *
+     * @return boolean
+     */
+    function dumpSqlTables($aSQLObjects) {
+
+        $this->dumpSqlTablesModel($aSQLObjects);
+        $this->dumpSqlTablesData($aSQLObjects);
+
+        // Vérifie si le fichier sql a été généré, sinon renvoie false
+        if (!is_file($this->sSqlFileModelPath)) {
+            $sErrorMessage = 'Impossible de récupérer les données SQL';
+
+            if (is_file($this->sSqlLogModelPath)) {
+                $aLogs = file($this->sSqlLogModelPath);
+                $sErrorMessage .= ':<br>';
+                for ($i = 0; $i < count($aLogs); $i++) {
+                    $sErrorMessage .= '<br>' . $aLogs[$i];
+                }
+            }
+
+            $this->oError = new Error($sErrorMessage);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Exporte le modèle de données (sans les données) au format sql
+     * @param array $aSQLObjects
+     */
+    function dumpSqlTablesModel($aSQLObjects) {
+
+        $sLogin = $this->aProperties['owner_login'];
+        $sPassword = $this->aProperties['owner_pass'];
+
+        // Cas particuliers dans les mots de passe
+        $sPassword = str_replace('!', '\!', $sPassword);
+
+        $sDatabase = $this->getDatabaseFromSqlObjects($aSQLObjects);
+        $aTables = $this->getTablesFromSqlObjects($aSQLObjects);
+        $aViews = $this->getViewsFromSqlObjects($aSQLObjects);
+        $aSequences = $this->getSequencesFromSqlObjects($aSQLObjects);
+
+        // Si la base de données ou la liste des tables est vide pas de dump
+        if (empty($sDatabase) || (empty($aTables) && empty($aViews))) {
+            return true;
+        }
+
+        if ($this->sOSType === 'windows') {
+            $sPgDumpCommand = 'set PGPASSWORD="' . $sPassword . '" && ';
+        } else {
+            $sPgDumpCommand = 'export PGPASSWORD="' . $sPassword . '"; ';
+        }
+        $sPgDumpCommand .= $this->aProperties['pg_utils_root_path'] . '/pg_dump';
+        $sPgDumpCommand .= ' --host ' . $this->aProperties['server'];
+        $sPgDumpCommand .= ' --port ' . $this->aProperties['port'];
+        $sPgDumpCommand .= ' --username "' . $sLogin . '"';
+        $sPgDumpCommand .= ' --format plain';
+        $sPgDumpCommand .= ' --section pre-data';
+        $sPgDumpCommand .= ' --section post-data';
+        $sPgDumpCommand .= ' --inserts';
+        $sPgDumpCommand .= ' --column-inserts';
+        $sPgDumpCommand .= ' --verbose';
+        $sPgDumpCommand .= ' --no-owner';
+        $sPgDumpCommand .= ' --no-privileges';
+        $sPgDumpCommand .= ' --file "' . $this->sSqlFileModelPath . '"';
+        for ($i = 0; $i < count($aTables); $i++) {
+            $sPgDumpCommand .= ' --table "' . $aTables[$i] . '"';
+        }
+        for ($i = 0; $i < count($aViews); $i++) {
+            $sPgDumpCommand .= ' --table "' . $aViews[$i] . '"';
+        }
+        for ($i = 0; $i < count($aSequences); $i++) {
+            $sPgDumpCommand .= ' --table "' . $aSequences[$i] . '"';
+        }
+        $sPgDumpCommand .= ' "' . $sDatabase . '"';
+        $sPgDumpCommand .= ' 2> "' . $this->sSqlLogModelPath . '"';
+
+        exec($sPgDumpCommand);
+    }
+
+    /**
+     * Exporte les données uniquement au format sql
+     * @param array $aSQLObjects
+     */
+    function dumpSqlTablesData($aSQLObjects) {
+
+        $sLogin = $this->aProperties['owner_login'];
+        $sPassword = $this->aProperties['owner_pass'];
+
+        // Cas particuliers dans les mots de passe
+        $sPassword = str_replace('!', '\!', $sPassword);
+
+        $sDatabase = $this->getDatabaseFromSqlObjects($aSQLObjects);
+        $aTables = $this->getTablesFromSqlObjects($aSQLObjects, true);
+
+        // Si la base de données ou la liste des tables est vide pas de dump
+        if (empty($sDatabase) || empty($aTables)) {
+            return true;
+        }
+
+        if ($this->sOSType === 'windows') {
+            $sPgDumpCommand = 'set PGPASSWORD="' . $sPassword . '" && ';
+        } else {
+            $sPgDumpCommand = 'export PGPASSWORD="' . $sPassword . '"; ';
+        }
+        $sPgDumpCommand .= $this->aProperties['pg_utils_root_path'] . '/pg_dump';
+        $sPgDumpCommand .= ' --host ' . $this->aProperties['server'];
+        $sPgDumpCommand .= ' --port ' . $this->aProperties['port'];
+        $sPgDumpCommand .= ' --username "' . $sLogin . '"';
+        $sPgDumpCommand .= ' --format plain';
+        $sPgDumpCommand .= ' --data-only';
+        $sPgDumpCommand .= ' --column-inserts';
+        $sPgDumpCommand .= ' --verbose';
+        $sPgDumpCommand .= ' --no-owner';
+        $sPgDumpCommand .= ' --no-privileges';
+        $sPgDumpCommand .= ' --file "' . $this->sSqlFileDataPath . '"';
+        for ($i = 0; $i < count($aTables); $i++) {
+            $sPgDumpCommand .= ' --table "' . $aTables[$i] . '"';
+        }
+        $sPgDumpCommand .= ' "' . $sDatabase . '"';
+        $sPgDumpCommand .= ' 2> "' . $this->sSqlLogDataPath . '"';
+
+        exec($sPgDumpCommand);
+    }
+
+    /**
+     * Récupère le seul nom de base de donnés présent dans $aSQLObjects
+     * @param array $aSQLObjects
+     * @return type
+     */
+    function getDatabaseFromSqlObjects($aSQLObjects) {
+        if ($aSQLObjects['type'] === 'database') {
+            if (!empty($aSQLObjects['name'])) {
+                return $aSQLObjects['name'];
+            }
+        }
+    }
+
+    /**
+     * Récupère les table définies dans $aSQLObjects,
+     * Si $bOnlyData = true alors récupère uniquement celles qui ont de la donnée
+     * @param array $aSQLObjects
+     * @return type
+     */
+    function getTablesFromSqlObjects($aSQLObjects, $bOnlyData = false) {
+        $aTables = [];
+
+        if (is_array($aSQLObjects['schemas'])) {
+            for ($i = 0; $i < count($aSQLObjects['schemas']); $i++) {
+                if ($aSQLObjects['schemas'][$i]['type'] === 'schema') {
+                    if (is_array($aSQLObjects['schemas'][$i]['tables'])) {
+                        for ($ii = 0; $ii < count($aSQLObjects['schemas'][$i]['tables']); $ii++) {
+                            if (!$bOnlyData) {
+                                array_push($aTables, $aSQLObjects['schemas'][$i]['name'] . '.' . $aSQLObjects['schemas'][$i]['tables'][$ii]['name']);
+                            } else {
+                                if ($aSQLObjects['schemas'][$i]['tables'][$ii]['data']) {
+                                    array_push($aTables, $aSQLObjects['schemas'][$i]['name'] . '.' . $aSQLObjects['schemas'][$i]['tables'][$ii]['name']);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return $aTables;
+    }
+
+    /**
+     * Récupère les vues définies dans $aSQLObjects
+     * @param array $aSQLObjects
+     * @return type
+     */
+    function getViewsFromSqlObjects($aSQLObjects) {
+        $aViews = [];
+
+        if (is_array($aSQLObjects['schemas'])) {
+            for ($i = 0; $i < count($aSQLObjects['schemas']); $i++) {
+                if ($aSQLObjects['schemas'][$i]['type'] === 'schema') {
+                    if (is_array($aSQLObjects['schemas'][$i]['views'])) {
+                        for ($ii = 0; $ii < count($aSQLObjects['schemas'][$i]['views']); $ii++) {
+                            array_push($aViews, $aSQLObjects['schemas'][$i]['name'] . '.' . $aSQLObjects['schemas'][$i]['views'][$ii]['name']);
+                        }
+                    }
+                }
+            }
+        }
+
+        return $aViews;
+    }
+
+    /**
+     * Récupère le seul nom de base de donnés présent dans $aSQLObjects
+     * @param array $aSQLObjects
+     * @return type
+     */
+    function getSequencesFromSqlObjects($aSQLObjects) {
+        $aSequences = [];
+
+        if (is_array($aSQLObjects['schemas'])) {
+            for ($i = 0; $i < count($aSQLObjects['schemas']); $i++) {
+                if ($aSQLObjects['schemas'][$i]['type'] === 'schema') {
+                    if (is_array($aSQLObjects['schemas'][$i]['sequences'])) {
+                        for ($ii = 0; $ii < count($aSQLObjects['schemas'][$i]['sequences']); $ii++) {
+                            array_push($aSequences, $aSQLObjects['schemas'][$i]['name'] . '.' . $aSQLObjects['schemas'][$i]['sequences'][$ii]['name']);
+                        }
+                    }
+                }
+            }
+        }
+
+        return $aSequences;
+    }
+
+    /**
+     * Fait les remplacements necessaires au fichier SQL
+     * @param string $sSqlFilePath
+     */
+    function makeSQLFileReplacements($sSqlFilePath, $bReplaceSchema = false, $bReplaceSRID = false, $bAddGrants = false) {
+
+        $aLines = file($sSqlFilePath);
+
+        // Commente la ligne row_security car elle ne fonctionne pas sous pg-9.3
+        for ($i = 0; $i < count($aLines); $i++) {
+            $aLines[$i] = preg_replace("/SET row_security/", "-- SET row_security", $aLines[$i]);
+        }
+
+        // Remplace les différents schémas par [SCHEMA_NAME]
+        if ($bReplaceSchema) {
+            $aLines = $this->replaceSchemasOnLines($aLines);
+        }
+
+        // Ajoute les GRANT [ROLE_USER] et [ROLE_ADMIN]
+        if ($bAddGrants) {
+            $aLines = $this->addGrantsOnLines($aLines);
+        }
+
+        file_put_contents($sSqlFilePath, $aLines);
+    }
+
+    /**
+     * Remplace les différents schémas par [SCHEMA_NAME]
+     * @param array $aLines
+     * @return array
+     */
+    function replaceSchemasOnLines($aLines) {
+
+        $this->aSchemas = array_merge($this->aSchemas, $this->oVexGetter->getSchemasFromLines($aLines));
+
+        for ($i = 0; $i < count($aLines); $i++) {
+            for ($ii = 0; $ii < count($this->aSchemas); $ii++) {
+                if (preg_match("/\b" . $this->aSchemas[$ii] . "\b/", $aLines[$i])) {
+                    $aLines[$i] = preg_replace("/\b" . $this->aSchemas[$ii] . "\b/", "[SCHEMA_NAME]", $aLines[$i]);
+                }
+            }
+        }
+
+        return $aLines;
+    }
+
+    /**
+     * Récupère la liste des SRID évoqués sur les lignes
+     * @param array $aLines
+     * @param array $aAvaliableSRIDs
+     * @return array
+     */
+    function getSRIDsFromLines($aLines, $aAvaliableSRIDs) {
+
+        // Expressions régulières geometry permettant de savoir que le SRID se situe sur la ligne
+        $aGeomRegexps = array(
+            "/\bgeometry\(\b/i",
+            "/\bst_srid\(\b/i",
+        );
+
+        // Liste des SRID
+        $aSRIDs = [];
+
+        // Récupère l'unique SRID utilisé
+        for ($i = 0; $i < count($aLines); $i++) {
+
+            // Vérifie si un des mots clés geometry est renseigné
+            for ($ii = 0; $ii < count($aGeomRegexps); $ii++) {
+                if (preg_match($aGeomRegexps[$ii], $aLines[$i])) {
+
+                    // Vérifie si un des SRID disponibles est sur la ligne
+                    for ($iii = 0; $iii < count($aAvaliableSRIDs); $iii++) {
+                        if (preg_match("/" . $aAvaliableSRIDs[$iii] . "/", $aLines[$i])) {
+
+                            // Ajoute dans la liste des SRID
+                            if (!in_array($aAvaliableSRIDs[$iii], $aSRIDs)) {
+                                array_push($aSRIDs, $aAvaliableSRIDs[$iii]);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return $aSRIDs;
+    }
+
+    /**
+     * Add the grand commands to $aLines
+     * @param array $aLines
+     * @return array
+     */
+    function addGrantsOnLines($aLines) {
+
+        $aGrants = $this->getGrantsForSQLComponent(null, 'SCHEMA');
+        for ($i = 0; $i < count($aGrants); $i++) {
+            array_push($aLines, $aGrants[$i]);
+        }
+
+        $aSQLComponents = $this->oVexGetter->getSQLGrantableObjectsFromLines($aLines);
+
+        for ($i = 0; $i < count($aSQLComponents); $i++) {
+            if (!empty($aSQLComponents[$i]['name']) && !empty($aSQLComponents[$i]['type'])) {
+                $aGrants = $this->getGrantsForSQLComponent($aSQLComponents[$i]['name'], $aSQLComponents[$i]['type']);
+
+                for ($ii = 0; $ii < count($aGrants); $ii++) {
+                    array_push($aLines, $aGrants[$ii]);
+                }
+            }
+        }
+
+        return $aLines;
+    }
+
+    /**
+     * Get a list with the grant commands for the given component
+     * @param string $sName
+     * @param string $sType
+     * @return array
+     */
+    function getGrantsForSQLComponent($sName, $sType) {
+
+        $aGrants = [];
+
+        switch ($sType) {
+            case 'TABLE':
+            case 'VIEW':
+
+                array_push($aGrants, '');
+                array_push($aGrants, '--');
+                array_push($aGrants, '-- GENERATED BY VMAP');
+                array_push($aGrants, '-- Rights on table ' . $sName . '');
+                array_push($aGrants, '--');
+                array_push($aGrants, '');
+                array_push($aGrants, 'ALTER TABLE [SCHEMA_NAME].' . $sName . ' OWNER TO u_vitis;');
+                array_push($aGrants, 'REVOKE ALL ON TABLE [SCHEMA_NAME].' . $sName . ' FROM PUBLIC;');
+                array_push($aGrants, 'REVOKE ALL ON TABLE [SCHEMA_NAME].' . $sName . ' FROM u_vitis;');
+                array_push($aGrants, 'GRANT ALL ON TABLE [SCHEMA_NAME].' . $sName . ' TO u_vitis;');
+                array_push($aGrants, 'GRANT SELECT ON TABLE [SCHEMA_NAME].' . $sName . ' TO [ROLE_USER];');
+                array_push($aGrants, 'GRANT ALL ON TABLE [SCHEMA_NAME].' . $sName . ' TO [ROLE_ADMIN];');
+                array_push($aGrants, '');
+
+                break;
+            case 'SEQUENCE':
+
+                array_push($aGrants, '');
+                array_push($aGrants, '--');
+                array_push($aGrants, '-- GENERATED BY VMAP');
+                array_push($aGrants, '-- Rights on sequence ' . $sName . '');
+                array_push($aGrants, '--');
+                array_push($aGrants, '');
+                array_push($aGrants, 'ALTER SEQUENCE [SCHEMA_NAME].' . $sName . ' OWNER TO u_vitis;');
+                array_push($aGrants, 'REVOKE ALL ON SEQUENCE [SCHEMA_NAME].' . $sName . ' FROM PUBLIC;');
+                array_push($aGrants, 'REVOKE ALL ON SEQUENCE [SCHEMA_NAME].' . $sName . ' FROM u_vitis;');
+                array_push($aGrants, 'GRANT ALL ON SEQUENCE [SCHEMA_NAME].' . $sName . ' TO u_vitis;');
+                array_push($aGrants, 'GRANT SELECT ON SEQUENCE [SCHEMA_NAME].' . $sName . ' TO [ROLE_USER];');
+                array_push($aGrants, 'GRANT ALL ON SEQUENCE [SCHEMA_NAME].' . $sName . ' TO [ROLE_ADMIN];');
+                array_push($aGrants, '');
+
+                break;
+            case 'SCHEMA':
+
+                array_push($aGrants, '');
+                array_push($aGrants, '--');
+                array_push($aGrants, '-- GENERATED BY VMAP');
+                array_push($aGrants, '-- Rights on schema [SCHEMA_NAME]');
+                array_push($aGrants, '--');
+                array_push($aGrants, '');
+                array_push($aGrants, 'ALTER SCHEMA [SCHEMA_NAME] OWNER TO u_vitis;');
+                array_push($aGrants, 'REVOKE ALL ON SCHEMA [SCHEMA_NAME] FROM PUBLIC;');
+                array_push($aGrants, 'REVOKE ALL ON SCHEMA [SCHEMA_NAME] FROM u_vitis;');
+                array_push($aGrants, 'GRANT ALL ON SCHEMA [SCHEMA_NAME] TO u_vitis;');
+                array_push($aGrants, 'GRANT USAGE ON SCHEMA [SCHEMA_NAME] TO [ROLE_USER];');
+                array_push($aGrants, 'GRANT ALL ON SCHEMA [SCHEMA_NAME] TO [ROLE_ADMIN];');
+                array_push($aGrants, '');
+
+                break;
+            default:
+                break;
+        }
+
+        for ($i = 0; $i < count($aGrants); $i++) {
+            $aGrants[$i] .= PHP_EOL;
+        }
+
+        return $aGrants;
+    }
+
+    // Objets vMap
+
+    /**
+     * Exporte les objets vMap (cartes, calques, objets métiers, couches)
+     * ainsi que leur dépendances (services, layertheme, evenements, rapports, map_layer)
+     */
+    function exportVMapObjects() {
+
+        // Dossier vmap_objects
+        mkdir($this->sTmpPath . '/vmap_objects', 0777, true);
+
+        $aVMapObjects = json_decode($this->aValues['vmap_objects'], true);
+
+        $this->aOidCounter = 0;
+        $this->aOids = [];
+
+        // Cartes
+        if (!empty($aVMapObjects['maps'])) {
+            $this->exportVMapMaps($aVMapObjects['maps']);
+        }
+
+        // Calques
+        if (!empty($aVMapObjects['calques'])) {
+            $this->exportVMapCalques($aVMapObjects['calques']);
+        }
+
+        // Couches mapserver
+        if (!empty($aVMapObjects['vm4ms_layers'])) {
+            $this->exportVMapVm4msLayers($aVMapObjects['vm4ms_layers']);
+        }
+
+        // Objet métier
+        if (!empty($aVMapObjects['business_objects'])) {
+            $this->exportVMapBusinessObjects($aVMapObjects['business_objects']);
+        }
+
+        // Services
+        if (!empty($this->aExportedCalques)) {
+            $this->exportVMapServices();
+        }
+
+        // Themes de calques
+        if (!empty($this->aExportedCalques)) {
+            $this->exportVMapCalqueThemes();
+        }
+
+        // Événements objets métier
+        if (!empty($this->aExportedBusinessObjects)) {
+            $this->exportVMapEvents();
+        }
+
+        // Rapports objets métier
+        if (!empty($this->aExportedBusinessObjects)) {
+            $this->exportVMapReports();
+        }
+
+        // Relations calques / cartes
+        if (!empty($this->aExportedCalques) && !empty($this->aExportedMaps)) {
+            $this->exportVMapCalqueMapRelations();
+        }
+
+        // Remplace les identifiants par les OID
+        $this->manageVMapObjectDependencies();
+
+        // Écrit les définitions dans les fichiers JSON
+        $this->generateDefinitionFiles();
+    }
+
+    /**
+     * Gen an oid from a type and an id
+     * @param string $sType maps, calque, vm4ms_layer etc..
+     * @param string $sId
+     * @return string
+     */
+    function generateOid($sType, $sId) {
+        $sOid = 'vex_export_oid_' . $this->aOidCounter;
+        $this->aOids[$sType][$sOid] = $sId;
+        $this->aOidCounter++;
+        return $sOid;
+    }
+
+    /**
+     * Exporte les définitions des cartes dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapMaps($aMapIds) {
+        $this->aExportedMaps = $this->getVMapMapsDefByIds($aMapIds);
+    }
+
+    /**
+     * Récupère les définitions des cartes en fonction des identifiants passés
+     * @param array $aMapIds
+     * @return array
+     */
+    function getVMapMapsDefByIds($aMapIds) {
+        require_once 'Maps.class.inc';
+
+        if (empty($aMapIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'map_id',
+            'compare_operator' => 'IN',
+            'value' => $aMapIds,
+        );
+
+        // Valeurs à ne pas importer
+        $aUnusedValues = [
+            'crs_name',
+            'catalog_index',
+            'thumbnail',
+            'theme_name',
+            'theme_description',
+            'maptheme_id'
+        ];
+
+        $aPath = ['vmap', 'maps'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oMaps = new Maps($aPath, $aValues, $this->aProperties);
+        $oMaps->GET();
+
+        $aMaps = array();
+        if (!empty($oMaps->aObjects)) {
+            for ($i = 0; $i < count($oMaps->aObjects); $i++) {
+                if (!empty($oMaps->aObjects[$i]->aFields)) {
+                    array_push($aMaps, $oMaps->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        // Drop unsused values
+        for ($i = 0; $i < count($aMaps); $i++) {
+            foreach ($aMaps[$i] as $key => $value) {
+                if (in_array($key, $aUnusedValues)) {
+                    unset($aMaps[$i][$key]);
+                }
+            }
+        }
+
+        // oids
+        for ($i = 0; $i < count($aMaps); $i++) {
+            $aMaps[$i]['map_id'] = $this->generateOid('map', $aMaps[$i]['map_id']);
+        }
+
+        return $aMaps;
+    }
+
+    /**
+     * Exporte les définitions des calques dans le fichier JSON correspondant
+     * @param array $aCalqueIds
+     */
+    function exportVMapCalques($aCalqueIds) {
+        $this->aExportedCalques = $this->getVMapCalquesDefByIds($aCalqueIds);
+    }
+
+    /**
+     * Récupère les définitions des calques en fonction des identifiants passés
+     * @param array $aCalqueIds
+     * @return array
+     */
+    function getVMapCalquesDefByIds($aCalqueIds) {
+        require 'Vex.class.sql.inc';
+
+        if (empty($aCalqueIds)) {
+            return array();
+        }
+
+        // Valeurs à ne pas importer
+        $aUnusedValues = [
+            'theme_name',
+            'service_name',
+            'service_type_id',
+            'service_url',
+            'service_key',
+            'service_type_version',
+            'service_thumbnail',
+            'service_lang',
+            'service_imagery',
+            'service_type_type',
+            'service_options',
+            'service_login',
+            'service_password',
+        ];
+
+        $aCalques = array();
+        $aParams = array();
+        $aParams['idList'] = array('value' => implode('|', $aCalqueIds), 'type' => 'group');
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getLayersById'], $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aCalques = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        // Drop unsused values
+        for ($i = 0; $i < count($aCalques); $i++) {
+            foreach ($aCalques[$i] as $key => $value) {
+                if (in_array($key, $aUnusedValues)) {
+                    unset($aCalques[$i][$key]);
+                }
+            }
+        }
+
+        for ($i = 0; $i < count($aCalques); $i++) {
+
+            // Oid
+            $sOid = $this->generateOid('calque', $aCalques[$i]['layer_id']);
+
+            // Formulaires
+            if ($aCalques[$i]['is_bo_filtered']) {
+                if (!is_dir($this->sTmpPath . '/vmap_objects/calques_forms')) {
+                    mkdir($this->sTmpPath . '/vmap_objects/calques_forms', 0777, true);
+                }
+                mkdir($this->sTmpPath . '/vmap_objects/calques_forms/' . $sOid, 0777, true);
+                $sFormsDir = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $aCalques[$i]['layer_id'] . '/forms';
+                if (is_dir($sFormsDir)) {
+                    copyDirectory($sFormsDir, $this->sTmpPath . '/vmap_objects/calques_forms/' . $sOid);
+                }
+            }
+
+            $aCalques[$i]['layer_id'] = $sOid;
+        }
+
+        return $aCalques;
+    }
+
+    /**
+     * Exporte les définitions des couches mapserver dans le fichier JSON correspondant
+     * @param array $aVm4msLayerIds
+     */
+    function exportVMapVm4msLayers($aVm4msLayerIds) {
+        $this->aExportedVm4msLayers = $this->getVMapVm4msLayersDefByIds($aVm4msLayerIds);
+    }
+
+    /**
+     * Récupère les définitions des couches mapserver en fonction des identifiants passés
+     * @param array $aVm4msLayerIds
+     * @return array
+     */
+    function getVMapVm4msLayersDefByIds($aVm4msLayerIds) {
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/Layers.class.inc';
+
+        if (empty($aVm4msLayerIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'name',
+            'compare_operator' => 'IN',
+            'value' => $aVm4msLayerIds,
+        );
+
+        // Valeurs à ne pas importer
+        $aUnusedValues = [
+            'coordsys_label',
+            'source_id',
+            'private_connection',
+            'connection_label',
+            'source_label',
+            'definitiontmp',
+            'metadata_id',
+            'definition_structure_valid'
+        ];
+
+        $aPath = ['vmap', 'layers'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oVm4msLayers = new Layers($aPath, $aValues, $this->aProperties);
+        $oVm4msLayers->GET();
+
+        $aVm4msLayers = array();
+        if (!empty($oVm4msLayers->aObjects)) {
+            for ($i = 0; $i < count($oVm4msLayers->aObjects); $i++) {
+                if (!empty($oVm4msLayers->aObjects[$i]->aFields)) {
+                    array_push($aVm4msLayers, $oVm4msLayers->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        for ($i = 0; $i < count($aVm4msLayers); $i++) {
+
+            // Set private connection and schema name
+            $aVm4msLayers[$i]['connection_id'] = '[PRIVATE_CONNECTION]';
+            $aVm4msLayers[$i]['tableschema'] = '[SCHEMA_NAME]';
+            $aVm4msLayers[$i]['coordsys_id'] = '[SRID]';
+
+            // Put the metadata in the definition (metadata is not exported)
+            if (!empty($aVm4msLayers[$i]['metadata_id'])) {
+                $aMetadata = $this->getVMapVm4msMetadataDefById($aVm4msLayers[$i]['metadata_id']);
+                if (!empty($aMetadata['definition'])) {
+                    $aVm4msLayers[$i]['definition'] = str_replace("{METADATA}", $aMetadata['definition'], $aVm4msLayers[$i]['definition']);
+                }
+            }
+
+            // Drop unsused values
+            foreach ($aVm4msLayers[$i] as $key => $value) {
+                if (in_array($key, $aUnusedValues)) {
+                    unset($aVm4msLayers[$i][$key]);
+                }
+            }
+        }
+
+        // oids
+        for ($i = 0; $i < count($aVm4msLayers); $i++) {
+            $aVm4msLayers[$i]['ms_layer_id'] = $this->generateOid('vm4ms_layer', $aVm4msLayers[$i]['ms_layer_id']);
+        }
+
+        return $aVm4msLayers;
+    }
+
+    /**
+     * Get the Vm4ms Metadata definition from his ID
+     * @param string $sMetadataId
+     * @return array
+     */
+    function getVMapVm4msMetadataDefById($sMetadataId) {
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/Metadata.class.inc';
+
+        $aPath = ['vmap', 'metadata', $sMetadataId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sMetadataId
+        );
+
+        $oVm4msMetadata = new Metadata($aPath, $aValues, $this->aProperties);
+        $oVm4msMetadata->GET();
+
+        return $oVm4msMetadata->aFields;
+    }
+
+    /**
+     * Exporte les définitions des objets métiers dans le fichier JSON correspondant
+     * @param array $aBusinessObjectIds
+     */
+    function exportVMapBusinessObjects($aBusinessObjectIds) {
+
+        // Définitions
+        $this->aExportedBusinessObjects = $this->getVMapBusinessObjectDefById($aBusinessObjectIds);
+
+        // Formulaires
+        if (count($this->aExportedBusinessObjects) > 0) {
+            $this->exportVMapBusinessObjectsForms($this->aExportedBusinessObjects);
+        }
+
+        // Remplacements balises
+        for ($i = 0; $i < count($this->aExportedBusinessObjects); $i++) {
+            $this->aExportedBusinessObjects[$i] = $this->makeVMapBusinessObjectReplacements($this->aExportedBusinessObjects[$i]);
+        }
+    }
+
+    /**
+     * Exporte les formulaires des objets métiers
+     * @param array $aBusinessObjects
+     */
+    function exportVMapBusinessObjectsForms($aBusinessObjects) {
+
+        mkdir($this->sTmpPath . '/vmap_objects/business_objects_forms', 0777, true);
+        for ($i = 0; $i < count($aBusinessObjects); $i++) {
+            mkdir($this->sTmpPath . '/vmap_objects/business_objects_forms/' . $aBusinessObjects[$i]['business_object_id'], 0777, true);
+            $sFormsDir = $this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $aBusinessObjects[$i]['business_object_id'] . '/forms';
+            if (is_dir($sFormsDir)) {
+                copyDirectory($sFormsDir, $this->sTmpPath . '/vmap_objects/business_objects_forms/' . $aBusinessObjects[$i]['business_object_id']);
+            }
+        }
+    }
+
+    /**
+     * Récupère la définition d'un objet métier par son id
+     * @param string $sBusinessObjectIds
+     * @return array
+     */
+    function getVMapBusinessObjectDefById($sBusinessObjectIds) {
+        require 'Vex.class.sql.inc';
+
+        $aBusinessObjects = false;
+        $aParams = array();
+        $aParams['idList'] = array('value' => implode('|', $sBusinessObjectIds), 'type' => 'group');
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getBusinessObjectByIds'], $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aBusinessObjects = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        return $aBusinessObjects;
+    }
+
+    /**
+     * Effectue les remplacements de schema et base de données dans la définition ainsi que dans les formulaires
+     * @param array $aBusinessObject
+     * @return array
+     */
+    function makeVMapBusinessObjectReplacements($aBusinessObject) {
+
+        $sOriginalDatabase = $aBusinessObject['database'];
+        $sOriginalSchema = $aBusinessObject['schema'];
+
+        // Effectue les remplacements dans les fichiers
+        $aFileNames = ['custom', 'default', 'published'];
+        if (is_dir($this->sTmpPath . '/vmap_objects/business_objects_forms/' . $aBusinessObject['business_object_id'])) {
+            for ($i = 0; $i < count($aFileNames); $i++) {
+                $sFormPath = $this->sTmpPath . '/vmap_objects/business_objects_forms/' . $aBusinessObject['business_object_id'] . '/' . $aFileNames[$i] . '.json';
+                if (is_file($sFormPath)) {
+                    $aFileContents = file($sFormPath);
+
+                    for ($ii = 0; $ii < count($aFileContents); $ii++) {
+                        $aPatterns = [
+                            '/"database": "' . $sOriginalDatabase . '"/',
+                            '/"database":"' . $sOriginalDatabase . '"/',
+                            '/"schema": "' . $sOriginalSchema . '"/',
+                            '/"schema":"' . $sOriginalSchema . '"/'
+                        ];
+                        $aReplacements = [
+                            '"database": "[DATABASE_NAME]"',
+                            '"database":"[DATABASE_NAME]"',
+                            '"schema": "[SCHEMA_NAME]"',
+                            '"schema":"[SCHEMA_NAME]"'
+                        ];
+                        $aFileContents[$ii] = preg_replace($aPatterns, $aReplacements, $aFileContents[$ii]);
+                    }
+
+                    file_put_contents($sFormPath, $aFileContents);
+                }
+            }
+        }
+
+        // Remplacements sur la définition
+        $aBusinessObject['database'] = '[DATABASE_NAME]';
+        $aBusinessObject['schema'] = '[SCHEMA_NAME]';
+        $aBusinessObject['sql_summary'] = preg_replace('/\b'.$sOriginalSchema.'\b/', '[SCHEMA_NAME]', $aBusinessObject['sql_summary']);
+        $aBusinessObject['sql_list'] = preg_replace('/\b'.$sOriginalSchema.'\b/', '[SCHEMA_NAME]', $aBusinessObject['sql_list']);
+
+        return $aBusinessObject;
+    }
+
+    /**
+     * Exporte les définitions des services associés aux calques dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapServices() {
+        if (!is_array($this->aExportedCalques)) {
+            return false;
+        }
+        if (!count($this->aExportedCalques) > 0) {
+            return false;
+        }
+
+        $aServicesIds = [];
+        for ($i = 0; $i < count($this->aExportedCalques); $i++) {
+            if (!empty($this->aExportedCalques[$i]['service_id'])) {
+                array_push($aServicesIds, $this->aExportedCalques[$i]['service_id']);
+            }
+        }
+
+        $this->aExportedServices = $this->getVMapServicesByIds($aServicesIds);
+    }
+
+    /**
+     * Récupère les définitions des services en fonction des identifiants
+     * @param array $aServiceIds
+     * @return array
+     */
+    function getVMapServicesByIds($aServiceIds) {
+        require_once 'Services.class.inc';
+
+        if (empty($aServiceIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'service_id',
+            'compare_operator' => 'IN',
+            'value' => $aServiceIds,
+        );
+
+        // Valeurs à ne pas importer
+        $aUnusedValues = [
+            'thumbnail'
+        ];
+
+        $aPath = ['vmap', 'services'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oServices = new Services($aPath, $aValues, $this->aProperties);
+        $oServices->GET();
+
+        $aServices = array();
+        if (!empty($oServices->aObjects)) {
+            for ($i = 0; $i < count($oServices->aObjects); $i++) {
+                if (!empty($oServices->aObjects[$i]->aFields)) {
+                    if ($oServices->aObjects[$i]->aFields['service_vm4ms'] !== true) {
+                        array_push($aServices, $oServices->aObjects[$i]->aFields);
+                    }
+                }
+            }
+        }
+
+        // Drop unsused values
+        for ($i = 0; $i < count($aServices); $i++) {
+            foreach ($aServices[$i] as $key => $value) {
+                if (in_array($key, $aUnusedValues)) {
+                    unset($aServices[$i][$key]);
+                }
+            }
+        }
+
+        // oids
+        for ($i = 0; $i < count($aServices); $i++) {
+            $aServices[$i]['service_id'] = $this->generateOid('service', $aServices[$i]['service_id']);
+        }
+
+        return $aServices;
+    }
+
+    /**
+     * Exporte les définitions des themes associés aux calques dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapCalqueThemes() {
+        if (!is_array($this->aExportedCalques)) {
+            return false;
+        }
+        if (!count($this->aExportedCalques) > 0) {
+            return false;
+        }
+        $aLayerThemeIds = [];
+        for ($i = 0; $i < count($this->aExportedCalques); $i++) {
+            if (!empty($this->aExportedCalques[$i]['layertheme_id'])) {
+                array_push($aLayerThemeIds, $this->aExportedCalques[$i]['layertheme_id']);
+            }
+        }
+
+        $this->aExportedCalqueThemes = $this->getVMapCalqueThemesByIds($aLayerThemeIds);
+    }
+
+    /**
+     * Récupère les définitions des themes de calques en fonction des identifiants
+     * @param array $aLayerThemeIds
+     * @return array
+     */
+    function getVMapCalqueThemesByIds($aLayerThemeIds) {
+        require_once 'LayerThemes.class.inc';
+
+        if (empty($aLayerThemeIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'layertheme_id',
+            'compare_operator' => 'IN',
+            'value' => $aLayerThemeIds,
+        );
+
+        $aPath = ['vmap', 'layerthemes'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oLayerThemes = new LayerThemes($aPath, $aValues, $this->aProperties);
+        $oLayerThemes->GET();
+
+        $aLayerThemes = array();
+        if (!empty($oLayerThemes->aObjects)) {
+            for ($i = 0; $i < count($oLayerThemes->aObjects); $i++) {
+                if (!empty($oLayerThemes->aObjects[$i]->aFields)) {
+                    array_push($aLayerThemes, $oLayerThemes->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        // oids
+        for ($i = 0; $i < count($aLayerThemes); $i++) {
+            $aLayerThemes[$i]['layertheme_id'] = $this->generateOid('layertheme', $aLayerThemes[$i]['layertheme_id']);
+        }
+
+        return $aLayerThemes;
+    }
+
+    /**
+     * Exporte les définitions des événements associés aux objets métier dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapEvents() {
+        if (!is_array($this->aExportedBusinessObjects)) {
+            return false;
+        }
+        if (!count($this->aExportedBusinessObjects) > 0) {
+            return false;
+        }
+        $aEventIds = [];
+        for ($i = 0; $i < count($this->aExportedBusinessObjects); $i++) {
+            if (!empty($this->aExportedBusinessObjects[$i]['event_id'])) {
+                array_push($aEventIds, $this->aExportedBusinessObjects[$i]['event_id']);
+            }
+        }
+
+        $this->aExportedEvents = $this->getVMapEventsByIds($aEventIds);
+    }
+
+    /**
+     * Récupère les définitions des événements en fonction des identifiants
+     * @param array $aEventIds
+     * @return array
+     */
+    function getVMapEventsByIds($aEventIds) {
+        require_once 'BusinessObjectEvents.class.inc';
+
+        if (empty($aEventIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'event_id',
+            'compare_operator' => 'IN',
+            'value' => $aEventIds,
+        );
+
+        $aPath = ['vmap', 'businessobjectevents'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oEvents = new BusinessObjectEvents($aPath, $aValues, $this->aProperties);
+        $oEvents->GET();
+
+        $aEvents = array();
+        if (!empty($oEvents->aObjects)) {
+            for ($i = 0; $i < count($oEvents->aObjects); $i++) {
+                if (!empty($oEvents->aObjects[$i]->aFields)) {
+                    array_push($aEvents, $oEvents->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        return $aEvents;
+    }
+
+    /**
+     * Exporte les définitions des événements associés aux objets métier dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapReports() {
+        if (!is_array($this->aExportedBusinessObjects)) {
+            return false;
+        }
+        if (!count($this->aExportedBusinessObjects) > 0) {
+            return false;
+        }
+
+        $aBoIds = [];
+        for ($i = 0; $i < count($this->aExportedBusinessObjects); $i++) {
+            array_push($aBoIds, $this->aExportedBusinessObjects[$i]['business_object_id']);
+        }
+        $this->aExportedReports = $this->getVMapReportsByBusinessObjectsIds($aBoIds);
+    }
+
+    /**
+     * Récupère les définitions des événements en fonction des bo_id
+     * @param array $aEventIds
+     * @return array
+     */
+    function getVMapReportsByBusinessObjectsIds($aBoIds) {
+        require_once 'PrintReports.class.inc';
+
+        if (empty($aBoIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'column' => 'business_object_id',
+            'compare_operator' => 'IN',
+            'value' => $aBoIds,
+        );
+
+        // Valeurs à ne pas importer
+        $aUnusedValues = [
+            'business_object_title',
+            'business_object_id_field',
+            'business_object_database',
+            'business_object_schema',
+            'business_object_table',
+            'business_object_geom_column'
+        ];
+
+        $aPath = ['vmap', 'printreports'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'module' => 'vmap'
+        );
+
+        $oReports = new PrintReports($aPath, $aValues, $this->aProperties);
+        $oReports->GET();
+
+        $aReports = array();
+        if (!empty($oReports->aObjects)) {
+            for ($i = 0; $i < count($oReports->aObjects); $i++) {
+                if (!empty($oReports->aObjects[$i]->aFields)) {
+                    array_push($aReports, $oReports->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        // Drop unsused values
+        for ($i = 0; $i < count($aReports); $i++) {
+            foreach ($aReports[$i] as $key => $value) {
+                if (in_array($key, $aUnusedValues)) {
+                    unset($aReports[$i][$key]);
+                }
+            }
+        }
+
+        // oids
+        for ($i = 0; $i < count($aReports); $i++) {
+            $aReports[$i]['printreport_id'] = $this->generateOid('printreport', $aReports[$i]['printreport_id']);
+        }
+
+        return $aReports;
+    }
+
+    /**
+     * Exporte les définitions des relations calque / map
+     * associés aux cartes et calques dans le fichier JSON correspondant
+     * @param array $aMapIds
+     */
+    function exportVMapCalqueMapRelations() {
+
+        if (!is_array($this->aExportedCalques)) {
+            return false;
+        }
+        if (!count($this->aExportedCalques) > 0) {
+            return false;
+        }
+        if (!is_array($this->aExportedMaps)) {
+            return false;
+        }
+        if (!count($this->aExportedMaps) > 0) {
+            return false;
+        }
+
+        $aMapIds = [];
+        for ($i = 0; $i < count($this->aExportedMaps); $i++) {
+            if (!empty($this->aExportedMaps[$i]['map_id'])) {
+                if (!empty($this->aOids['map'][$this->aExportedMaps[$i]['map_id']])) {
+                    array_push($aMapIds, $this->aOids['map'][$this->aExportedMaps[$i]['map_id']]);
+                }
+            }
+        }
+
+        $aCalqueIds = [];
+        for ($i = 0; $i < count($this->aExportedCalques); $i++) {
+            if (!empty($this->aExportedCalques[$i]['layer_id'])) {
+                if (!empty($this->aOids['calque'][$this->aExportedCalques[$i]['layer_id']])) {
+                    array_push($aCalqueIds, $this->aOids['calque'][$this->aExportedCalques[$i]['layer_id']]);
+                }
+            }
+        }
+
+        if (!empty($aMapIds) && !empty($aCalqueIds)) {
+            $this->aExportedMapCalqueRelations = $this->getVMapCalqueMapRelationsFromIds($aMapIds, $aCalqueIds);
+        }
+    }
+
+    /**
+     * Récupère les définitions des relations calque / map  en fonction des map_id et layer_id
+     * @param array $aMapIds
+     * @param array $aCalqueIds
+     * @return array
+     */
+    function getVMapCalqueMapRelationsFromIds($aMapIds, $aCalqueIds) {
+        require_once 'MapLayers.class.inc';
+
+        if (empty($aMapIds) || empty($aCalqueIds)) {
+            return array();
+        }
+
+        $aFilter = array(
+            'relation' => 'and',
+            'operators' => array(array(
+                    'column' => 'map_id',
+                    'compare_operator' => 'IN',
+                    'value' => $aMapIds,
+                ), array(
+                    'column' => 'layer_id',
+                    'compare_operator' => 'IN',
+                    'value' => $aCalqueIds,
+                ))
+        );
+
+        $aPath = ['vmap', 'maplayers'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'filter' => json_encode($aFilter),
+            'order_by' => 'layer_index',
+            'module' => 'vmap'
+        );
+
+        $oMapCalques = new MapLayers($aPath, $aValues, $this->aProperties);
+        $oMapCalques->GET();
+
+        $aMapCalques = array();
+        if (!empty($oMapCalques->aObjects)) {
+            for ($i = 0; $i < count($oMapCalques->aObjects); $i++) {
+                if (!empty($oMapCalques->aObjects[$i]->aFields)) {
+                    array_push($aMapCalques, $oMapCalques->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        return $aMapCalques;
+    }
+
+    /**
+     * Remplace les identifinants des dépendances entre les objets vMap par leurs Oid respectifs
+     */
+    function manageVMapObjectDependencies() {
+
+        // Calques
+        for ($i = 0; $i < count($this->aExportedCalques); $i++) {
+            // Services
+            if (!empty($this->aOids['service'])) {
+                if ($this->aExportedCalques[$i]['service_vm4ms']) {
+                    $this->aExportedCalques[$i]['service_id'] = '[PRIVATE_SERVICE]';
+                } else {
+                    $sOid = array_search($this->aExportedCalques[$i]['service_id'], $this->aOids['service']);
+                    if ($sOid !== false) {
+                        $this->aExportedCalques[$i]['service_id'] = $sOid;
+                    }
+                }
+            }
+            // Themes
+            if (!empty($this->aOids['layertheme'])) {
+                $sOid = array_search($this->aExportedCalques[$i]['layertheme_id'], $this->aOids['layertheme']);
+                if ($sOid !== false) {
+                    $this->aExportedCalques[$i]['layertheme_id'] = $sOid;
+                }
+            }
+            // Vérification de l'existance des Couches MS
+            if (!empty($this->aExportedCalques[$i]['layer_list'])) {
+                $aLayerList = explode(',', $this->aExportedCalques[$i]['layer_list']);
+                $aVm4msLayerNames = [];
+                if (!empty($this->aExportedVm4msLayers)){
+                  for ($ii = 0; $ii < count($this->aExportedVm4msLayers); $ii++) {
+                      array_push($aVm4msLayerNames, $this->aExportedVm4msLayers[$ii]['name']);
+                  }
+                }
+                for ($ii = count($aLayerList) - 1; $ii >= 0; $ii--) {
+                    if (!in_array($aLayerList[$ii], $aVm4msLayerNames)) {
+                        unset($aLayerList[$ii]);
+                    }
+                }
+                $this->aExportedCalques[$i]['layer_list'] = implode(',', $aLayerList);
+            }
+
+            // Vérification de l'existance des Objets métier
+            if (!empty($this->aExportedCalques[$i]['bo_id_list'])) {
+                $aBoList = explode('|', $this->aExportedCalques[$i]['bo_id_list']);
+                $aBoNames = [];
+                for ($ii = 0; $ii < count($this->aExportedBusinessObjects); $ii++) {
+                    array_push($aBoNames, $this->aExportedBusinessObjects[$ii]['business_object_id']);
+                }
+                for ($ii = count($aBoList) - 1; $ii >= 0; $ii--) {
+                    if (!in_array($aBoList[$ii], $aBoNames)) {
+                        unset($aBoList[$ii]);
+                    }
+                }
+                $this->aExportedCalques[$i]['bo_id_list'] = implode('|', $aBoList);
+            }
+        }
+
+        // Relation calque carte
+        for ($i = 0; $i < count($this->aExportedMapCalqueRelations); $i++) {
+            if (!empty($this->aOids['calque'])) {
+                $sOid = array_search($this->aExportedMapCalqueRelations[$i]['layer_id'], $this->aOids['calque']);
+                if ($sOid !== false) {
+                    $this->aExportedMapCalqueRelations[$i]['layer_id'] = $sOid;
+                }
+            }
+            if (!empty($this->aOids['map'])) {
+                $sOid = array_search($this->aExportedMapCalqueRelations[$i]['map_id'], $this->aOids['map']);
+                if ($sOid !== false) {
+                    $this->aExportedMapCalqueRelations[$i]['map_id'] = $sOid;
+                }
+            }
+        }
+    }
+
+    /**
+     * Écrit les dépendances dans des fichiers JSON correspondants
+     */
+    function generateDefinitionFiles() {
+
+        if (!empty($this->aExportedMaps)) {
+            if (count($this->aExportedMaps) > 0) {
+                $this->aExportedMaps = $this->replaceBooleans($this->aExportedMaps);
+                file_put_contents($this->sTmpPath . '/vmap_objects/maps.json', json_encode($this->aExportedMaps));
+            }
+        }
+        if (!empty($this->aExportedCalques)) {
+            if (count($this->aExportedCalques) > 0) {
+                $this->aExportedCalques = $this->replaceBooleans($this->aExportedCalques);
+                file_put_contents($this->sTmpPath . '/vmap_objects/calques.json', json_encode($this->aExportedCalques));
+            }
+        }
+        if (!empty($this->aExportedVm4msLayers)) {
+            if (count($this->aExportedVm4msLayers) > 0) {
+                $this->aExportedVm4msLayers = $this->replaceBooleans($this->aExportedVm4msLayers);
+                file_put_contents($this->sTmpPath . '/vmap_objects/vm4ms_layers.json', json_encode($this->aExportedVm4msLayers));
+            }
+        }
+        if (!empty($this->aExportedServices)) {
+            if (count($this->aExportedServices) > 0) {
+                $this->aExportedServices = $this->replaceBooleans($this->aExportedServices);
+                file_put_contents($this->sTmpPath . '/vmap_objects/services.json', json_encode($this->aExportedServices));
+            }
+        }
+        if (!empty($this->aExportedBusinessObjects)) {
+            if (count($this->aExportedBusinessObjects) > 0) {
+                $this->aExportedBusinessObjects = $this->replaceBooleans($this->aExportedBusinessObjects);
+                file_put_contents($this->sTmpPath . '/vmap_objects/business_objects.json', json_encode($this->aExportedBusinessObjects));
+            }
+        }
+        if (!empty($this->aExportedCalqueThemes)) {
+            if (count($this->aExportedCalqueThemes) > 0) {
+                $this->aExportedCalqueThemes = $this->replaceBooleans($this->aExportedCalqueThemes);
+                file_put_contents($this->sTmpPath . '/vmap_objects/layerthemes.json', json_encode($this->aExportedCalqueThemes));
+            }
+        }
+        if (!empty($this->aExportedEvents)) {
+            if (count($this->aExportedEvents) > 0) {
+                $this->aExportedEvents = $this->replaceBooleans($this->aExportedEvents);
+                file_put_contents($this->sTmpPath . '/vmap_objects/events.json', json_encode($this->aExportedEvents));
+            }
+        }
+        if (!empty($this->aExportedReports)) {
+            if (count($this->aExportedReports) > 0) {
+                $this->aExportedReports = $this->replaceBooleans($this->aExportedReports);
+                file_put_contents($this->sTmpPath . '/vmap_objects/reports.json', json_encode($this->aExportedReports));
+            }
+        }
+        if (!empty($this->aExportedMapCalqueRelations)) {
+            if (count($this->aExportedMapCalqueRelations) > 0) {
+                $this->aExportedMapCalqueRelations = $this->replaceBooleans($this->aExportedMapCalqueRelations);
+                file_put_contents($this->sTmpPath . '/vmap_objects/map_layer.json', json_encode($this->aExportedMapCalqueRelations));
+            }
+        }
+    }
+
+    /**
+     * Remplace les booléens par "true" et "false"
+     * @param array $aVMapObjects
+     * @return array
+     */
+    function replaceBooleans($aVMapObjects) {
+        for ($i = 0; $i < count($aVMapObjects); $i++) {
+            foreach ($aVMapObjects[$i] as $key => $value) {
+                if ($aVMapObjects[$i][$key] === true) {
+                    $aVMapObjects[$i][$key] = 'true';
+                }
+                if ($aVMapObjects[$i][$key] === false) {
+                    $aVMapObjects[$i][$key] = 'false';
+                }
+            }
+        }
+
+        return $aVMapObjects;
+    }
+
+    // Services web
+
+    /**
+     * Exporte les services web
+     */
+    function exportWebServices() {
+
+        $aWebServices = $this->aValues['web_services'];
+
+        if (count($aWebServices) > 0) {
+
+            // Dossier web_services
+            mkdir($this->sTmpPath . '/web_services', 0777, true);
+
+            for ($i = 0; $i < count($aWebServices); $i++) {
+                if (strpos($aWebServices[$i], '../') === false) {
+                    if (is_dir($this->aProperties['vas_home'] . '/rest/ws/' . $aWebServices[$i])) {
+                        copyDirectory($this->aProperties['vas_home'] . '/rest/ws/' . $aWebServices[$i], $this->sTmpPath . '/web_services/' . $aWebServices[$i]);
+                    }
+                }
+            }
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/VexGetter.class.inc b/web_service/ws/VexGetter.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..e6653d575476627922f6946dd31eba078150f0d9
--- /dev/null
+++ b/web_service/ws/VexGetter.class.inc
@@ -0,0 +1,1399 @@
+<?php
+
+/**
+ * \file VexGetter.class.inc
+ * \class VexGetter
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the VexGetter php class
+ *
+ * This class defines php functions to export VEX files
+ *
+ */
+require_once 'Vex.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+/**
+ * Classe contenant les fonctions permettant de récupérer
+ * les informations sur les différents objets à exporter
+ */
+class VexGetter extends Vmap {
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        require 'Vex.class.sql.inc';
+        $this->aSQL = $aSql;
+    }
+
+    // Get vMap objects
+
+    /**
+     * Retourne la liste des objets vMap au format suivant
+     *
+     * [{
+     *     type: map
+     *     name: [map_name]
+     *     map_id: [map_id]
+     *     calques: [{
+     *         type: calque
+     *         name: [layer_name]
+     *         layer_id: [layer_id]
+     *         business_objects: [{
+     *               type: business_object
+     *               name: [bo_name]
+     *         }],
+     *         vm4ms_layers: [{
+     *               type: vm4ms_layer
+     *               name: [layer_name]
+     *         }]
+     *     }]
+     * }]
+     *
+     * @return string
+     */
+    function getVMapObjectsList() {
+
+        $this->aReturn = Array();
+
+        $aVMapObjects = array();
+
+        // Liste des cartes
+        $this->aMaps = $aMaps = $this->getVMapMaps();
+
+        // Liste des calques
+        $this->aCalques = $aCalques = $this->getVMapCalques();
+
+        // Relations cartes / calques
+        $this->aMapCalques = $aMapCalques = $this->getVMapMapCalques();
+
+        // Liste des couches mapserver
+        $this->aVm4msLayers = $aVm4msLayers = $this->getVMapVm4msLayers();
+
+        // Liste des connexions mapserver
+        $this->aVm4msConnections = $aVm4msConnections = $this->getVMapVm4msConnections();
+
+        // Objets métier
+        $this->aBusinessObjects = $aBusinessObjects = $this->getVMapBusinessObjects();
+
+        // Arbre contenant ces données
+        $aVMapObjects = $this->getTreeOrderedMaps($aMaps, $aCalques, $aMapCalques);
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn['status'] = 1;
+            $this->aReturn['vmap_objects'] = $aVMapObjects;
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Récupère la liste des cartes
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapMaps($sNames = null) {
+        require_once 'Maps.class.inc';
+
+        $aPath = ['vmap', 'maps'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'attributs' => 'map_id|name',
+            'module' => 'vmap',
+            'order_by' => 'name'
+        );
+
+        // Ajout filtre sur le nom
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'name',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oMaps = new Maps($aPath, $aValues, $this->aProperties);
+        $oMaps->GET();
+
+        $aMaps = array();
+        if (!empty($oMaps->aObjects)) {
+            for ($i = 0; $i < count($oMaps->aObjects); $i++) {
+                if (!empty($oMaps->aObjects[$i]->aFields)) {
+                    if (!empty($oMaps->aObjects[$i]->aFields['map_id']) &&
+                            !empty($oMaps->aObjects[$i]->aFields['name'])) {
+                        array_push($aMaps, array(
+                            'name' => $oMaps->aObjects[$i]->aFields['name'],
+                            'map_id' => $oMaps->aObjects[$i]->aFields['map_id']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aMaps;
+    }
+
+    /**
+     * Récupère la liste des services
+     * @param string $sNames names filter
+     * @param array $aAttributs attributs to request
+     * @return array
+     */
+    function getVMapServices($sNames = null, $aAttributs = ['service_id', 'name']) {
+        require_once 'Services.class.inc';
+
+        $aPath = ['vmap', 'services'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'module' => 'vmap',
+            'order_by' => 'name'
+        );
+
+        if (is_array($aAttributs)) {
+            $aValues['attributs'] = implode('|', $aAttributs);
+        }
+
+        // Ajout filtre sur le nom
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'name',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oServices = new Services($aPath, $aValues, $this->aProperties);
+        $oServices->GET();
+
+        $aServices = array();
+        if (!empty($oServices->aObjects)) {
+            for ($i = 0; $i < count($oServices->aObjects); $i++) {
+                if (!empty($oServices->aObjects[$i]->aFields)) {
+                    array_push($aServices, $oServices->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        return $aServices;
+    }
+
+    /**
+     * Récupère la liste des événements
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapEvents($sNames = null) {
+        require_once 'BusinessObjectEvents.class.inc';
+
+        $aPath = ['vmap', 'businessobjectevents'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'attributs' => 'event_id|description',
+            'module' => 'vmap',
+            'order_by' => 'event_id'
+        );
+
+        // Ajout filtre sur event_id
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'event_id',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oEvents = new BusinessObjectEvents($aPath, $aValues, $this->aProperties);
+        $oEvents->GET();
+
+        $aEvents = array();
+        if (!empty($oEvents->aObjects)) {
+            for ($i = 0; $i < count($oEvents->aObjects); $i++) {
+                if (!empty($oEvents->aObjects[$i]->aFields)) {
+                    if (!empty($oEvents->aObjects[$i]->aFields['event_id']) &&
+                            !empty($oEvents->aObjects[$i]->aFields['description'])) {
+                        array_push($aEvents, array(
+                            'description' => $oEvents->aObjects[$i]->aFields['description'],
+                            'event_id' => $oEvents->aObjects[$i]->aFields['event_id']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aEvents;
+    }
+
+    /**
+     * Récupère la liste des rapports
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapReports($sNames = null) {
+        require_once 'PrintReports.class.inc';
+
+        $aPath = ['vmap', 'printreports'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'attributs' => 'printreport_id|name',
+            'module' => 'vmap',
+            'order_by' => 'name'
+        );
+
+        // Ajout filtre sur le nom
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'name',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oPrintReports = new PrintReports($aPath, $aValues, $this->aProperties);
+        $oPrintReports->GET();
+
+        $aReports = array();
+        if (!empty($oPrintReports->aObjects)) {
+            for ($i = 0; $i < count($oPrintReports->aObjects); $i++) {
+                if (!empty($oPrintReports->aObjects[$i]->aFields)) {
+                    if (!empty($oPrintReports->aObjects[$i]->aFields['printreport_id']) &&
+                            !empty($oPrintReports->aObjects[$i]->aFields['name'])) {
+                        array_push($aReports, array(
+                            'name' => $oPrintReports->aObjects[$i]->aFields['name'],
+                            'printreport_id' => $oPrintReports->aObjects[$i]->aFields['printreport_id']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aReports;
+    }
+
+    /**
+     * Récupère la liste des calques
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapCalques($sNames = null) {
+
+        $aCalques = array();
+        $aParams = array();
+        $sSql = $this->aSQL['getLayers'];
+
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aParams['namesList'] = array('value' => implode('|', $aNames), 'type' => 'group');
+                $sSql = $this->aSQL['getLayersByName'];
+            }
+        }
+
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($sSql, $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aCalques = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        return $aCalques;
+    }
+
+    /**
+     * Récupère les relations cartes/calques
+     * @return array
+     */
+    function getVMapMapCalques($sMapId = null, $sLayerId = null) {
+        require_once 'MapLayers.class.inc';
+
+        $aPath = ['vmap', 'maplayers'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'attributs' => 'layer_id|name|map_id|layer_index',
+            'module' => 'vmap',
+            'order_by' => 'layer_index'
+        );
+
+        $aFilter = [
+            'relation' => 'AND',
+            'operators' => []
+        ];
+        if (!empty($sMapId)) {
+            array_push($aFilter['operators'], array(
+                'column' => 'map_id',
+                'compare_operator' => '=',
+                'value' => $sMapId
+            ));
+        }
+        if (!empty($sLayerId)) {
+            array_push($aFilter['operators'], array(
+                'column' => 'layer_id',
+                'compare_operator' => '=',
+                'value' => $sLayerId
+            ));
+        }
+        if (count($aFilter['operators']) > 0) {
+            $aValues['filter'] = json_encode($aFilter);
+        }
+
+        $oMapLayers = new MapLayers($aPath, $aValues, $this->aProperties);
+        $oMapLayers->GET();
+
+        $aMapCalques = array();
+        if (!empty($oMapLayers->aObjects)) {
+            for ($i = 0; $i < count($oMapLayers->aObjects); $i++) {
+                if (!empty($oMapLayers->aObjects[$i]->aFields)) {
+                    if (!empty($oMapLayers->aObjects[$i]->aFields['map_id']) &&
+                            !empty($oMapLayers->aObjects[$i]->aFields['name'])) {
+                        array_push($aMapCalques, array(
+                            'layer_index' => $oMapLayers->aObjects[$i]->aFields['layer_index'],
+                            'layer_id' => $oMapLayers->aObjects[$i]->aFields['layer_id'],
+                            'map_id' => $oMapLayers->aObjects[$i]->aFields['map_id']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aMapCalques;
+    }
+
+    /**
+     * Récupère la liste des themes des calques
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapCalqueThemes($sNames = null) {
+        require_once 'LayerThemes.class.inc';
+
+        $aPath = ['vmap', 'layerthemes'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'module' => 'vmap'
+        );
+
+        // Ajout filtre sur le nom
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'name',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oLayerThemes = new LayerThemes($aPath, $aValues, $this->aProperties);
+        $oLayerThemes->GET();
+
+        $aLayerThemes = array();
+        if (!empty($oLayerThemes->aObjects)) {
+            for ($i = 0; $i < count($oLayerThemes->aObjects); $i++) {
+                if (!empty($oLayerThemes->aObjects[$i]->aFields)) {
+                    array_push($aLayerThemes, $oLayerThemes->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        return $aLayerThemes;
+    }
+
+    /**
+     * Récupère la liste des couches Mapserver
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapVm4msLayers($sNames = null, $aAttributs = ['name', 'tableschema', 'tablename', 'connection_id']) {
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/Layers.class.inc';
+
+        $aPath = ['vm4ms', 'layers'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'module' => 'vm4ms',
+            'order_by' => 'name'
+        );
+
+        if (is_array($aAttributs)) {
+            $aValues['attributs'] = implode('|', $aAttributs);
+        }
+
+        // Ajout filtre sur le nom
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aFilter = array(
+                    'column' => 'name',
+                    'compare_operator' => 'IN',
+                    'value' => $aNames
+                );
+                $aValues['filter'] = json_encode($aFilter);
+            }
+        }
+
+        $oLayers = new Layers($aPath, $aValues, $this->aProperties);
+        $oLayers->GET();
+
+        $aVm4msLayers = array();
+        if (!empty($oLayers->aObjects)) {
+            for ($i = 0; $i < count($oLayers->aObjects); $i++) {
+                if (!empty($oLayers->aObjects[$i]->aFields)) {
+                    array_push($aVm4msLayers, $oLayers->aObjects[$i]->aFields);
+                }
+            }
+        }
+
+        return $aVm4msLayers;
+    }
+
+    /**
+     * Récupère la liste des couches Mapserver
+     * @param string $bPrivate True pour avoir uniquement les connexions privées
+     * @return array
+     */
+    function getVMapVm4msConnections($bPrivate = false) {
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vm4ms/LayerConnections.class.inc';
+
+        $aPath = ['vm4ms', 'layerconnecitons'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'module' => 'vm4ms',
+            'order_by' => 'connection_id'
+        );
+
+        if ($bPrivate) {
+            $aFilter = array(
+                'column' => 'private',
+                'compare_operator' => '=',
+                'value' => 'true'
+            );
+            $aValues['filter'] = json_encode($aFilter);
+        }
+
+        $oLayerConnections = new LayerConnections($aPath, $aValues, $this->aProperties);
+        $oLayerConnections->GET();
+
+        $aVm4msLayerConnections = array();
+        if (!empty($oLayerConnections->aObjects)) {
+            for ($i = 0; $i < count($oLayerConnections->aObjects); $i++) {
+                if (!empty($oLayerConnections->aObjects[$i]->aFields)) {
+                    if (!empty($oLayerConnections->aObjects[$i]->aFields['name'])) {
+                        array_push($aVm4msLayerConnections, array(
+                            'connection_id' => $oLayerConnections->aObjects[$i]->aFields['connection_id'],
+                            'name' => $oLayerConnections->aObjects[$i]->aFields['name'],
+                            'private' => $oLayerConnections->aObjects[$i]->aFields['private'],
+                            'server' => $oLayerConnections->aObjects[$i]->aFields['server'],
+                            'port' => $oLayerConnections->aObjects[$i]->aFields['port'],
+                            'database' => $oLayerConnections->aObjects[$i]->aFields['database'],
+                            'user' => $oLayerConnections->aObjects[$i]->aFields['user'],
+                            'password' => $oLayerConnections->aObjects[$i]->aFields['password']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aVm4msLayerConnections;
+    }
+
+    /**
+     * Récupère la liste des objets métier
+     * @param string $sNames names filter
+     * @return array
+     */
+    function getVMapBusinessObjects($sNames = null) {
+
+        $aBusinessObjects = array();
+        $aParams = array();
+        $sSql = $this->aSQL['getBusinessObjects'];
+
+        if (!empty($sNames)) {
+            $aNames = explode('|', $sNames);
+            if (!empty($aNames)) {
+                $aParams['idList'] = array('value' => implode('|', $aNames), 'type' => 'group');
+                $sSql = $this->aSQL['getBusinessObjectByIds'];
+            }
+        }
+
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($sSql, $aParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aBusinessObjects = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        for ($i = 0; $i < count($aBusinessObjects); $i++) {
+            if (empty($aBusinessObjects[$i]['database'])) {
+                $aBusinessObjects[$i]['database'] = $this->aProperties['database'];
+            }
+        }
+
+        return $aBusinessObjects;
+    }
+
+    /**
+     * Ordonne les cartes, calques, objets métiers, couches vm4ms sous forme d'arbre
+     * @param array $aMaps
+     * @param array $aCalques
+     * @param array $aMapCalques
+     * @return array
+     */
+    function getTreeOrderedMaps($aMaps, $aCalques, $aMapCalques) {
+
+        for ($i = 0; $i < count($aMaps); $i++) {
+
+            $aMaps[$i]['type'] = 'map';
+            $aMaps[$i]['calques'] = [];
+
+            // Pour chaque calque dans $aMapCalques
+            for ($ii = 0; $ii < count($aMapCalques); $ii++) {
+                if ($aMaps[$i]['map_id'] === $aMapCalques[$ii]['map_id']) {
+
+                    // Trouve le calque correspondant dans $aCalques
+                    for ($iii = 0; $iii < count($aCalques); $iii++) {
+                        if ($aMapCalques[$ii]['layer_id'] === $aCalques[$iii]['layer_id']) {
+
+                            // Ajoute le calque ordonné sous forma d'arbre
+                            array_push($aMaps[$i]['calques'], $this->getTreeOrderedCalque($aCalques[$iii]));
+                        }
+                    }
+                }
+            }
+        }
+
+        return $aMaps;
+    }
+
+    /**
+     * Retourne le calque sous forme d'arbre
+     * @param array $oCalque
+     * @return array
+     */
+    function getTreeOrderedCalque($oCalque) {
+
+        $oTmpCalque = array(
+            'type' => 'calque',
+            'name' => $oCalque['name'],
+            'layer_id' => $oCalque['layer_id']
+        );
+
+        // Liste des couches vm4ms
+        if (!empty($oCalque['layer_list'])) {
+            $oTmpCalque['vm4ms_layers'] = $this->getTreeOrderedVm4msLayers($oCalque);
+        }
+
+        // Liste des objets métiers
+        if (!empty($oCalque['bo_id_list'])) {
+            $oTmpCalque['business_objects'] = $this->getTreeOrderedBOs($oCalque);
+        }
+
+        return $oTmpCalque;
+    }
+
+    /**
+     * Retourne sous forme d'arbre la couche vm4ms
+     * @param array $oCalque
+     * @return array
+     */
+    function getTreeOrderedVm4msLayers($oCalque) {
+        $aVm4msLayers = [];
+
+        if ($oCalque['service_vm4ms']) {
+            if (!empty($oCalque['layer_list'])) {
+                $aVm4msLayerList = explode(',', $oCalque['layer_list']);
+                for ($i = 0; $i < count($aVm4msLayerList); $i++) {
+                    $oLayerConnection = $this->getVm4msLayerConnecitonFromName($aVm4msLayerList[$i]);
+                    if ($oLayerConnection !== false) {
+                        array_push($aVm4msLayers, array(
+                            'type' => 'vm4ms_layer',
+                            'name' => $aVm4msLayerList[$i],
+                            'server' => $oLayerConnection['server'],
+                            'port' => $oLayerConnection['port'],
+                            'database' => $oLayerConnection['database'],
+                            'schema' => $oLayerConnection['schema'],
+                            'table' => $oLayerConnection['table']
+                        ));
+                    }
+                }
+            }
+        }
+
+        return $aVm4msLayers;
+    }
+
+    /**
+     * Retourne sous forme d'arbre l'objet métier
+     * @param array $oCalque
+     * @return array
+     */
+    function getTreeOrderedBOs($oCalque) {
+        $aBOs = [];
+
+        if (!empty($oCalque['bo_id_list'])) {
+            $aBOList = explode('|', $oCalque['bo_id_list']);
+            for ($i = 0; $i < count($aBOList); $i++) {
+
+                $oBo = $this->getOBFromName($aBOList[$i]);
+                if ($oBo !== false) {
+                    array_push($aBOs, array(
+                        'type' => 'business_object',
+                        'name' => $oBo['business_object_id'],
+                        'database' => $oBo['database'],
+                        'schema' => $oBo['schema'],
+                        'table' => $oBo['table'],
+                        'id_field' => $oBo['id_field']
+                    ));
+                }
+            }
+        }
+
+        return $aBOs;
+    }
+
+    /**
+     * Récupère server, port, database, schema, table depuis le num d'une couche vm4ms
+     * @param string $sLayerName
+     * @return array
+     */
+    function getVm4msLayerConnecitonFromName($sLayerName) {
+        $oLayerConnection = false;
+        for ($i = 0; $i < count($this->aVm4msLayers); $i++) {
+            if ($this->aVm4msLayers[$i]['name'] === $sLayerName) {
+                $oConnection = $this->getVm4msConnexionFromId($this->aVm4msLayers[$i]['connection_id']);
+                if ($oConnection !== false) {
+                    if (empty($oConnection['server'])) {
+                        $oConnection['server'] = $this->aProperties['server'];
+                    }
+                    if (empty($oConnection['port'])) {
+                        $oConnection['port'] = $this->aProperties['port'];
+                    }
+                    if (empty($oConnection['database'])) {
+                        $oConnection['database'] = $this->aProperties['database'];
+                    }
+                    if ($oConnection['server'] === $this->aProperties['server'] &&
+                            $oConnection['port'] === $this->aProperties['port']) {
+
+                        $oLayerConnection = array(
+                            'server' => $oConnection['server'],
+                            'port' => $oConnection['port'],
+                            'database' => $oConnection['database'],
+                            'schema' => $this->aVm4msLayers[$i]['tableschema'],
+                            'table' => $this->aVm4msLayers[$i]['tablename']
+                        );
+                    }
+                }
+            }
+        }
+        return $oLayerConnection;
+    }
+
+    /**
+     * Récupère la connexion depuis un identifiant
+     * @param string $sConnectionId
+     * @return array
+     */
+    function getVm4msConnexionFromId($sConnectionId) {
+        $oConnection = false;
+        for ($i = 0; $i < count($this->aVm4msConnections); $i++) {
+            if ($this->aVm4msConnections[$i]['connection_id'] === $sConnectionId) {
+                $oConnection = $this->aVm4msConnections[$i];
+            }
+        }
+        return $oConnection;
+    }
+
+    /**
+     * Récupère l'objet métier en fonction de son nom
+     * @param string $sBOId
+     * @return boolean|array
+     */
+    function getOBFromName($sBOId) {
+        $oBO = false;
+
+        for ($i = 0; $i < count($this->aBusinessObjects); $i++) {
+            if ($this->aBusinessObjects[$i]['business_object_id'] === $sBOId) {
+                return $this->aBusinessObjects[$i];
+            }
+        }
+
+        return $oBO;
+    }
+
+    // Get Web services
+
+    /**
+     * Get the web services of the given business objects
+     * @return string
+     */
+    function getWebServicesList() {
+        $this->aReturn = Array();
+
+        if (empty($this->aValues['business_objects'])) {
+            $oError = new VitisError(2, 'business_objects parameter required');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // Liste des répertoires contennus dans ws
+        $aDirs = $this->getWsDirectoriesList();
+
+        // Récupère les nos des organismes celons la règle de nommage des objets métier
+        $aOrganismes = $this->getOrganismeNames();
+
+        // Récupère les répertoires dont les nom correspondend aux organismes
+        $aWebServices = $this->getOrganismesWebServices($aDirs, $aOrganismes);
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn['status'] = 1;
+            $this->aReturn['web_services'] = $aWebServices;
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Get the list of the WS directories
+     * @return array
+     */
+    function getWsDirectoriesList() {
+        chdir($this->aProperties['vas_home'] . '/rest/ws');
+        $aDirs = glob('*', GLOB_ONLYDIR);
+        return $aDirs;
+    }
+
+    /**
+     * Get the list of the organismes founded in aValues.business_objects
+     * @return array
+     */
+    function getOrganismeNames() {
+
+        // Liste des objets métier
+        $aBOs = explode('|', $this->aValues['business_objects']);
+
+        // Récupère les nos des organismes celons la règle de nommage des objets métier
+        $aOrganismes = array();
+        for ($i = 0; $i < count($aBOs); $i++) {
+            if (strpos($aBOs[$i], '_') !== false) {
+                array_push($aOrganismes, explode('_', $aBOs[$i])[0]);
+            }
+        }
+
+        return $aOrganismes;
+    }
+
+    /**
+     * Get the directories matching with the organismes
+     * @param array $aDirs
+     * @param array $aOrganismes
+     * @return array
+     */
+    function getOrganismesWebServices($aDirs, $aOrganismes) {
+        $aWebServices = array();
+        for ($i = 0; $i < count($aDirs); $i++) {
+            if (strpos($aDirs[$i], '_') !== false) {
+                if (in_array(explode('_', $aDirs[$i])[0], $aOrganismes)) {
+                    array_push($aWebServices, array(
+                        'name' => $aDirs[$i]
+                    ));
+                }
+            }
+        }
+
+        // Ajoute les infos sur les fichiers contenus au sein de chaque web service
+        $aWebServices = $this->completeWebServicesInfos($aWebServices);
+
+        return $aWebServices;
+    }
+
+    /**
+     * Complete the web service introducing contained files
+     * @param array $aWebServices
+     * @return array
+     */
+    function completeWebServicesInfos($aWebServices) {
+        for ($i = 0; $i < count($aWebServices); $i++) {
+            chdir($this->aProperties['vas_home'] . '/rest/ws/' . $aWebServices[$i]['name']);
+            $aWebServices[$i]['files'] = glob('*');
+        }
+        return $aWebServices;
+    }
+
+    // Get SQL objects
+
+    /**
+     * Récupère la liste des objets SQL exportables
+     * @return string
+     */
+    function getSqlObjects() {
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/GenericQuerys.class.inc';
+        $this->aReturn = Array();
+
+        if (empty($this->aValues['database'])) {
+            $oError = new VitisError(2, 'database parameter required');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        $aSqlObjects = array();
+
+        // Liste des schémas
+        $aSqlObjects = $this->completeSqlObjectsWithSchemas($aSqlObjects);
+
+        // Liste des tables
+        $aSqlObjects = $this->completeSqlObjectsWithTablesAndViews($aSqlObjects);
+
+        // Liste des sequences
+        $aSqlObjects = $this->completeSqlObjectsWithSequences($aSqlObjects);
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn['status'] = 1;
+            $this->aReturn['sql_objects'] = $aSqlObjects;
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Ajoute à $aSqlObjects les schémas disponibles
+     * @param array $aSqlObjects
+     * @return array
+     */
+    function completeSqlObjectsWithSchemas($aSqlObjects) {
+
+        $aSchemas = $this->getSchemas($this->aValues['database']);
+        for ($i = 0; $i < count($aSchemas); $i++) {
+            array_push($aSqlObjects, array(
+                'type' => 'schema',
+                'name' => $aSchemas[$i],
+                'tables' => array()
+            ));
+        }
+
+        return $aSqlObjects;
+    }
+
+    /**
+     * Ajoute à $aSqlObjects les tables et les vues disponibles
+     * @param array $aSqlObjects
+     * @return array
+     */
+    function completeSqlObjectsWithTablesAndViews($aSqlObjects) {
+
+        for ($i = 0; $i < count($aSqlObjects); $i++) {
+            if ($aSqlObjects[$i]['type'] === 'schema') {
+                $aSqlObjects[$i]['tables'] = $this->getTables($this->aValues['database'], $aSqlObjects[$i]['name']);
+                $aSqlObjects[$i]['views'] = $this->getViews($this->aValues['database'], $aSqlObjects[$i]['name']);
+            }
+        }
+
+        return $aSqlObjects;
+    }
+
+    /**
+     * Ajoute à $aSqlObjects les sequences disponibles
+     * @param array $aSqlObjects
+     * @return array
+     */
+    function completeSqlObjectsWithSequences($aSqlObjects) {
+
+        for ($i = 0; $i < count($aSqlObjects); $i++) {
+            if ($aSqlObjects[$i]['type'] === 'schema') {
+                $aSqlObjects[$i]['sequences'] = $this->getSequences($this->aValues['database'], $aSqlObjects[$i]['name']);
+            }
+        }
+
+        return $aSqlObjects;
+    }
+
+    /**
+     * Récupère la liste des schemas exportables
+     * @param string $sDatabase
+     * @return array
+     */
+    function getSchemas($sDatabase) {
+
+        $aPath = ['vitis', 'genericquerys', $sDatabase, 'schemas'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sDatabase,
+            'module' => 'vitis',
+            'order_by' => 'schema_name'
+        );
+
+        $oGenericQuerys = new GenericQuerys($aPath, $aValues, $this->aProperties);
+        $oGenericQuerys->GET();
+
+        $aSchemas = array();
+        $aUnExportableSchemas = ['information_schema', 'pg_catalog'];
+        if (!empty($oGenericQuerys->aObjects)) {
+            for ($i = 0; $i < count($oGenericQuerys->aObjects); $i++) {
+                if (!empty($oGenericQuerys->aObjects[$i]->aFields)) {
+                    if (!empty($oGenericQuerys->aObjects[$i]->aFields['schema_name'])) {
+                        if (!in_array($oGenericQuerys->aObjects[$i]->aFields['schema_name'], $aUnExportableSchemas)) {
+                            array_push($aSchemas, $oGenericQuerys->aObjects[$i]->aFields['schema_name']);
+                        }
+                    }
+                }
+            }
+        }
+
+        return $aSchemas;
+    }
+
+    /**
+     * Récupère la liste des tables exportables
+     * @param string $sDatabase
+     * @param string $sSchema
+     */
+    function getTables($sDatabase, $sSchema) {
+
+        $aTables = [];
+        if ($sDatabase != $this->oConnection->oBd->base) {
+            $this->oBd = new BD($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $sDatabase, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        $sSQL = $this->aSQL['getTables'];
+        $aSQLParams = array(
+            'sSchema' => array('value' => $sSchema, 'type' => 'quoted_string')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($sSQL, $aSQLParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aResult = $this->oConnection->oBd->getResultTableAssoc($oResult);
+            for ($i = 0; $i < count($aResult); $i++) {
+                if (!empty($aResult[$i]['tablename'])) {
+                    array_push($aTables, $aResult[$i]['tablename']);
+                }
+            }
+        }
+
+        return $aTables;
+    }
+
+    /**
+     * Récupère la liste des vues exportables
+     * @param string $sDatabase
+     * @param string $sSchema
+     */
+    function getViews($sDatabase, $sSchema) {
+
+        $aViews = [];
+        if ($sDatabase != $this->oConnection->oBd->base) {
+            $this->oBd = new BD($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $sDatabase, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        $sSQL = $this->aSQL['getViews'];
+        $aSQLParams = array(
+            'sSchema' => array('value' => $sSchema, 'type' => 'quoted_string')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($sSQL, $aSQLParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aResult = $this->oConnection->oBd->getResultTableAssoc($oResult);
+            for ($i = 0; $i < count($aResult); $i++) {
+                if (!empty($aResult[$i]['viewname'])) {
+                    array_push($aViews, $aResult[$i]['viewname']);
+                }
+            }
+        }
+
+        return $aViews;
+    }
+
+    /**
+     * Récupère la liste des sequences exportables
+     * @param string $sDatabase
+     * @param string $sSchema
+     */
+    function getSequences($sDatabase, $sSchema) {
+
+        $aSequences = [];
+        if ($sDatabase != $this->oConnection->oBd->base) {
+            $this->oBd = new BD($this->oConnection->oBd->login, $this->oConnection->oBd->mdp, $sDatabase, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
+        }
+
+        $sSQL = $this->aSQL['getSequences'];
+        $aSQLParams = array(
+            'sSchema' => array('value' => $sSchema, 'type' => 'quoted_string')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($sSQL, $aSQLParams);
+        if (!$this->oConnection->oBd->enErreur()) {
+            $aResult = $this->oConnection->oBd->getResultTableAssoc($oResult);
+            for ($i = 0; $i < count($aResult); $i++) {
+                if (!empty($aResult[$i]['sequence_name'])) {
+                    array_push($aSequences, $aResult[$i]['sequence_name']);
+                }
+            }
+        }
+
+        return $aSequences;
+    }
+
+    /**
+     * Get the list of the grantable objects
+     * @param array $aLines
+     * @return array
+     */
+    function getSQLGrantableObjectsFromLines($aLines) {
+
+        $aSQLComponents = [];
+        $aAvaliableTypes = array(
+            'TABLE',
+            'VIEW',
+            'SEQUENCE'
+        );
+
+        for ($i = 0; $i < count($aLines); $i++) {
+
+            $sName = $this->getCommentLineName($aLines[$i]);
+            $sType = $this->getCommentLineType($aLines[$i]);
+
+            if ($sName !== false && $sType !== false) {
+                if (in_array($sType, $aAvaliableTypes)) {
+                    array_push($aSQLComponents, array(
+                        'name' => $sName,
+                        'type' => $sType
+                    ));
+                }
+            }
+        }
+        return $aSQLComponents;
+    }
+
+    /**
+     * Récupère les noms des différents schémas
+     * @param array $aLines
+     * @return array
+     */
+    function getSchemasFromLines($aLines) {
+        $sSchemaTag = 'Schema: ';
+        $aSchemas = [];
+
+        for ($i = 0; $i < count($aLines); $i++) {
+            $sSchema = null;
+
+            // Récupère le nom du schema dans les commentaires
+            $sSchema = $this->getCommentLineSchema($aLines[$i]);
+            if ($sSchema !== false) {
+                if (!in_array($sSchema, $aSchemas)) {
+                    array_push($aSchemas, $sSchema);
+                }
+            }
+        }
+        return $aSchemas;
+    }
+
+    /**
+     * Cherche dans un commentaire la valeur de balise Name
+     * @param string $sLine
+     * @return string
+     */
+    function getCommentLineName($sLine) {
+        $sName = false;
+        if (substr($sLine, 0, 9) === '-- Name: ') {
+            $iStartPos = 9;
+            $iEndPos = strpos($sLine, ';', $iStartPos);
+            if ($iEndPos !== false) {
+                $sName = substr($sLine, $iStartPos, $iEndPos - $iStartPos);
+            }
+        }
+        return $sName;
+    }
+
+    /**
+     * Cherche dans un commentaire la valeur de balise Type
+     * @param string $sLine
+     * @return string
+     */
+    function getCommentLineType($sLine) {
+        $sType = false;
+        $sTag = 'Type: ';
+
+        if (substr($sLine, 0, 7) === '-- Name') {
+            $iStartPos = strpos($sLine, $sTag, 7);
+            if ($iStartPos !== false) {
+                $iStartPos = $iStartPos + strlen($sTag);
+                $iEndPos = strpos($sLine, ';', $iStartPos);
+                if ($iEndPos !== false) {
+                    $sType = substr($sLine, $iStartPos, $iEndPos - $iStartPos);
+                }
+            }
+        }
+
+        return $sType;
+    }
+
+    /**
+     * Cherche dans un commentaire la valeur de balise Schema
+     * @param string $sLine
+     * @return string
+     */
+    function getCommentLineSchema($sLine) {
+        $sSchema = false;
+        $sTag = 'Schema: ';
+
+        if (substr($sLine, 0, 7) === '-- Name') {
+            $iStartPos = strpos($sLine, $sTag, 7);
+            if ($iStartPos !== false) {
+                $iStartPos = $iStartPos + strlen($sTag);
+                $iEndPos = strpos($sLine, ';', $iStartPos);
+                if ($iEndPos !== false) {
+                    $sSchema = substr($sLine, $iStartPos, $iEndPos - $iStartPos);
+                }
+            }
+        }
+
+        return $sSchema;
+    }
+
+    // Get Existing vMap Objects
+
+    /**
+     * Récupère les objets vMap qui matchent avec les noms passés en paramètre
+     * @return string
+     */
+    function getExistingVMapObjectsList() {
+
+        $this->aReturn = Array();
+
+        $aVMapObjects = array();
+
+        // Liste des cartes
+        if (!empty($this->aValues['maps'])) {
+            $aMaps = $this->getVMapMaps($this->aValues['maps']);
+            if (!empty($aMaps)) {
+                $aVMapObjects['maps'] = $aMaps;
+            }
+        }
+
+        // Liste des services
+        if (!empty($this->aValues['services'])) {
+            $aServices = $this->getVMapServices($this->aValues['services']);
+            if (!empty($aServices)) {
+                $aVMapObjects['services'] = $aServices;
+            }
+        }
+
+        // Liste des calques
+        if (!empty($this->aValues['calques'])) {
+            $aCalques = $this->getVMapCalques($this->aValues['calques']);
+            if (!empty($aCalques)) {
+                $aVMapObjects['calques'] = $aCalques;
+            }
+        }
+
+        // Liste des thèmes des calques
+        if (!empty($this->aValues['calque_themes'])) {
+            $aCalqueThemes = $this->getVMapCalqueThemes($this->aValues['calque_themes']);
+            if (!empty($aCalqueThemes)) {
+                $aVMapObjects['calque_themes'] = $aCalqueThemes;
+            }
+        }
+
+        // Liste des couches mapserver
+        if (!empty($this->aValues['vm4ms_layers'])) {
+            $aVm4msLayers = $this->getVMapVm4msLayers($this->aValues['vm4ms_layers']);
+            if (!empty($aVm4msLayers)) {
+                $aVMapObjects['vm4ms_layers'] = $aVm4msLayers;
+            }
+        }
+
+        // Liste des objets métier
+        if (!empty($this->aValues['business_objects'])) {
+            $aBusinessObjects = $this->getVMapBusinessObjects($this->aValues['business_objects']);
+            if (!empty($aBusinessObjects)) {
+                $aVMapObjects['business_objects'] = $aBusinessObjects;
+            }
+        }
+
+        // Liste des événements
+        if (!empty($this->aValues['events'])) {
+            $aEvents = $this->getVMapEvents($this->aValues['events']);
+            if (!empty($aEvents)) {
+                $aVMapObjects['events'] = $aEvents;
+            }
+        }
+
+        // Liste des rapports
+        if (!empty($this->aValues['reports'])) {
+            $aReports = $this->getVMapReports($this->aValues['reports']);
+            if (!empty($aReports)) {
+                $aVMapObjects['reports'] = $aReports;
+            }
+        }
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn['status'] = 1;
+            $this->aReturn['vmap_objects'] = $aVMapObjects;
+            return json_encode($this->aReturn);
+        }
+    }
+
+    // Get Existing Web services
+
+    /**
+     * Récupère les web services qui matchent avec les noms passés en paramètre
+     * @return string
+     */
+    function getExistingWebServicesList() {
+
+        $this->aReturn = [];
+        $aWebServicesReturned = [];
+
+        // Liste des web services déjà présents
+        if (!empty($this->aValues['web_services'])) {
+
+            // Liste des répertoires contennus dans ws
+            $aDirs = $this->getWsDirectoriesList();
+
+            // Liste des web services demandés
+            $aWebServices = explode('|', $this->aValues['web_services']);
+
+            for ($i = 0; $i < count($aDirs); $i++) {
+                if (in_array($aDirs[$i], $aWebServices)) {
+                    array_push($aWebServicesReturned, $aDirs[$i]);
+                }
+            }
+        }
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn['status'] = 1;
+            $this->aReturn['web_services'] = $aWebServicesReturned;
+            return json_encode($this->aReturn);
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/VexImport.class.inc b/web_service/ws/VexImport.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..761820e20565fd276574fab470d8cb3b4468297d
--- /dev/null
+++ b/web_service/ws/VexImport.class.inc
@@ -0,0 +1,1886 @@
+<?php
+
+/**
+ * \file VexImport.class.inc
+ * \class VexImport
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the VexImport php class
+ *
+ * This class defines php functions to import VEX files
+ *
+ */
+require_once 'Vex.class.inc';
+require_once 'VexGetter.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+/**
+ * Permet l'import de fichiers VEX en utilisant les paramètres
+ * vmap_objects, web_services, sql_objects passés dans $this->aValues
+ */
+class VexImport extends Vmap {
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    // Import d'objets vMap
+
+    /**
+     * Permet d'importer les objets vMap
+     */
+    function importVMapObjects() {
+
+        $this->aReturn = Array();
+
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        if (!isset($this->aValues['vmap_objects']) || !isset($this->aValues['database']) || !isset($this->aValues['schema']) || !isset($this->aValues['srid'])) {
+            $oError = new VitisError(0, 'Parameters vmap_objects, database, schema, srid required');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        /**
+         * Objets vMap à importer
+         */
+        $this->aVmapObjects = json_decode($this->aValues['vmap_objects'], true);
+
+        /**
+         * Objet VexGetter permettant de recueillir des informations essentielles
+         */
+        $this->oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+
+        /**
+         * Connexion privée
+         */
+        $this->oPrivateConnection = $this->getPrivateConnection();
+        if ($this->oPrivateConnection === false) {
+            $oError = new VitisError(0, 'Impossible de récupérer la connexion privée');
+        }
+
+        /**
+         * Service privé
+         */
+        $this->oPrivateService = $this->getPrivateService();
+        if ($this->oPrivateService === false) {
+            $oError = new VitisError(0, 'Impossible de récupérer le service privé');
+        }
+
+        /**
+         * Gestion erreur contenu
+         */
+        if (!is_array($this->aVmapObjects)) {
+            $oError = new VitisError(0, 'vmap_objects non valide');
+        }
+
+        if (!isset($oError)) {
+
+            // Remplace la balise [DATABASE_NAME]
+            $this->replaceOccurences('[DATABASE_NAME]', $this->aValues['database']);
+
+            // Remplace la balise [SCHEMA_NAME]
+            $this->replaceOccurences('[SCHEMA_NAME]', $this->aValues['schema']);
+
+            // Remplace la balise [SRID]
+            $this->replaceOccurences('[SRID]', $this->aValues['srid']);
+
+            // Remplace la balise [PRIVATE_SERVICE]
+            $this->replaceOccurences('[PRIVATE_SERVICE]', $this->oPrivateService['service_id']);
+
+            // Remplace la balise [PRIVATE_CONNECTION]
+            $this->replaceOccurences('[PRIVATE_CONNECTION]', $this->oPrivateConnection['connection_id']);
+
+            // Import des cartes
+            if (!empty($this->aVmapObjects['maps'])) {
+                $this->aReturn['maps'] = $this->importVMapMaps($this->aVmapObjects['maps']);
+            }
+
+            // Import des services
+            if (!empty($this->aVmapObjects['services'])) {
+                $this->aReturn['services'] = $this->importVMapServices($this->aVmapObjects['services']);
+            }
+
+            // Import themes des calques
+            if (!empty($this->aVmapObjects['calque_themes'])) {
+                $this->aReturn['calque_themes'] = $this->importVMapCalqueThemes($this->aVmapObjects['calque_themes']);
+            }
+
+            // Import événements
+            if (!empty($this->aVmapObjects['events'])) {
+                $this->aReturn['events'] = $this->importVMapEvents($this->aVmapObjects['events']);
+            }
+
+            // Import objets métiers
+            if (!empty($this->aVmapObjects['business_objects'])) {
+                $this->aReturn['business_objects'] = $this->importVMapBusinessObjects($this->aVmapObjects['business_objects']);
+            }
+
+            // Import rapports
+            if (!empty($this->aVmapObjects['reports'])) {
+                $this->aReturn['reports'] = $this->importVMapReports($this->aVmapObjects['reports']);
+            }
+
+            // Import couches Mapserver
+            if (!empty($this->aVmapObjects['vm4ms_layers'])) {
+                $this->aReturn['vm4ms_layers'] = $this->importVMapVm4msLayers($this->aVmapObjects['vm4ms_layers']);
+            }
+
+            // Import des calques
+            if (!empty($this->aVmapObjects['calques'])) {
+                $this->aReturn['calques'] = $this->importVMapCalques($this->aVmapObjects['calques']);
+            }
+
+            // Import relation map layer
+            if (!empty($this->aVmapObjects['map_layer'])) {
+                $this->aReturn['map_layer'] = $this->importVMapMapCalquesRelation($this->aVmapObjects['map_layer']);
+            }
+        }
+
+        if (isset($oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn = array(
+                'vmap_objects' => $this->aReturn,
+                'status' => 1
+            );
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Remplace les occurences dans les objet vMap par la valeur passée en paramètre
+     * Utilisée pour remplacer les balises et les oid par exemple
+     * @param string $sOccurence
+     * @param string $sNewValue
+     */
+    function replaceOccurences($sOccurence, $sNewValue) {
+        if (!empty($sNewValue)) {
+            foreach ($this->aVmapObjects as $key => $value) {
+                switch ($key) {
+                    case 'business_objects':
+                    case 'calques':
+                    case 'calque_themes':
+                    case 'events':
+                    case 'map_layer':
+                    case 'maps':
+                    case 'reports':
+                    case 'services':
+                    case 'vm4ms_layers':
+                        for ($i = 0; $i < count($this->aVmapObjects[$key]); $i++) {
+                            foreach ($this->aVmapObjects[$key][$i] as $key2 => $value2) {
+                                if ($value2 === $sOccurence) {
+                                    $this->aVmapObjects[$key][$i][$key2] = $sNewValue;
+                                }
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Récupère la définition de la connexion privée
+     * @return array
+     */
+    function getPrivateConnection() {
+
+        $aVm4msPrivateConnections = $this->oVexGetter->getVMapVm4msConnections(true);
+
+        $iPrivateConnection = false;
+        if (!empty($aVm4msPrivateConnections[0])) {
+            if (!empty($aVm4msPrivateConnections[0]['connection_id'])) {
+                $iPrivateConnection = $aVm4msPrivateConnections[0];
+            }
+        }
+
+        return $iPrivateConnection;
+    }
+
+    /**
+     * Récupère la définition du service privé
+     * @return array
+     */
+    function getPrivateService() {
+
+        $aServices = $this->oVexGetter->getVMapServices(null, ['service_id', 'name', 'url', 'service_vm4ms']);
+
+        $iPrivateService = false;
+
+        // Tente avec l'url
+        for ($i = 0; $i < count($aServices); $i++) {
+            if ($aServices[$i]['service_vm4ms']) {
+                if ($aServices[$i]['url'] = $this->aProperties["ms_cgi_url"] . '/private/[token]') {
+                    $iPrivateService = $aServices[$i];
+                }
+            }
+        }
+
+        // Re-tente avec la balise [token]
+        if ($iPrivateService === false) {
+            for ($i = 0; $i < count($aServices); $i++) {
+                if ($aServices[$i]['service_vm4ms']) {
+                    if (strpos($aServices[$i]['url'], '[token]') !== false) {
+                        $iPrivateService = $aServices[$i];
+                    }
+                }
+            }
+        }
+
+        // Re-tente avec le nom
+        if ($iPrivateService === false) {
+            for ($i = 0; $i < count($aServices); $i++) {
+                if ($aServices[$i]['service_vm4ms']) {
+                    if ($aServices[$i]['name'] === 'vm4ms_private') {
+                        $iPrivateService = $aServices[$i];
+                    }
+                }
+            }
+        }
+
+        return $iPrivateService;
+    }
+
+    // Import Cartes
+
+    /**
+     * Import des cartes vMap
+     * @param array $aMaps
+     */
+    function importVMapMaps($aMaps) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aMaps); $i++) {
+            if (!empty($aMaps[$i]['name'])) {
+                $aExistingMaps = $this->getSameNameMaps($aMaps[$i]);
+                if (count($aExistingMaps) > 0) {
+                    for ($ii = 0; $ii < count($aExistingMaps); $ii++) {
+                        if (!empty($aExistingMaps[$ii]['map_id'])) {
+                            $sNewId = $this->updateVMapMap($aMaps[$i], $aExistingMaps[$ii]['map_id']);
+                            $this->replaceOccurences($aMaps[$i]['map_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapMap($aMaps[$i]);
+                    $this->replaceOccurences($aMaps[$i]['map_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les cartes ayant le même nom
+     * @param array $aMap
+     * @return array
+     */
+    function getSameNameMaps($aMap) {
+        $aExistingMaps = $this->oVexGetter->getVMapMaps($aMap['name']);
+        return $aExistingMaps;
+    }
+
+    /**
+     * Crée une nouvelle carte
+     * @param array $aMap
+     */
+    function addVMapMap($aMap) {
+        require_once 'Maps.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['map_id', 'thumbnail', 'theme_name', 'theme_description', 'maptheme_id', 'crs_name', 'catalog_index'];
+
+        // Options à passer
+        $aPath = ['vmap', 'maps'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aMap as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Maps($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['map_id'])) {
+                $sReturnedId = $oVitisObject->aFields['map_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour une carte existante
+     * @param array $aMap
+     * @param string $sMapId identifiant de la carte à mettre à jour
+     */
+    function updateVMapMap($aMap, $sMapId) {
+        require_once 'Maps.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['map_id', 'thumbnail', 'theme_name', 'theme_description', 'maptheme_id', 'crs_name', 'catalog_index'];
+
+        // Options à passer
+        $aPath = ['vmap', 'maps', $sMapId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sMapId
+        );
+        foreach ($aMap as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Maps($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['map_id'])) {
+                $sReturnedId = $oVitisObject->aFields['map_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    // Import Services
+
+    /**
+     * Import des services vMap
+     * @param array $aServices
+     */
+    function importVMapServices($aServices) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aServices); $i++) {
+            if (!empty($aServices[$i]['name'])) {
+                $aExistingServices = $this->getSameNameServices($aServices[$i]);
+                if (count($aExistingServices) > 0) {
+                    for ($ii = 0; $ii < count($aExistingServices); $ii++) {
+                        if (!empty($aExistingServices[$ii]['service_id'])) {
+                            $sNewId = $this->updateVMapService($aServices[$i], $aExistingServices[$ii]['service_id']);
+                            $this->replaceOccurences($aServices[$i]['service_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapService($aServices[$i]);
+                    $this->replaceOccurences($aServices[$i]['service_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les services ayant le même nom
+     * @param array $aService
+     * @return array
+     */
+    function getSameNameServices($aService) {
+        $aExistingServices = $this->oVexGetter->getVMapServices($aService['name']);
+        return $aExistingServices;
+    }
+
+    /**
+     * Crée un nouveau service
+     * @param array $aService
+     */
+    function addVMapService($aService) {
+        require_once 'Services.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['service_id', 'thumbnail'];
+
+        // Options à passer
+        $aPath = ['vmap', 'services'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aService as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Services($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['service_id'])) {
+                $sReturnedId = $oVitisObject->aFields['service_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un service existant
+     * @param array $aService
+     * @param string $sServiceId identifiant de la service à mettre à jour
+     */
+    function updateVMapService($aService, $sServiceId) {
+        require_once 'Services.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['service_id', 'thumbnail'];
+
+        // Options à passer
+        $aPath = ['vmap', 'services', $sServiceId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sServiceId
+        );
+        foreach ($aService as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Services($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['service_id'])) {
+                $sReturnedId = $oVitisObject->aFields['service_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    // Import Calques
+
+    /**
+     * Import les calques vMap
+     * @param array $aCalques
+     */
+    function importVMapCalques($aCalques) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aCalques); $i++) {
+            if (!empty($aCalques[$i]['name'])) {
+                $aExistingCalques = $this->getSameNameCalques($aCalques[$i]);
+                if (count($aExistingCalques) > 0) {
+                    for ($ii = 0; $ii < count($aExistingCalques); $ii++) {
+                        if (!empty($aExistingCalques[$ii]['layer_id'])) {
+                            $sNewId = $this->updateVMapCalque($aCalques[$i], $aExistingCalques[$ii]['layer_id']);
+                            $this->importVMapCalquesForms($aCalques[$i]['layer_id'], $sNewId);
+                            $this->replaceOccurences($aCalques[$i]['layer_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapCalque($aCalques[$i]);
+                    $this->importVMapCalquesForms($aCalques[$i]['layer_id'], $sNewId);
+                    $this->replaceOccurences($aCalques[$i]['layer_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les calques ayant le même nom
+     * @param array $aCalque
+     * @return array
+     */
+    function getSameNameCalques($aCalque) {
+        $aExistingCalques = $this->oVexGetter->getVMapCalques($aCalque['name']);
+        return $aExistingCalques;
+    }
+
+    /**
+     * Crée un nouveau calque
+     * @param array $aCalque
+     */
+    function addVMapCalque($aCalque) {
+        require_once 'Layers.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [
+            'layer_id',
+            'theme_name',
+            'service_name',
+            'service_type_id',
+            'service_url',
+            'service_key',
+            'service_type_version',
+            'service_thumbnail',
+            'service_lang',
+            'service_imagery',
+            'service_type_type',
+            'service_options',
+            'service_login'];
+
+        // Options à passer
+        $aPath = ['vmap', 'layers'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aCalque as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Layers($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['layer_id'])) {
+                $sReturnedId = $oVitisObject->aFields['layer_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un calque existant
+     * @param array $aCalque
+     * @param string $sCalqueId identifiant de la calque à mettre à jour
+     */
+    function updateVMapCalque($aCalque, $sCalqueId) {
+        require_once 'Layers.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [
+            'layer_id',
+            'theme_name',
+            'service_name',
+            'service_type_id',
+            'service_url',
+            'service_key',
+            'service_type_version',
+            'service_thumbnail',
+            'service_lang',
+            'service_imagery',
+            'service_type_type',
+            'service_options',
+            'service_login'];
+
+        // Options à passer
+        $aPath = ['vmap', 'layers', $sCalqueId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sCalqueId
+        );
+        foreach ($aCalque as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new Layers($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['layer_id'])) {
+                $sReturnedId = $oVitisObject->aFields['layer_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Importe les forumaires du calque
+     * @param string $sOid
+     * @param string $sCalqueId
+     */
+    function importVMapCalquesForms($sOid, $sCalqueId) {
+        if (!empty($sCalqueId)) {
+            if (!empty($this->aVmapObjects['calques_forms'])) {
+                if (!empty($this->aVmapObjects['calques_forms'][$sOid])) {
+
+                    $sFormsDir = $this->aProperties['ws_data_dir'] . '/vmap/layer/' . $sCalqueId;
+                    if (!is_dir($sFormsDir)) {
+                        mkdir($sFormsDir, 0777, true);
+                    }
+                    if (!is_dir($sFormsDir . '/forms')) {
+                        mkdir($sFormsDir . '/forms', 0777, true);
+                    }
+                    if (!is_dir($sFormsDir . '/forms/ressources')) {
+                        mkdir($sFormsDir . '/forms/ressources', 0777, true);
+                    }
+
+                    // Formulaires JSON
+                    $aFormNames = ['default', 'custom', 'published'];
+                    for ($i = 0; $i < count($aFormNames); $i++) {
+                        if (!empty($this->aVmapObjects['calques_forms'][$sOid][$aFormNames[$i]])) {
+                            $pFile = fopen($sFormsDir . '/forms/' . $aFormNames[$i] . '.json', 'w');
+                            if (fwrite($pFile, json_encode($this->aVmapObjects['calques_forms'][$sOid][$aFormNames[$i]])) == false) {
+                                writeToErrorLog('ERROR: ' . $aFormNames[$i] . '.json save failed');
+                            }
+                            fclose($pFile);
+                        }
+                    }
+                    // Ressources JS
+                    if (!empty($this->aVmapObjects['calques_forms'][$sOid]['ressources']['js'])) {
+                        $aFormNames = ['default', 'custom', 'published'];
+                        for ($i = 0; $i < count($aFormNames); $i++) {
+                            if (!empty($this->aVmapObjects['calques_forms'][$sOid]['ressources']['js'][$aFormNames[$i]])) {
+                                $pFile = fopen($sFormsDir . '/forms/ressources/' . $aFormNames[$i] . '.js', 'w');
+                                if (fwrite($pFile, $this->aVmapObjects['calques_forms'][$sOid]['ressources']['js'][$aFormNames[$i]]) == false) {
+                                    writeToErrorLog('ERROR: ' . $aFormNames[$i] . '.js save failed');
+                                }
+                                fclose($pFile);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Import themes des Calques
+
+    /**
+     * Import des themes de calques vMap
+     * @param array $aCalqueThemes
+     */
+    function importVMapCalqueThemes($aCalqueThemes) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aCalqueThemes); $i++) {
+            if (!empty($aCalqueThemes[$i]['name'])) {
+                $aExistingCalqueThemes = $this->getSameNameCalqueThemes($aCalqueThemes[$i]);
+                if (count($aExistingCalqueThemes) > 0) {
+                    for ($ii = 0; $ii < count($aExistingCalqueThemes); $ii++) {
+                        if (!empty($aExistingCalqueThemes[$ii]['layertheme_id'])) {
+                            $sNewId = $this->updateVMapCalqueTheme($aCalqueThemes[$i], $aExistingCalqueThemes[$ii]['layertheme_id']);
+                            $this->replaceOccurences($aCalqueThemes[$i]['layertheme_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapCalqueTheme($aCalqueThemes[$i]);
+                    $this->replaceOccurences($aCalqueThemes[$i]['layertheme_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les themes de calque ayant le même nom
+     * @param array $aCalqueTheme
+     * @return array
+     */
+    function getSameNameCalqueThemes($aCalqueTheme) {
+        $aExistingCalqueThemes = $this->oVexGetter->getVMapCalqueThemes($aCalqueTheme['name']);
+        return $aExistingCalqueThemes;
+    }
+
+    /**
+     * Crée un nouveau theme de calque
+     * @param array $aCalqueTheme
+     */
+    function addVMapCalqueTheme($aCalqueTheme) {
+        require_once 'LayerThemes.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['layertheme_id'];
+
+        // Options à passer
+        $aPath = ['vmap', 'layerthemes'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aCalqueTheme as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new LayerThemes($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['layertheme_id'])) {
+                $sReturnedId = $oVitisObject->aFields['layertheme_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un theme de calque existant
+     * @param array $aCalqueTheme
+     * @param string $sCalqueThemeId identifiant de la calque à mettre à jour
+     */
+    function updateVMapCalqueTheme($aCalqueTheme, $sCalqueThemeId) {
+        require_once 'LayerThemes.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['layertheme_id'];
+
+        // Options à passer
+        $aPath = ['vmap', 'layerthemes', $sCalqueThemeId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sCalqueThemeId
+        );
+        foreach ($aCalqueTheme as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new LayerThemes($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['layertheme_id'])) {
+                $sReturnedId = $oVitisObject->aFields['layertheme_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    // Import événements
+
+    /**
+     * Import les événements vMap
+     * @param array $aEvents
+     */
+    function importVMapEvents($aEvents) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aEvents); $i++) {
+            if (!empty($aEvents[$i]['event_id'])) {
+                $aExistingEvents = $this->getSameNameEvents($aEvents[$i]);
+                if (count($aExistingEvents) > 0) {
+                    for ($ii = 0; $ii < count($aExistingEvents); $ii++) {
+                        if (!empty($aExistingEvents[$ii]['event_id'])) {
+                            $sNewId = $this->updateVMapEvent($aEvents[$i], $aExistingEvents[$ii]['event_id']);
+                            $this->replaceOccurences($aEvents[$i]['event_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapEvent($aEvents[$i]);
+                    $this->replaceOccurences($aEvents[$i]['event_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les événements ayant le même nom
+     * @param array $aEvent
+     * @return array
+     */
+    function getSameNameEvents($aEvent) {
+        $aExistingEvents = $this->oVexGetter->getVMapEvents($aEvent['event_id']);
+        return $aExistingEvents;
+    }
+
+    /**
+     * Crée un nouvel événement
+     * @param array $aEvent
+     */
+    function addVMapEvent($aEvent) {
+        require_once 'BusinessObjectEvents.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [];
+
+        // Options à passer
+        $aPath = ['vmap', 'businessobjectevents'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aEvent as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new BusinessObjectEvents($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['event_id'])) {
+                $sReturnedId = $oVitisObject->aFields['event_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un événement existant
+     * @param array $aEvent
+     * @param string $sEventId identifiant de la service à mettre à jour
+     */
+    function updateVMapEvent($aEvent, $sEventId) {
+        require_once 'BusinessObjectEvents.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [];
+
+        // Options à passer
+        $aPath = ['vmap', 'businessobjectevents', $sEventId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sEventId
+        );
+        foreach ($aEvent as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new BusinessObjectEvents($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['event_id'])) {
+                $sReturnedId = $oVitisObject->aFields['event_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    // Import objets métier
+
+    /**
+     * Import les objets métier vMap
+     * @param array $aBusinessObjects
+     */
+    function importVMapBusinessObjects($aBusinessObjects) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aBusinessObjects); $i++) {
+            if (!empty($aBusinessObjects[$i]['business_object_id'])) {
+
+                // Remplacement de la balise [SCHEMA_NAME] dans sql summary / list
+                $aBusinessObjects[$i]['sql_summary'] = preg_replace('/\[SCHEMA_NAME\]/', $this->aValues['schema'], $aBusinessObjects[$i]['sql_summary']);
+                $aBusinessObjects[$i]['sql_list'] = preg_replace('/\[SCHEMA_NAME\]/', $this->aValues['schema'], $aBusinessObjects[$i]['sql_list']);
+
+                $aExistingBusinessObjects = $this->getSameNameBusinessObjects($aBusinessObjects[$i]);
+                if (count($aExistingBusinessObjects) > 0) {
+                    for ($ii = 0; $ii < count($aExistingBusinessObjects); $ii++) {
+                        if (!empty($aExistingBusinessObjects[$ii]['business_object_id'])) {
+                            $sNewId = $this->updateVMapBusinessObject($aBusinessObjects[$i], $aExistingBusinessObjects[$ii]['business_object_id']);
+                            $this->importVMapBusinessObjectForms($sNewId);
+                            $this->replaceOccurences($aBusinessObjects[$i]['business_object_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapBusinessObject($aBusinessObjects[$i]);
+                    $this->importVMapBusinessObjectForms($sNewId);
+                    $this->replaceOccurences($aBusinessObjects[$i]['business_object_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les objets métier ayant le même nom
+     * @param array $aBusinessObject
+     * @return array
+     */
+    function getSameNameBusinessObjects($aBusinessObject) {
+        $aExistingBusinessObjects = $this->oVexGetter->getVMapBusinessObjects($aBusinessObject['business_object_id']);
+        return $aExistingBusinessObjects;
+    }
+
+    /**
+     * Crée un nouvel objets métier
+     * @param array $aBusinessObject
+     */
+    function addVMapBusinessObject($aBusinessObject) {
+        require_once 'BusinessObjects.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [];
+
+        // Options à passer
+        $aPath = ['vmap', 'businessobjects'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aBusinessObject as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new BusinessObjects($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['business_object_id'])) {
+                $sReturnedId = $oVitisObject->aFields['business_object_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un objets métier existant
+     * @param array $aBusinessObject
+     * @param string $sBusinessObjectId identifiant de la service à mettre à jour
+     */
+    function updateVMapBusinessObject($aBusinessObject, $sBusinessObjectId) {
+        require_once 'BusinessObjects.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = [];
+
+        // Options à passer
+        $aPath = ['vmap', 'businessobjects', $sBusinessObjectId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sBusinessObjectId
+        );
+        foreach ($aBusinessObject as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new BusinessObjects($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['business_object_id'])) {
+                $sReturnedId = $oVitisObject->aFields['business_object_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Importe les formulaires de l'objet métier
+     * @param string $sBusinessObjectId
+     */
+    function importVMapBusinessObjectForms($sBusinessObjectId) {
+        if (!empty($sBusinessObjectId)) {
+            if (!empty($this->aVmapObjects['business_objects_forms'])) {
+                if (!empty($this->aVmapObjects['business_objects_forms'][$sBusinessObjectId])) {
+
+                    $sFormsDir = $this->aProperties['ws_data_dir'] . '/vmap/business_object/' . $sBusinessObjectId;
+                    if (!is_dir($sFormsDir)) {
+                        mkdir($sFormsDir, 0777, true);
+                    }
+                    if (!is_dir($sFormsDir . '/forms')) {
+                        mkdir($sFormsDir . '/forms', 0777, true);
+                    }
+                    if (!is_dir($sFormsDir . '/forms/ressources')) {
+                        mkdir($sFormsDir . '/forms/ressources', 0777, true);
+                    }
+
+                    // Formulaires JSON
+                    $aFormNames = ['default', 'custom', 'published'];
+                    for ($i = 0; $i < count($aFormNames); $i++) {
+
+                        $sFormContent = json_encode($this->aVmapObjects['business_objects_forms'][$sBusinessObjectId][$aFormNames[$i]]);
+
+                        if (!empty($sFormContent)) {
+
+                            $aPatterns = [
+                                '/\[DATABASE_NAME\]/',
+                                '/\[SCHEMA_NAME\]/'
+                            ];
+                            $aReplacements = [
+                                $this->aValues['database'],
+                                $this->aValues['schema']
+                            ];
+                            $sFormContent = preg_replace($aPatterns, $aReplacements, $sFormContent);
+
+                            $pFile = fopen($sFormsDir . '/forms/' . $aFormNames[$i] . '.json', 'w');
+                            if (fwrite($pFile, $sFormContent) == false) {
+                                writeToErrorLog('ERROR: ' . $aFormNames[$i] . '.json save failed');
+                            }
+                            fclose($pFile);
+                        }
+                    }
+                    // Ressources JS
+                    if (!empty($this->aVmapObjects['business_objects_forms'][$sBusinessObjectId]['ressources']['js'])) {
+                        $aFormNames = ['default', 'custom', 'published'];
+                        for ($i = 0; $i < count($aFormNames); $i++) {
+                            if (!empty($this->aVmapObjects['business_objects_forms'][$sBusinessObjectId]['ressources']['js'][$aFormNames[$i]])) {
+                                $pFile = fopen($sFormsDir . '/forms/ressources/' . $aFormNames[$i] . '.js', 'w');
+                                if (fwrite($pFile, $this->aVmapObjects['business_objects_forms'][$sBusinessObjectId]['ressources']['js'][$aFormNames[$i]]) == false) {
+                                    writeToErrorLog('ERROR: ' . $aFormNames[$i] . '.js save failed');
+                                }
+                                fclose($pFile);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Import rapports
+
+    /**
+     * Import des rapports vMap
+     * @param array $aReports
+     */
+    function importVMapReports($aReports) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aReports); $i++) {
+            if (!empty($aReports[$i]['name'])) {
+                $aExistingReports = $this->getSameNameReports($aReports[$i]);
+                if (count($aExistingReports) > 0) {
+                    for ($ii = 0; $ii < count($aExistingReports); $ii++) {
+                        if (!empty($aExistingReports[$ii]['printreport_id'])) {
+                            $sNewId = $this->updateVMapReport($aReports[$i], $aExistingReports[$ii]['printreport_id']);
+                            $this->replaceOccurences($aReports[$i]['printreport_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapReport($aReports[$i]);
+                    $this->replaceOccurences($aReports[$i]['printreport_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les rapports ayant le même nom
+     * @param array $aReport
+     * @return array
+     */
+    function getSameNameReports($aReport) {
+        $aExistingReports = $this->oVexGetter->getVMapReports($aReport['name']);
+        return $aExistingReports;
+    }
+
+    /**
+     * Crée un nouveau rapport
+     * @param array $aReport
+     */
+    function addVMapReport($aReport) {
+        require_once 'PrintReports.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['printreport_id'];
+
+
+        // Options à passer
+        $aPath = ['vmap', 'printreports'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet']
+        );
+        foreach ($aReport as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new PrintReports($aPath, $aValues, $this->aProperties);
+        $oVitisObject->POST();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['printreport_id'])) {
+                $sReturnedId = $oVitisObject->aFields['printreport_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour un rapport existant
+     * @param array $aReport
+     * @param string $sReportId identifiant de la service à mettre à jour
+     */
+    function updateVMapReport($aReport, $sReportId) {
+        require_once 'PrintReports.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['printreport_id'];
+
+
+        // Options à passer
+        $aPath = ['vmap', 'printreports', $sReportId];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sReportId
+        );
+        foreach ($aReport as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        $oVitisObject = new PrintReports($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+
+        $sReturnedId = false;
+        if (!empty($oVitisObject->aFields)) {
+            if (!empty($oVitisObject->aFields['printreport_id'])) {
+                $sReturnedId = $oVitisObject->aFields['printreport_id'];
+            }
+        }
+        return $sReturnedId;
+    }
+
+    // Import couches Mapserver
+
+    /**
+     * Import les couches mapserver vMap
+     * @param array $aVm4msLayers
+     */
+    function importVMapVm4msLayers($aVm4msLayers) {
+        $aReturn = [];
+        for ($i = 0; $i < count($aVm4msLayers); $i++) {
+            if (!empty($aVm4msLayers[$i]['name'])) {
+                $aExistingVm4msLayers = $this->getSameNameVm4msLayers($aVm4msLayers[$i]);
+                if (count($aExistingVm4msLayers) > 0) {
+                    for ($ii = 0; $ii < count($aExistingVm4msLayers); $ii++) {
+                        if (!empty($aExistingVm4msLayers[$ii]['ms_layer_id'])) {
+                            $sNewId = $this->updateVMapVm4msLayer($aVm4msLayers[$i], $aExistingVm4msLayers[$ii]['ms_layer_id']);
+                            $this->replaceOccurences($aVm4msLayers[$i]['ms_layer_id'], $sNewId);
+                            array_push($aReturn, $sNewId);
+                        }
+                    }
+                } else {
+                    $sNewId = $this->addVMapVm4msLayer($aVm4msLayers[$i]);
+                    $this->replaceOccurences($aVm4msLayers[$i]['ms_layer_id'], $sNewId);
+                    array_push($aReturn, $sNewId);
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les couches mapserver ayant le même nom
+     * @param array $aVm4msLayer
+     * @return array
+     */
+    function getSameNameVm4msLayers($aVm4msLayer) {
+        // Attributs à ne pas envoyer
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'attributs' => implode('|', ['ms_layer_id', 'name', 'tableschema', 'tablename', 'connection_id']),
+            'filter' => '{"column": "name", "compare_operator": "=", "value": "' . $aVm4msLayer['name'] . '"}'
+        );
+
+        // Ferme temporairement la session
+        session_write_close();
+
+        // Envoie une requête curl pour ajouter la couche Mapserver
+        $sUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'] . '/vm4ms/layers';
+        $ch = curl_init($sUrl);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json", "X-HTTP-Method-Override: GET"));
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $aValues);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        $sResponse = curl_exec($ch);
+        curl_close($ch);
+
+        // Ouvre à nouveau la session
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        $sReturnedId = false;
+        $aResponse = json_decode($sResponse, true);
+
+        $aExistingVm4msLayers = [];
+        if (!empty($aResponse['layers'])) {
+            $aExistingVm4msLayers = $aResponse['layers'];
+        }
+        return $aExistingVm4msLayers;
+    }
+
+    /**
+     * Crée une nouvelle couche mapverver
+     * @param array $aVm4msLayer
+     */
+    function addVMapVm4msLayer($aVm4msLayer) {
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['ms_layer_id'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+        );
+
+        foreach ($aVm4msLayer as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        // Ferme temporairement la session
+        session_write_close();
+
+        // Envoie une requête curl pour ajouter la couche Mapserver
+        $sUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'] . '/vm4ms/layers';
+        $ch = curl_init($sUrl);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $aValues);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        $sResponse = curl_exec($ch);
+        curl_close($ch);
+
+        // Ouvre à nouveau la session
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        $sReturnedId = false;
+        $aResponse = json_decode($sResponse, true);
+
+        if (!empty($aResponse['ms_layer_id'])) {
+            $sReturnedId = $aResponse['ms_layer_id'];
+        }
+        return $sReturnedId;
+    }
+
+    /**
+     * Met à jour une couche Mapserver
+     * @param array $aVm4msLayer
+     * @param string $sVm4msLayerId identifiant de la service à mettre à jour
+     */
+    function updateVMapVm4msLayer($aVm4msLayer, $sVm4msLayerId) {
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['ms_layer_id'];
+        $aValues = array(
+            'token' => $this->aValues['token']
+        );
+
+        foreach ($aVm4msLayer as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+
+        // Ferme temporairement la session
+        session_write_close();
+
+        // Envoie une requête curl pour ajouter la couche Mapserver
+        $sUrl = $this->aProperties['web_server_name'] . '/' . $this->aProperties['services_alias'] . '/vm4ms/layers/' . $sVm4msLayerId;
+        $ch = curl_init($sUrl);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $aValues);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        $sResponse = curl_exec($ch);
+        curl_close($ch);
+
+        // Ouvre à nouveau la session
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        $sReturnedId = false;
+        $aResponse = json_decode($sResponse, true);
+
+        if (!empty($aResponse['ms_layer_id'])) {
+            $sReturnedId = $aResponse['ms_layer_id'];
+        }
+        return $sReturnedId;
+    }
+
+    // Import relation carte / calques
+
+    /**
+     * Importe les relations cartes calques
+     * @param Array $aMapCalques
+     */
+    function importVMapMapCalquesRelation($aMapCalques) {
+        // Association
+        for ($i = 0; $i < count($aMapCalques); $i++) {
+            if (!empty($aMapCalques[$i]['layer_id']) && !empty($aMapCalques[$i]['map_id'])) {
+                $this->updateVMapMapCalques($aMapCalques[$i]);
+            }
+        }
+
+        // Ordre
+        $aMaps = [];
+        for ($i = 0; $i < count($aMapCalques); $i++) {
+            if (empty($aMaps[$aMapCalques[$i]['map_id']])) {
+                $aMaps[$aMapCalques[$i]['map_id']] = [];
+            }
+            array_push($aMaps[$aMapCalques[$i]['map_id']], $aMapCalques[$i]);
+        }
+        foreach ($aMaps as $key => $value) {
+            $this->updateVMapMapCalquesSorting($aMaps[$key], $key);
+        }
+
+        return true;
+    }
+
+    /**
+     * Associe les calques à la carte
+     * @param array $aMapCalque
+     */
+    function updateVMapMapCalques($aMapCalque) {
+        require_once 'MapLayers.class.inc';
+
+        // Attributs à ne pas envoyer
+        $aUnusedValues = ['name', 'theme_name', 'layer_id'];
+
+        // Options à passer
+        $aPath = ['vmap', 'maplayers', $aMapCalque['map_id']];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $aMapCalque['map_id']
+        );
+        foreach ($aMapCalque as $key => $value) {
+            if (!in_array($key, $aUnusedValues)) {
+                $aValues[$key] = $value;
+            }
+        }
+        $aValues['map_layers'] = $aMapCalque['layer_id'];
+
+        $oVitisObject = new MapLayers($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+    }
+
+    /**
+     * Change l'ordre des calques dans la carte
+     * @param array $aMapCalques
+     * @param string $sMapId
+     */
+    function updateVMapMapCalquesSorting($aMapCalques, $sMapId) {
+        require_once 'MapLayers.class.inc';
+
+        $aLayerIds = [];
+        for ($i = 0; $i < count($aMapCalques); $i++) {
+            if (!empty($aMapCalques[$i]['layer_id'])) {
+                array_push($aLayerIds, $aMapCalques[$i]['layer_id']);
+            }
+        }
+
+        // Options à passer
+        $aPath = ['vmap', 'maplayers', $sMapId, 'sorting'];
+        $aValues = array(
+            'token' => $this->aValues['token'],
+            'output' => $this->aValues['output'],
+            'sEncoding' => $this->aValues['sEncoding'],
+            'sSourceEncoding' => $this->aValues['sSourceEncoding'],
+            'xslstylesheet' => $this->aValues['xslstylesheet'],
+            'my_vitis_id' => $sMapId
+        );
+
+        $aValues['map_id'] = $sMapId;
+        $aValues['map_layers'] = implode('|', $aLayerIds);
+
+        $oVitisObject = new MapLayers($aPath, $aValues, $this->aProperties);
+        $oVitisObject->PUT();
+    }
+
+    // Import des wervices web
+
+    /**
+     * Permet d'importer des services web
+     * @return type
+     */
+    function importWebServices() {
+        $this->aReturn = Array();
+
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        if (!isset($this->aValues['web_services'])) {
+            $oError = new VitisError(0, 'Parameter web_services required');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        /**
+         * Services web à importer
+         */
+        $this->aWebServices = json_decode($this->aValues['web_services'], true);
+
+        /**
+         * Gestion erreur contenu
+         */
+        if (!is_array($this->aWebServices)) {
+            $oError = new VitisError(0, 'web_services not valid');
+        }
+
+        if (!isset($oError)) {
+            $this->aReturn = $this->importWebServicesFiles($this->aWebServices);
+        }
+
+        if (isset($oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn = array(
+                'web_services' => $this->aReturn,
+                'status' => 1
+            );
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Import the web service files
+     * @param array $aWebServices
+     * @return array
+     */
+    function importWebServicesFiles($aWebServices) {
+        for ($i = 0; $i < count($aWebServices); $i++) {
+            if (!empty($aWebServices[$i]['name'] && !empty($aWebServices[$i]['files']))) {
+
+                // Création du dossier
+                $sWebServicePath = $this->aProperties['vas_home'] . '/rest/ws/' . $aWebServices[$i]['name'];
+                if (!is_dir($sWebServicePath)) {
+                    mkdir($sWebServicePath, 0777, true);
+                }
+
+                // Import des fichiers
+                foreach ($aWebServices[$i]['files'] as $key => $value) {
+                    $pFile = fopen($sWebServicePath . '/' . $key, 'w');
+                    if (fwrite($pFile, $aWebServices[$i]['files'][$key]) == false) {
+                        unset($aWebServices[$i]['files'][$key]);
+                        writeToErrorLog('ERROR: ' . $key . '. save failed');
+                    }
+                    fclose($pFile);
+                }
+            }
+        }
+        return $aWebServices;
+    }
+
+    // Import SQL
+
+    /**
+     * Permet d'importer la partie SQL d'un .vex
+     */
+    function importSQL() {
+
+        $this->aReturn = Array();
+
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+        }
+
+        if (!isset($this->aValues['sql_model']) || !isset($this->aValues['database']) || !isset($this->aValues['schema'])) {
+            $oError = new VitisError(0, 'Parameter sql_model, database, schema required');
+        }
+
+        /**
+         * Objet VexGetter permettant de recueillir des informations essentielles
+         */
+        $this->oVexGetter = new VexGetter($this->aPath, $this->aValues, $this->aProperties);
+
+        /**
+         * Modèle SQL importer
+         */
+        $this->sSQLModel = $this->aValues['sql_model'];
+
+        /**
+         * Données SQL importer
+         */
+        $this->sSQLData = $this->aValues['sql_data'];
+
+        /**
+         * Gestion erreur contenu
+         */
+        if (!is_string($this->sSQLModel)) {
+            $oError = $oError = new VitisError(0, 'sql_model no valid');
+        }
+
+        if (!isset($oError)) {
+            $sStringRequests = $this->sSQLModel;
+            if (is_string($this->sSQLData)) {
+                if (!empty($this->sSQLData)) {
+                    $sStringRequests .= $this->sSQLData;
+                }
+            }
+
+            // Récupère le contenu au format d'un tableau
+            $aArrayRequests = $this->getRequestsAsArray($sStringRequests);
+
+            if ($aArrayRequests !== false) {
+
+                // Récupère la liste des tables, vues etc..
+                $aSQLComponents = $this->oVexGetter->getSQLGrantableObjectsFromLines($aArrayRequests);
+
+                // Enlève les les commentaires et lignes vides
+                $aArrayRequests = $this->cleanArrayRequests($aArrayRequests);
+
+                // Concatène les requêtes et retourne une chaine de caractère
+                $sSQLRequests = $this->concatArrayRequests($aArrayRequests);
+
+                // Éxécute les requêtes
+                $bSQLImported = $this->executeSQLRequests($sSQLRequests, $this->aValues['database']);
+
+                // Reprojette les données si besoin
+                if (!empty($this->aValues['srid'])) {
+                    $this->updateTablesSRID($aSQLComponents, $this->aValues['srid']);
+                }
+
+                $this->aReturn = $bSQLImported;
+            }
+        }
+
+        if (isset($oError)) {
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn = array(
+                'sql' => $this->aReturn,
+                'status' => 1
+            );
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Parse les requêtes contenant des sauts à la ligne etc.. et retourne un tableau
+     * @param string $sStringRequests
+     * @return array
+     */
+    function getRequestsAsArray($sStringRequests) {
+
+        $sTmpPath = $this->aProperties['vas_home'] . '/tmp/' . $this->UniqFileName();
+
+        $pFile = fopen($sTmpPath, 'w');
+        if (fwrite($pFile, $sStringRequests) == false) {
+            return false;
+        }
+        fclose($pFile);
+
+        $aArrayRequests = file($sTmpPath);
+
+        unlink($sTmpPath);
+        return $aArrayRequests;
+    }
+
+    /**
+     * Delete the white spaces and comments from the data-model file array vue
+     * @param array $aArrayRequests
+     * @return array
+     */
+    function cleanArrayRequests($aArrayRequests) {
+
+        for ($i = count($aArrayRequests) - 1; $i >= 0; $i--) {
+            // Supprime les espaces
+            $aArrayRequests[$i] = trim($aArrayRequests[$i]);
+            // Supprime les lignes vides
+            if ($aArrayRequests[$i] === '') {
+                unset($aArrayRequests[$i]);
+            } else {
+                // Supprime les commentaires
+                if (substr($aArrayRequests[$i], 0, 2) === '--') {
+                    unset($aArrayRequests[$i]);
+                } else {
+                    // Supprime SET idle_in_transaction_session_timeout = 0;
+                    if (substr($aArrayRequests[$i], 0, 39) == 'SET idle_in_transaction_session_timeout') {
+                        unset($aArrayRequests[$i]);
+                    }
+                }
+            }
+        }
+        // Redonne les bons index
+        $aArrayRequests2 = Array();
+        foreach ($aArrayRequests as $key => $value) {
+            array_push($aArrayRequests2, $value);
+        }
+        $aArrayRequests = $aArrayRequests2;
+
+        return $aArrayRequests;
+    }
+
+    /**
+     * Concatène les requêtes présentes dans $aArrayRequests
+     * @param array $aArrayRequests
+     * @return string
+     */
+    function concatArrayRequests($aArrayRequests) {
+
+        $sStringContents = '';
+        for ($i = 0; $i < count($aArrayRequests); $i++) {
+            $sStringContents .= $aArrayRequests[$i] . ' ';
+        }
+
+        return $sStringContents;
+    }
+
+    /**
+     * Execute the data-model requests
+     * @param array $aFileRequests
+     * @return array results
+     */
+    function executeSQLRequests($sSQLRequests, $sDatabase) {
+
+        // Connexion avec uVitis
+        $oBD = new Vm($this->aProperties['owner_login'], $this->aProperties['owner_pass'], $sDatabase, $this->aProperties['server'], $this->aProperties['port'], $this->aProperties['sgbd'], $this->aProperties['page_encoding']);
+        $this->oConnection->oBd = $oBD;
+
+        $this->oConnection->oBd->demarreTransaction();
+
+        $bError = false;
+        $oPDOresult = $this->oConnection->oBd->executeBlock($sSQLRequests);
+
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $bError = true;
+        } else {
+            $aResults = $this->oConnection->oBd->getResultTableAssoc($oPDOresult);
+        }
+
+        if ($bError) {
+            $this->oConnection->oBd->annuleTransaction();
+            return false;
+        } else {
+            $this->oConnection->oBd->termineTransaction();
+            return true;
+        }
+    }
+
+    /**
+     * Update and transform the tables SRID
+     * @param array $aSQLComponents
+     * @param string $sSRID
+     */
+    function updateTablesSRID($aSQLComponents, $sSRID) {
+
+        $aTables = $this->getTablesFromSQLComponents($aSQLComponents);
+        if (is_array($aTables)) {
+            for ($i = 0; $i < count($aTables); $i++) {
+                $aGeomColumns = $this->getGeometryColumns($this->aValues['schema'], $aTables[$i]);
+                if (is_array($aGeomColumns)) {
+                    for ($ii = 0; $ii < count($aGeomColumns); $ii++) {
+                        $this->updateTableColumnSRID($this->aValues['schema'], $aTables[$i], $aGeomColumns[$ii], $sSRID);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Get a table list from $aSQLComponents
+     * @param array $aSQLComponents
+     * @return array
+     */
+    function getTablesFromSQLComponents($aSQLComponents) {
+        $aTables = [];
+        for ($i = 0; $i < count($aSQLComponents); $i++) {
+            if ($aSQLComponents[$i]['type'] === 'TABLE') {
+                if (!empty($aSQLComponents[$i]['name'])) {
+                    array_push($aTables, $aSQLComponents[$i]['name']);
+                }
+            }
+        }
+        return $aTables;
+    }
+
+    /**
+     * Get the geometry columns from a table
+     * @param string $sSchema
+     * @param string $sTable
+     * @return array
+     */
+    function getGeometryColumns($sSchema, $sTable) {
+        require 'Vex.class.sql.inc';
+        $aColumn = Array();
+        $sSql = $aSql['getGeometryColumns'];
+
+        $aSqlParams = array(
+            'sSchemaFramework' => array('value' => $sSchema, 'type' => 'column_name'),
+            'sTable' => array('value' => $sTable, 'type' => 'column_name')
+        );
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSqlParams);
+
+        // vide si postGis n'est pas installé
+        if (!empty($oResult)) {
+            while ($aObject = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                array_push($aColumn, $aObject['f_geometry_column']);
+            }
+        }
+
+        return $aColumn;
+    }
+
+    /**
+     * Update the table column srid and transform his data
+     * @param string $sSchema
+     * @param string $sTable
+     * @param string $sColumn
+     * @param string $sSRID
+     */
+    function updateTableColumnSRID($sSchema, $sTable, $sColumn, $sSRID) {
+        require 'Vex.class.sql.inc';
+
+        $oResult = $this->oConnection->oBd->executeWithParams('SET search_path TO public', []);
+
+        $aSqlParams = array(
+            'sSchema' => array('value' => $sSchema, 'type' => 'quoted_string'),
+            'sTable' => array('value' => $sTable, 'type' => 'quoted_string'),
+            'sColumn' => array('value' => $sColumn, 'type' => 'quoted_string'),
+            'iSRID' => array('value' => $sSRID, 'type' => 'number')
+        );
+        $oResult = $this->oConnection->oBd->executeWithParams($aSql['updateTableColumnSRID'], $aSqlParams);
+    }
+
+}
+
+?>
diff --git a/web_service/ws/VexParser.class.inc b/web_service/ws/VexParser.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..ffd2e304498ea0b26affe82f06f0e08d407a25b1
--- /dev/null
+++ b/web_service/ws/VexParser.class.inc
@@ -0,0 +1,334 @@
+<?php
+
+/**
+ * \file VexParser.class.inc
+ * \class VexParser
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ *
+ * 	\brief This file contains the VexParser php class
+ *
+ * This class defines php functions to export VEX files
+ *
+ */
+require_once 'Vex.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Form.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+require_once 'vmlib/logUtil.inc';
+
+/**
+ * Classe contenant les fonctions permettant de récupérer
+ * les informations sur les différents objets à exporter
+ */
+class VexParser extends Vmap {
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * Parse un vex et retourne son contenu au format JSON
+     * @return string
+     */
+    function parseVex() {
+
+        $this->aReturn = Array();
+
+        if (!in_array('vitis_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vmap_admin', $this->oConnection->aPrivileges) ||
+                !in_array('vm4ms_admin', $this->oConnection->aPrivileges)) {
+            $oError = new VitisError(0, 'insufficient privileges (needs to be vitis_admin, vmap_admin and vm4ms_admin)');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+        if (!isset($_FILES['vex_file'])) {
+            $oError = new VitisError(0, 'vex_file not found');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // Nom du fichier recu
+        $this->sFileName = $_FILES['vex_file']['name'];
+
+        // Nom du dossier décompressé
+        $this->sFolderName = str_replace('.vex', '', $this->sFileName);
+
+        // Test format du package
+        if (substr($this->sFileName, -4) !== '.vex') {
+            $oError = new VitisError(0, 'Package not valid');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // Dossier temporaire
+        $this->sTmpFolder = $this->createTmpFolder();
+
+        // Dossier décompressé
+        $this->sFolderPath = $this->sTmpFolder . '/' . $this->sFolderName;
+
+        if (!is_dir($this->sFolderPath)) {
+            $oError = new VitisError(0, 'Package not valid 2');
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        }
+
+        // Contenu SQL
+        $aSqlContent = $this->getSQLFromVexContent($this->sFolderPath);
+        if (!empty($aSqlContent['export_model_sql'])) {
+            $this->aReturn['sql'] = $aSqlContent;
+        }
+
+        // Objets vMap
+        $aVMapObjectsDef = $this->getVMapObjectsDefFromVexContent($this->sFolderPath);
+        if (!empty($aVMapObjectsDef)) {
+            $this->aReturn['vmap_objects'] = $aVMapObjectsDef;
+        }
+
+        // Services Web
+        $aWebServicesNames = $this->getWebServicesNamesFromVexContent($this->sFolderPath);
+        if (!empty($aWebServicesNames)) {
+            $this->aReturn['web_services'] = $aWebServicesNames;
+        }
+
+        // Supprime le dossier temporaire
+        $this->deleteTmpFolder($this->sTmpFolder);
+
+        if (isset($this->oError)) {
+            $oError = new VitisError(1, $this->oError->getMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif (isset($this->oConnection->oError)) {
+            $oError = $this->oConnection->oError;
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } elseif ($this->oConnection->oBd->enErreur()) {
+            $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            $aXmlRacineAttribute['status'] = 0;
+            $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            return $sMessage;
+        } else {
+            $this->aReturn = array(
+                'vex' => $this->aReturn,
+                'status' => 1
+            );
+            return json_encode($this->aReturn);
+        }
+    }
+
+    /**
+     * Crée un répertoire temporaire de travail
+     * @return string
+     */
+    function createTmpFolder() {
+        $sTmpName = $this->UniqFileName();
+        $sTmpPath = $this->aProperties['vas_home'] . '/tmp/' . $sTmpName;
+        if (is_dir($sTmpPath)) {
+            clearDir($sTmpPath);
+        }
+        // Dézippe le contennu dans un dossier dans tmp
+        $this->postFileSave('vex_file', '../../tmp/', $sTmpName);
+        unZip($sTmpPath . '/' . $this->sFileName, $sTmpPath . '/' . $this->sFolderName);
+
+        return $sTmpPath;
+    }
+
+    /**
+     * Supprime le répertoire temporaire
+     * @param string $sTmpPath
+     */
+    function deleteTmpFolder($sTmpPath) {
+        if (is_dir($sTmpPath)) {
+            clearDir($sTmpPath);
+        }
+    }
+
+    /**
+     * Récupère le contenu SQL
+     * @param string $sFolderPath
+     * @return array
+     */
+    function getSQLFromVexContent($sFolderPath) {
+        $aReturn = [];
+        if (is_dir($sFolderPath . '/sql')) {
+            if (is_file($sFolderPath . '/sql/export_model_sql.sql')) {
+                $aReturn['export_model_sql'] = file_get_contents($sFolderPath . '/sql/export_model_sql.sql');
+                if (is_file($sFolderPath . '/sql/export_data_sql.sql')) {
+                    $aReturn['export_data_sql'] = file_get_contents($sFolderPath . '/sql/export_data_sql.sql');
+                }
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les définitions des objets vMap
+     * @param string $sFolderPath
+     * @return array
+     */
+    function getVMapObjectsDefFromVexContent($sFolderPath) {
+        $aReturn = [];
+        if (is_dir($sFolderPath . '/vmap_objects')) {
+
+            // Objets métier
+            if (is_file($sFolderPath . '/vmap_objects/business_objects.json')) {
+                $aReturn['business_objects'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/business_objects.json'), true);
+                $aReturn['business_objects_forms'] = $this->getObjectForms($sFolderPath . '/vmap_objects/business_objects_forms');
+            }
+
+            // Calques
+            if (is_file($sFolderPath . '/vmap_objects/calques.json')) {
+                $aReturn['calques'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/calques.json'), true);
+                $aReturn['calques_forms'] = $this->getObjectForms($sFolderPath . '/vmap_objects/calques_forms');
+            }
+
+            // Thèmes des calques
+            if (is_file($sFolderPath . '/vmap_objects/layerthemes.json')) {
+                $aReturn['calque_themes'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/layerthemes.json'), true);
+            }
+
+            // Events
+            if (is_file($sFolderPath . '/vmap_objects/events.json')) {
+                $aReturn['events'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/events.json'), true);
+            }
+
+            // Relation carte calque
+            if (is_file($sFolderPath . '/vmap_objects/map_layer.json')) {
+                $aReturn['map_layer'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/map_layer.json'), true);
+            }
+
+            // Cartes
+            if (is_file($sFolderPath . '/vmap_objects/maps.json')) {
+                $aReturn['maps'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/maps.json'), true);
+            }
+
+            // Rapports
+            if (is_file($sFolderPath . '/vmap_objects/reports.json')) {
+                $aReturn['reports'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/reports.json'), true);
+            }
+
+            // Services
+            if (is_file($sFolderPath . '/vmap_objects/services.json')) {
+                $aReturn['services'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/services.json'), true);
+            }
+
+            // Couches Mapserver
+            if (is_file($sFolderPath . '/vmap_objects/vm4ms_layers.json')) {
+                $aReturn['vm4ms_layers'] = json_decode(file_get_contents($sFolderPath . '/vmap_objects/vm4ms_layers.json'), true);
+            }
+        }
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les définitions des formulaires vMap
+     * @param string $sFolderPath
+     * @return array
+     */
+    function getObjectForms($sFolderPath) {
+        $aForms = [];
+        if (is_dir($sFolderPath)) {
+            chdir($sFolderPath);
+            $aDirs = glob('*', GLOB_ONLYDIR);
+            for ($i = 0; $i < count($aDirs); $i++) {
+                $sObjectDirPath = $sFolderPath . '/' . $aDirs[$i];
+                if (is_dir($sObjectDirPath)) {
+                    $aForms[$aDirs[$i]] = $this->getObjectFormsFromPath($sObjectDirPath);
+                }
+            }
+        }
+        return $aForms;
+    }
+
+    /**
+     * Get the forms of a vMap object
+     * @param string $sFormsPath
+     * @return array
+     */
+    function getObjectFormsFromPath($sFormsPath) {
+        $aReturn = [];
+
+        if (is_file($sFormsPath . '/custom.json')) {
+            $aReturn['custom'] = json_decode(file_get_contents($sFormsPath . '/custom.json'), true);
+        }
+        if (is_file($sFormsPath . '/default.json')) {
+            $aReturn['default'] = json_decode(file_get_contents($sFormsPath . '/default.json'), true);
+        }
+        if (is_file($sFormsPath . '/published.json')) {
+            $aReturn['published'] = json_decode(file_get_contents($sFormsPath . '/published.json'), true);
+        }
+        if (is_dir($sFormsPath . '/ressources')) {
+            $aReturn['ressources'] = array();
+            if (is_file($sFormsPath . '/ressources/custom.js')) {
+                $aReturn['ressources']['js']['custom'] = file_get_contents($sFormsPath . '/ressources/custom.js');
+            }
+            if (is_file($sFormsPath . '/ressources/default.js')) {
+                $aReturn['ressources']['js']['default'] = file_get_contents($sFormsPath . '/ressources/default.js');
+            }
+            if (is_file($sFormsPath . '/ressources/published.js')) {
+                $aReturn['ressources']['js']['published'] = file_get_contents($sFormsPath . '/ressources/published.js');
+            }
+            if (is_file($sFormsPath . '/ressources/custom.css')) {
+                $aReturn['ressources']['css']['custom'] = file_get_contents($sFormsPath . '/ressources/custom.css');
+            }
+            if (is_file($sFormsPath . '/ressources/default.css')) {
+                $aReturn['ressources']['css']['default'] = file_get_contents($sFormsPath . '/ressources/default.css');
+            }
+            if (is_file($sFormsPath . '/ressources/published.css')) {
+                $aReturn['ressources']['css']['published'] = file_get_contents($sFormsPath . '/ressources/published.css');
+            }
+        }
+
+        return $aReturn;
+    }
+
+    /**
+     * Récupère les noms des services web
+     * @param string $sFolderPath
+     * @return array
+     */
+    function getWebServicesNamesFromVexContent($sFolderPath) {
+        $aReturn = [];
+        if (is_dir($sFolderPath . '/web_services')) {
+
+            // Liste des répertoires contennus dans web_services
+            chdir($sFolderPath . '/web_services');
+            $aDirs = glob('*', GLOB_ONLYDIR);
+            for ($i = 0; $i < count($aDirs); $i++) {
+
+                // Dossier
+                $aFolder = ['name' => $aDirs[$i]];
+
+                // Fichiers
+                chdir($sFolderPath . '/web_services/' . $aDirs[$i]);
+                $aFolder['files'] = [];
+                $aFiles = glob('*');
+                for ($ii = 0; $ii < count($aFiles); $ii++) {
+                    if (is_file($sFolderPath . '/web_services/' . $aDirs[$i] . '/' . $aFiles[$ii])) {
+                        $aFolder['files'][$aFiles[$ii]] = utf8_encode(file_get_contents($sFolderPath . '/web_services/' . $aDirs[$i] . '/' . $aFiles[$ii]));
+                    }
+                }
+
+                array_push($aReturn, $aFolder);
+            }
+        }
+        return $aReturn;
+    }
+
+}
+
+?>
diff --git a/web_service/ws/Vmap.class.inc b/web_service/ws/Vmap.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..80214f81e5cba93c54033554d7ebd2fcaec033c0
--- /dev/null
+++ b/web_service/ws/Vmap.class.inc
@@ -0,0 +1,226 @@
+<?php
+
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/class/vitis_lib/DbClass.class.inc";
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+
+require_once 'vmlib/logUtil.inc';
+
+class Vmap extends Vitis {
+
+    //Chemin du fichier de ressources contenant les requêtes SQL
+    var $sRessourcesFile = "ws/vmap/Vmap.class.sql.inc";
+
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     *
+     * @param string $sSchema
+     * @param string $sTable
+     * @param string $aAttributs
+     * @param string|array $sFilter
+     * @param array $aOptions
+     * @param array $aParams
+     */
+    function vmapGet($sSchema, $sTable, $aAttributs, $sFilter, $aOptions = array(), $aOptionalParams = array()) {
+
+        if ($this->oConnection->oError != null) {
+            $oError = $this->oConnection->oError;
+            return 0;
+        }
+
+        if (strlen($sSchema) == 0) {
+            $oError = 'vmapGet: $sSchema not defined';
+            writeToErrorLog('error: ' . $oError);
+            return 0;
+        }
+
+        if (strlen($sTable) == 0) {
+            $oError = 'vmapGet: $sTable not defined';
+            writeToErrorLog('error: ' . $oError);
+            return 0;
+        }
+
+        if (sizeof($aAttributs) == 0) {
+            $oError = 'vmapGet: $aAttributs not defined';
+            writeToErrorLog('error: ' . $oError);
+            return 0;
+        }
+
+        if (is_array($sFilter) || is_object($sFilter)) {
+            $sFilter = json_encode($sFilter, true);
+        } else if (is_string($sFilter)) {
+            $sFilter = $sFilter;
+        } else {
+            $oError = 'vmapGet: $sFilter type not supported';
+            writeToErrorLog('error: ' . $oError);
+            return 0;
+        }
+
+        // SQL Request building
+        $aSqlParams = array(
+            'sSchema' => array('value' => $sSchema, 'type' => 'column_name'),
+            'sTable' => array('value' => $sTable, 'type' => 'column_name')
+        );
+
+        $aSqlParams = array_merge($aSqlParams, $aOptionalParams);
+
+        $sSql = "SELECT ";
+
+        // Set the attributs string
+        $sAttributs = "";
+        if ($aAttributs[0] == "") {
+            $sAttributs = "*";
+        } else {
+            for ($i = 0; $i < sizeof($aAttributs); $i++) {
+                if ($i > 0) {
+                    $sAttributs .= ", ";
+                }
+                if (strpos($aAttributs[$i], "(") == FALSE && strpos($aAttributs[$i], ")") == FALSE && strpos(strtolower($aAttributs[$i]), " as ") == FALSE) {
+                    $sAttributKey = 'attribute_' . vitisUniqId();
+                    $aSqlParams[$sAttributKey] = array('value' => $aAttributs[$i], 'type' => 'column_name');
+                    $sAttributs .= "\"[" . $sAttributKey . "]\"";
+                } else {
+                    // Attention: Injection possible!
+                    $sAttributs .= $aAttributs[$i];
+                }
+            }
+        }
+        $sSql .= $sAttributs . " FROM [sSchema].[sTable]";
+
+        if (!empty($sFilter)) {
+            // filtre
+            $aDecodedFilter = $this->decodeJSONFilter($sFilter, $sSchema, $sTable);
+
+            // Ajout dans la requête
+            $sSecuredFilter = $aDecodedFilter['request'];
+            // Ajout des paramètres
+            foreach ($aDecodedFilter['params'] as $key => $value) {
+                $aSqlParams[$key] = $value;
+            }
+            // Ajout du filtre dans la requête
+            if (!empty(trim($sSecuredFilter))) {
+                if (strpos($sSql, " WHERE ") == FALSE) {
+                    $sSql .= " WHERE " . $sSecuredFilter;
+                } else {
+                    $sSql .= " AND " . $sSecuredFilter;
+                }
+            }
+        }
+
+        // Options
+        foreach ($aOptions as $key => $value) {
+            switch (strtoupper($key)) {
+                case 'LIMIT':
+                    $aSqlParams['limit'] = array('value' => $value, 'type' => 'number');
+                    $sSql .= " LIMIT [limit]";
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSqlParams);
+
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            return $this->oError->aFields;
+        }
+
+        if (gettype($oResult) == 'object') {
+            $aRecords = Array();
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                array_push($aRecords, $aLigne);
+            }
+        }
+
+        return $aRecords;
+    }
+
+    /**
+     *
+     * @param string $sSchema
+     * @param string $sTable
+     * @param string $geom
+     * @param array $aAttributs
+     * @return type
+     */
+    function vmapIntersectGet($sSchema, $sTable, $geom, $aAttributs, $iTolerance = 0, $sGeomColumn = 'geom', $sGeomType = 'POLYGON') {
+
+        $sGeomKey = 'geom_key_' . vitisUniqId();
+        $aOptionalParams = array(
+            $sGeomKey => array('value' => $geom, 'type' => 'geometry'),
+            $sGeomColumn => array('value' => $sGeomColumn, 'type' => 'column_name')
+        );
+
+        if ($sGeomType === 'POLYGON' || $sGeomType === 'MULTIPOLYGON') {
+            $sIntersectPercentage = "round(";
+            $sIntersectPercentage .= "ST_Area(";
+            $sIntersectPercentage .= "ST_Intersection(";
+            $sIntersectPercentage .= "ST_Transform(";
+            $sIntersectPercentage .= "ST_GeomFromEWKT([" . $sGeomKey . "]),";
+            $sIntersectPercentage .= "ST_SRID([" . $sGeomColumn . "])";
+            $sIntersectPercentage .= "), ";
+            $sIntersectPercentage .= "[" . $sGeomColumn . "])";
+            $sIntersectPercentage .= ")/ST_Area(";
+            $sIntersectPercentage .= "ST_Transform(";
+            $sIntersectPercentage .= "ST_GeomFromEWKT([" . $sGeomKey . "]),";
+            $sIntersectPercentage .= "ST_SRID([" . $sGeomColumn . "])";
+            $sIntersectPercentage .= ")";
+            $sIntersectPercentage .= ") * 100) as intersect";
+        } else if ($sGeomType === 'LINE' || $sGeomType === 'LINESTRING' || $sGeomType === 'MULTILINESTRING') {
+            $sIntersectPercentage = "round(";
+            $sIntersectPercentage .= "ST_Length(";
+            $sIntersectPercentage .= "ST_Intersection(";
+            $sIntersectPercentage .= "ST_Transform(";
+            $sIntersectPercentage .= "ST_GeomFromEWKT([" . $sGeomKey . "]),";
+            $sIntersectPercentage .= "ST_SRID([" . $sGeomColumn . "])";
+            $sIntersectPercentage .= "), ";
+            $sIntersectPercentage .= "[" . $sGeomColumn . "])";
+            $sIntersectPercentage .= ")) as intersect";
+        } else {
+            $sIntersectPercentage = "100 as intersect";
+        }
+
+        array_push($aAttributs, $sIntersectPercentage);
+        $sFilter = '{"column":"' . $sGeomColumn . '","compare_operator":"intersect","value":"' . $geom . '"}';
+
+        $aRecords = $this->vmapGet($sSchema, $sTable, $aAttributs, $sFilter, array(), $aOptionalParams);
+        $aTolerancedRecords = array();
+
+        for ($i = 0; $i < count($aRecords); $i++) {
+            if ($aRecords[$i]['intersect'] >= $iTolerance) {
+                array_push($aTolerancedRecords, $aRecords[$i]);
+            }
+        }
+        for ($i = 0; $i < count($aTolerancedRecords); $i++) {
+            if ($sGeomType === 'POLYGON' || $sGeomType === 'MULTIPOLYGON') {
+                $aTolerancedRecords[$i]['intersect'] = $aTolerancedRecords[$i]['intersect'] . '%';
+            } else if ($sGeomType === 'LINE' || $sGeomType === 'LINESTRING' || $sGeomType === 'MULTILINESTRING') {
+                $aTolerancedRecords[$i]['intersect'] = $aTolerancedRecords[$i]['intersect'] . 'm';
+            } else {
+                $aTolerancedRecords[$i]['intersect'] = true;
+            }
+        }
+
+        return $aTolerancedRecords;
+    }
+
+    /**
+     * Ajoute la chaîne de caractère au fichier des log vMap.
+     * \param $sString Chaîne de caractères.
+     */
+    function writeMapToVMapLog($sMapId, $sMapName) {
+        $sMapName = "\"" . $sMapName . "\"";
+        $sLog = $sMapId . $this->aProperties["log_delim"] . $sMapName;
+        if (isSet($this->aProperties["log_mode"])) {
+            if ($this->aProperties["log_mode"] == true) {
+                writeToLog($sLog, $this->aProperties["vmap_map_log_file"]);
+            }
+        }
+    }
+
+}
+
+?>
diff --git a/web_service/ws/Vmap.class.sql.inc b/web_service/ws/Vmap.class.sql.inc
new file mode 100755
index 0000000000000000000000000000000000000000..cf54181a5398368ea642685ca3d390afdb6f49e2
--- /dev/null
+++ b/web_service/ws/Vmap.class.sql.inc
@@ -0,0 +1,45 @@
+<?php
+//Définition des requêtes de l'api Vitis
+$aSql['checkIP'] = "SELECT user_id, ip_constraint FROM [sSchemaFramework].v_user WHERE login ='[sLogin]'";
+$aSql['getGroups'] = "SELECT group_id FROM [sSchemaFramework].v_user_group_by_rights WHERE user_id = [user_id]";
+$aSql['loginUnique'] = 'SELECT UPPER("login") FROM [sSchemaFramework]."v_user" WHERE UPPER("login")=UPPER(\'sLoginUser\')';
+$aSql['getLoginbyId'] = 'SELECT "login" FROM [sSchemaFramework]."v_user" WHERE user_id=[user_id]';
+$aSql['getTableColumn'] = 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = \'[sSchemaFramework]\' and table_name= \'[sTable]\'';
+$aSql['getUserPrivileges'] = 'SELECT groname FROM pg_user s LEFT OUTER JOIN pg_group g on (s.usesysid = any(g.grolist) )inner join [sSchemaFramework].v_user on "v_user".login = usename WHERE user_id = [user_id]';
+$aSql['listDomain'] = 'SELECT distinct domain, alias FROM [sSchemaFramework].domain WHERE "type" = \'AD\'';
+$aSql['createRolname'] = 'CREATE ROLE "vitis_[sDomain]" NOSUPERUSER INHERIT NOCREATEDB CREATEROLE;';
+$aSql['getInfoRolname'] = 'SELECT * FROM pg_catalog.pg_roles WHERE rolname = \'vitis_[sDomain]\'';
+// Maps
+$aSql['getMapGroups'] = "SELECT map_group.group_id, \"group\".name FROM [sSchemaVmap].map_group LEFT JOIN [sSchemaFramework].\"group\" ON \"group\".group_id = map_group.group_id WHERE map_group.map_id = [map_id]";
+$aSql['insertMapGroups'] = "INSERT INTO [sSchemaVmap].map_group(group_id, map_id) VALUES([group_id], [map_id])";
+$aSql['getMapLayers'] = "SELECT v_layer.layer_id,name,theme_name,layer_visible FROM [sSchemaVmap].v_layer,[sSchemaVmap].map_layer WHERE v_layer.layer_id=map_layer.layer_id";
+// VmapGroups
+$aSql['getGroupMaps'] = "SELECT map_group.map_id, map.name FROM [sSchemaVmap].map_group LEFT JOIN [sSchemaVmap].map ON map.map_id = map_group.map_id WHERE map_group.group_id = [group_id]";
+$aSql['insertGroupMaps'] = "INSERT INTO [sSchemaVmap].map_group(group_id, map_id) VALUES([group_id], [map_id])";
+$aSql['getGroupPrintTemplates'] = "SELECT printtemplate_group.printtemplate_id, printtemplate.name FROM [sSchemaVmap].printtemplate_group LEFT JOIN [sSchemaVmap].printtemplate ON printtemplate.printtemplate_id = printtemplate_group.printtemplate_id WHERE printtemplate_group.group_id = [group_id]";
+$aSql['insertGroupPrintTemplates'] = "INSERT INTO [sSchemaVmap].printtemplate_group(group_id, printtemplate_id) VALUES([group_id], [printtemplate_id])";
+// MapLayers
+$aSql['updateMapLayersVisibility'] = "UPDATE [sSchemaVmap].map_layer SET layer_visible=[visibility] WHERE map_id=[map_id] AND layer_id IN ([map_layers])";
+$aSql['insertMapLayers'] = "INSERT INTO [sSchemaVmap].map_layer(layer_id, map_id) VALUES([layer_id], [map_id])";
+$aSql['deleteMapLayers'] = "DELETE FROM [sSchemaVmap].map_layer WHERE map_id=[map_id] AND layer_id IN ([idList])";
+$aSql['updateMapLayerIndex'] = "UPDATE [sSchemaVmap].map_layer SET layer_index=[index] WHERE map_id=[map_id] AND layer_id=[layer_id]";
+$aSql['updateMapLayerOpacity'] = "UPDATE [sSchemaVmap].map_layer SET layer_opacity=[layer_opacity] WHERE map_id=[map_id] AND layer_id=[layer_id]";
+// VmapUsers
+$aSql['getUserPrintStyles'] = "SELECT user_printstyle.printstyle_id,printstyle.name FROM [sSchemaVmap].user_printstyle LEFT JOIN [sSchemaVmap].printstyle ON user_printstyle.printstyle_id = printstyle.printstyle_id WHERE user_printstyle.user_id = [user_id]";
+$aSql['insertUserPrintStyles'] = "INSERT INTO [sSchemaVmap].user_printstyle(user_id, printstyle_id) VALUES([user_id], [printstyle_id])";
+// PrintTemplates
+$aSql['getPrintTemplateParameters'] = "SELECT * FROM [sSchemaVmap].v_print_parameter WHERE printtemplate_id=[printtemplate_id]";
+$aSql['insertPrintTemplateGroups'] = "INSERT INTO [sSchemaVmap].printtemplate_group(group_id, printtemplate_id) VALUES([group_id], [printtemplate_id])";
+$aSql['getPrintTemplateGroups'] = "SELECT printtemplate_group.group_id, \"group\".name FROM [sSchemaVmap].printtemplate_group LEFT JOIN [sSchemaFramework].\"group\" ON \"group\".group_id = printtemplate_group.group_id WHERE printtemplate_group.printtemplate_id = [printtemplate_id]";
+$aSql['getUserPrintTemplateIds'] = "SELECT printtemplate_id FROM [sSchemaVmap].printtemplate_group WHERE group_id IN (SELECT group_id FROM [sSchemaFramework].v_user_group_by_rights WHERE user_id = (SELECT user_id FROM [sSchemaFramework].v_user WHERE login ='[sLogin]')) GROUP BY printtemplate_id";
+// Services
+$aSql['getTotalServiceLayers'] = "SELECT COUNT(*) AS nb_layers FROM [sSchemaVmap].layer WHERE service_id IN([idList])";
+// PrintStyles
+$aSql['getPrintStyleUsers'] = "SELECT user_printstyle.user_id, \"v_user\".login FROM [sSchemaVmap].user_printstyle LEFT JOIN [sSchemaFramework].\"v_user\" ON user_printstyle.user_id = \"v_user\".user_id WHERE user_printstyle.printstyle_id = [printstyle_id]";
+$aSql['insertPrintStyleUsers'] = "INSERT INTO [sSchemaVmap].user_printstyle(user_id, printstyle_id) VALUES([user_id], [printstyle_id])";
+// Layers
+$aSql['setLayerBoId'] = "UPDATE [sSchemaVmap].layer SET bo_id = NULL WHERE layer_id = [layer_id]";
+$aSql['deleteAssociatedBos'] = "DELETE FROM [sSchemaVmap].layer_businessobject WHERE layer_id = [layer_id]";
+$aSql['deleteAssociatedLayers'] = "DELETE FROM [sSchemaVmap].layer_businessobject WHERE business_object_id = [business_object_id]";
+$aSql['addAssociatedBos'] = "INSERT INTO [sSchemaVmap].layer_businessobject(layer_id, business_object_id) VALUES ([layer_id], [business_object_id]);";
+?>
\ No newline at end of file
diff --git a/web_service/ws/VmapGroup.class.inc b/web_service/ws/VmapGroup.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..f73054d984d01952321973c33659266ec0bd25f0
--- /dev/null
+++ b/web_service/ws/VmapGroup.class.inc
@@ -0,0 +1,125 @@
+<?php
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+/**
+* \file VmapGroup.class.inc
+* \class VmapGroup
+*
+* \author Armand Bahi <armand.bahi@veremes.com>.
+*
+*	\brief This file contains the VmapGroup php class
+*
+* This class defines operation for one Group
+* 
+*/
+class VmapGroup  extends Vmap {
+    
+    public $oError;
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("group_id", "name", "nb_members", "maps", "print_templates");
+    }
+      /**
+     * @SWG\Get(path="/vmapgroups/{group_id}", 
+     *   tags={"Groups"},
+     *   summary="Get Group",
+     *   description="Request to get Group by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+       *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+       * @SWG\Parameter(
+     *     name="group_id",
+     *     in="path",
+     *     description="group id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+       * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/groups")
+     *     )
+     *  )
+     */
+    /**
+     * get informations about mode
+     */
+    function GET(){
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_framework'], "v_group", "group_id");
+        $this->getMaps();
+        $this->getPrintTemplates();
+    }
+    
+    /**
+     *  get maps of group
+     */
+    function getMaps(){
+        require $this->sRessourcesFile;
+        if (in_array("maps", $this->aSelectedFields)){
+                $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+                $aParams['group_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+                $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGroupMaps'], $aParams);
+		$sListMapId = "";
+		$aListMapName = array();
+		while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+			if ($sListMapId == ""){
+				$sListMapId = $aLigne["map_id"];
+			}else{
+				$sListMapId .= "|".$aLigne["map_id"];
+			}
+                        $aListMapName[] = $aLigne["name"];
+		}
+		$oPDOresult=$this->oConnection->oBd->fermeResultat();
+                $this->aFields['maps'] = $sListMapId;
+                $this->aFields['maps_label'] = implode(',', $aListMapName);
+        }
+    }
+    
+    /**
+     *  get print templates of group
+     */
+    function getPrintTemplates(){
+        require $this->sRessourcesFile;
+        if (in_array("print_templates", $this->aSelectedFields)){
+                $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+                $aParams['group_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+                $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getGroupPrintTemplates'], $aParams);
+		$sListPrintTemplateId = "";
+		$aListPrintTemplateName = array();
+		while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+			if ($sListPrintTemplateId == ""){
+				$sListPrintTemplateId = $aLigne["printtemplate_id"];
+			}else{
+				$sListPrintTemplateId .= "|".$aLigne["printtemplate_id"];
+			}
+                        $aListPrintTemplateName[] = $aLigne["name"];
+		}
+		$oPDOresult=$this->oConnection->oBd->fermeResultat();
+                $this->aFields['print_templates'] = $sListPrintTemplateId;
+                $this->aFields['print_templates_label'] = implode(',', $aListPrintTemplateName);
+        }
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/VmapGroups.class.inc b/web_service/ws/VmapGroups.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..90bc39f280278e413a08665f2d3c264d3dfe3de0
--- /dev/null
+++ b/web_service/ws/VmapGroups.class.inc
@@ -0,0 +1,152 @@
+<?php
+
+/**
+* \file VmapGroups.class.inc
+* \class VmapGroups
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Modes php class
+*
+* This class defines Rest Api to Vmap Groups
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once 'VmapGroup.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+
+class VmapGroups extends Vmap {
+    
+     /**
+     * @SWG\Definition(
+     *   definition="/vmapgroups",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/vmapgroups")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="VmapGroups",
+     *   description="Operations about Groups"
+     * )
+     */
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("group_id", "name", "nb_members", "maps", "print_templates");
+    }
+    
+    /**
+     * get Groups
+     * @return  Groups
+     */
+    function GET() {
+        $aReturn = $this->genericGet( $this->aProperties['schema_framework'], "v_group", "group_id");
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/vmapgroups/{group_id}",
+     *   tags={"Groups"},
+     *   summary="Update Group",
+     *   description="Request to update Group",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="group token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="group_id",
+     *     in="path",
+     *     description="id of the group",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="maps",
+     *     in="query",
+     *     description="Maps of the group",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="print_templates",
+     *     in="query",
+     *     description="Print templates of the group",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/groups")
+     *     )
+     *  )
+     */
+
+    /**
+     * update group
+     * @return id of the group if ok error object if ko
+     */
+    function PUT() {
+        require $this->sRessourcesFile;
+        $aXmlRacineAttribute['status'] = 1;
+        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        // Supprime les cartes rattachés au groupe.
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'map_group', 'group_id', $this->aValues["my_vitis_id"]);
+        // Cartes à rattacher au groupe ?
+        if (!empty($this->aValues['maps'])) {
+            $aMaps = explode('|', $this->aValues['maps']);
+            foreach ($aMaps as $iMapId) {
+                $sSql = $aSql['insertGroupMaps'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'group_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'map_id' => array('value' => $iMapId, 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        }
+        // Supprime les modèles d'impression rattachés au groupe.
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'printtemplate_group', 'group_id', $this->aValues["my_vitis_id"]);
+        // Modèles d'impression à rattacher au groupe ?
+        if (!empty($this->aValues['print_templates'])) {
+            $aPrintTemplates = explode('|', $this->aValues['print_templates']);
+            foreach ($aPrintTemplates as $iPrintTemplateId) {                
+                $sSql = $aSql['insertGroupPrintTemplates'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'group_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'printtemplate_id' => array('value' => $iPrintTemplateId, 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        }
+        return $sMessage;
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/VmapUser.class.inc b/web_service/ws/VmapUser.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..d2225a63c1ddcc1b2aa30fabf6ed3beac354bafa
--- /dev/null
+++ b/web_service/ws/VmapUser.class.inc
@@ -0,0 +1,99 @@
+<?php
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+/**
+* \file VmapUser.class.inc
+* \class VmapUser
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the VmapUser php class
+*
+* This class defines operation for one User
+* 
+*/
+class VmapUser  extends Vmap {
+    
+    public $oError;
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("user_id", "login", "print_styles");
+    }
+      /**
+     * @SWG\Get(path="/vmapusers/{user_id}", 
+     *   tags={"Users"},
+     *   summary="Get User",
+     *   description="Request to get user by id",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+       *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+       * @SWG\Parameter(
+     *     name="user_id",
+     *     in="path",
+     *     description="user id",
+     *     required=true,
+     *     type="integer"
+     *   ),
+       * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+    /**
+     * get informations about mode
+     */
+    function GET(){
+        require $this->sRessourcesFile;
+        $this->aFields = $this->getFields($this->aProperties['schema_framework'], "v_user", "user_id");
+        $this->getPrintStyles();
+    }
+    
+    /**
+     *  get print styles of user
+     */
+    function getPrintStyles(){
+        require $this->sRessourcesFile;
+        if (in_array("print_styles", $this->aSelectedFields)){
+                $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+                $aParams['user_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+                $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getUserPrintStyles'], $aParams);
+		$sListPrintStyleId = "";
+                $aListPrintStyleId = array();
+		while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+			if ($sListPrintStyleId == ""){
+				$sListPrintStyleId = $aLigne["printstyle_id"];
+			}else{
+				$sListPrintStyleId .= "|".$aLigne["printstyle_id"];
+			}
+                        $aListPrintStyleId[] = $aLigne["name"];
+		}
+		$oPDOresult=$this->oConnection->oBd->fermeResultat();
+                $this->aFields['print_styles'] = $sListPrintStyleId;
+                $this->aFields['print_styles_label'] = implode(',', $aListPrintStyleId);
+        }
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/VmapUsers.class.inc b/web_service/ws/VmapUsers.class.inc
new file mode 100755
index 0000000000000000000000000000000000000000..ed8262b4f3b894ad2249154423789106444ad166
--- /dev/null
+++ b/web_service/ws/VmapUsers.class.inc
@@ -0,0 +1,131 @@
+<?php
+
+/**
+* \file VmapUsers.class.inc
+* \class VmapUsers
+*
+* \author Yoann Perollet <yoann.perollet@veremes.com>.
+*
+*	\brief This file contains the Modes php class
+*
+* This class defines Rest Api to Vmap Users
+* 
+*/
+require_once 'Vmap.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once 'VmapUser.class.inc';
+require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+
+class VmapUsers extends Vmap {
+    
+     /**
+     * @SWG\Definition(
+     *   definition="/vmapusers",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/vmapusers")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="VmapUsers",
+     *   description="Operations about Users"
+     * )
+     */
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+        $this->aSelectedFields = Array("user_id", "login", "print_styles");
+    }
+    
+    /**
+     * get Users
+     * @return  Users
+     */
+    function GET() {
+        $aReturn = $this->genericGet( $this->aProperties['schema_framework'], "v_user", "user_id");
+        return $aReturn['sMessage'];
+    }
+    
+    /**
+     * @SWG\Put(path="/vmapusers/{user_id}",
+     *   tags={"Users"},
+     *   summary="Update User",
+     *   description="Request to update User",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="user_id",
+     *     in="path",
+     *     description="id of the user",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="maps",
+     *     in="query",
+     *     description="Maps of the user",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="print_styles",
+     *     in="query",
+     *     description="Print styles of the user",
+     *     required=false,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="Properties Response",
+     *         @SWG\Schema(ref="#/definitions/users")
+     *     )
+     *  )
+     */
+
+    /**
+     * update user
+     * @return id of the user if ok error object if ko
+     */
+    function PUT() {
+        require $this->sRessourcesFile;
+        $aXmlRacineAttribute['status'] = 1;
+        $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+        // Supprime les styles d'impression rattachés à l'utilisateur.
+        $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'user_printstyle', 'user_id', $this->aValues["my_vitis_id"]);
+        // Styles d'impression à rattacher au usere ?
+        if (!empty($this->aValues['print_styles'])) {
+            $aPrintStyles = explode('|', $this->aValues['print_styles']);
+            foreach ($aPrintStyles as $iPrintStyleId) {                
+                $sSql = $aSql['insertUserPrintStyles'];
+                $aSQLParams = array(
+                    'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                    'user_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                    'printstyle_id' => array('value' => $iPrintStyleId, 'type' => 'number')
+                );
+                $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+                if ($this->oConnection->oBd->enErreur()) {
+                    $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                    $aXmlRacineAttribute['status'] = 0;
+                    $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+                }
+            }
+        }
+        return $sMessage;
+    }
+}
+?>
\ No newline at end of file
diff --git a/web_service/ws/Voie.class.inc b/web_service/ws/Voie.class.inc
deleted file mode 100755
index e9af9fbd41d7b4bdc2562c6d83a6d2237563b17a..0000000000000000000000000000000000000000
--- a/web_service/ws/Voie.class.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-require_once 'Cadastre.class.inc';
-require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
-
-/**
- * \file Voie.class.inc
- * \class Voie
- *
- * \author Armand Bahi <armand.bahi@veremes.com>.
- *
- * \brief This file contains the Voie php class
- *
- * This class defines operation for one Voie
- * 
- */
-class Voie extends Cadastre {
-
-    public $oError;
-
-    /**
-     * construct
-     * @param type $aPath url of the request
-     * @param type $aValues parameters of the request
-     * @param type $properties properties
-     * @param type $bShortcut false to reinit variables
-     * @param type $oConnection connection object
-     */
-    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
-        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array('LIBCOM', 'ID_COM', 'ID_RIVOLI', 'CCODEP', 'CCODIR', 'CCOCOM', 'RIVOLI', 'CLERIVOLI', 'LIBVOIE', 'TYPCOM', 'RUR', 'CARVOIE', 'ANNULATION', 'DATEANNUL', 'DATECREA', 'MAJIC2', 'TYPEVOIE', 'INDIC', 'MOTCLASS', 'CODE_INSEE', 'NATURE', 'L_NATURE_VOIE');
-    }
-
-    /**
-     * @SWG\Get(path="/voies/{ID_RIVOLI}", 
-     *   tags={"Voie"},
-     *   summary="Get Voie",
-     *   description="Request to get Voie by id",
-     *   operationId="GET",
-     *   produces={"application/xml", "application/json", "application/x-vm-json"},
-     *   @SWG\Parameter(
-     *     name="token",
-     *     in="query",
-     *     description="user token",
-     *     required=true,
-     *     type="string"
-     *   ),
-     *   @SWG\Parameter(
-     *     name="ID_RIVOLI",
-     *     in="path",
-     *     description="voie id",
-     *     required=true,
-     *     type="integer",
-     *   format="int32"
-     *   ),
-     *   @SWG\Response(
-     *         response=200,
-     *         description="Poprerties Response",
-     *         @SWG\Schema(ref="#/definitions/voies")
-     *     )
-     *  )
-     */
-
-    /**
-     * get informations about Voie
-     */
-    function GET() {
-        require dirname($_SERVER['SCRIPT_FILENAME']) . "/ws/vitis/" . $this->sRessourcesFile;
-        $this->aFields = $this->getFields('public', $this->aProperties['cadastre']['views']['voie'], 'ID_RIVOLI');
-    }
-
-}
-
-?>
\ No newline at end of file
diff --git a/web_service/ws/overview.phtml b/web_service/ws/overview.phtml
index 6e2671fd6c08fdba779ea28e8fdc96dc0a7f35c0..953c1aba67d7feead570b2308915797249f3fdcd 100755
--- a/web_service/ws/overview.phtml
+++ b/web_service/ws/overview.phtml
@@ -1,24 +1,24 @@
 <?php
 /**
  * @SWG\Swagger(
- *      basePath="/[service_alias]/cadastre",
+ *      basePath="/[service_alias]/vmap",
  *     	host="[server]",
  *    	schemes={"[protocol]"},
  *     	produces={  
  *          "application/json",
-            "application/xml",
-            "text/html"
+  "application/xml",
+  "text/html"
  * 		},
  *     @SWG\Info(
  *         version="1.0.0",
- *         title="Cadastre Test Rest",
- *         description="All features to access server operation for cadastre",
+ *         title="Vmap Test Rest",
+ *         description="All features to access server operation for vmap",
  *     )
  * )
  */
 ?>
 
-<h1 class="titleOverview">Service Cadastre</h1>
+<h1 class="titleOverview">Service Vmap</h1>
 <p>
-	<a class="linkOverview" href="javascript:sService='cadastre';LoadApi()">Cadastre</a>: this is the most comprehensive service which should be used as a preference when developing applications communicating with Cadastre. Those services allow you to administrate Cadastre applications.
+    <a class="linkOverview" href="javascript:sService='vmap';LoadApi()">Vmap</a>: service which should be used when developing applications communicating with Vmap. This service allows you to administrate Vmap application.
 </p>
\ No newline at end of file
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-2/thumbnail/france.jpg b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-2/thumbnail/france.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..bd6b8814b47bf6be2fe6cbedf7e5bcf1fb92197a
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-2/thumbnail/france.jpg differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-3/thumbnail/cadastre.jpg b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-3/thumbnail/cadastre.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..b1038352078e6b87d3207e87c328e0c62bf907f0
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/-3/thumbnail/cadastre.jpg differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/15/thumbnail/geobret.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/15/thumbnail/geobret.png
new file mode 100755
index 0000000000000000000000000000000000000000..e7be8aff817c45a14c8347b517d768354f952625
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/15/thumbnail/geobret.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/10/thumbnail/transport-dark-294.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/10/thumbnail/transport-dark-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..5cf337d0c5775524bcbddbda2c9e5b087b5294e7
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/10/thumbnail/transport-dark-294.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/4/thumbnail/osm.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/4/thumbnail/osm.png
new file mode 100755
index 0000000000000000000000000000000000000000..10ffb41190a4f008634eb1043912e078ed1720ec
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/4/thumbnail/osm.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/5/thumbnail/seamap.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/5/thumbnail/seamap.png
new file mode 100755
index 0000000000000000000000000000000000000000..bf90482bebf8cf33326b5649f3f63d34a8abdc60
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/5/thumbnail/seamap.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/6/thumbnail/opencyclemap.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/6/thumbnail/opencyclemap.png
new file mode 100755
index 0000000000000000000000000000000000000000..7c6b126883d984cfac4276e9fdca99e73dc99c43
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/6/thumbnail/opencyclemap.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/7/thumbnail/transport-294.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/7/thumbnail/transport-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..289d73f438b99d74fc45f42d0d5208ecf5b326f5
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/7/thumbnail/transport-294.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/8/thumbnail/landscape-294.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/8/thumbnail/landscape-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..061dfe711dce62dd394bebebea1b86c255e01f8c
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/8/thumbnail/landscape-294.png differ
diff --git a/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/9/thumbnail/outdoors-294.png b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/9/thumbnail/outdoors-294.png
new file mode 100755
index 0000000000000000000000000000000000000000..d006a4ea4bc7a4918bec8321275cc79a286139a6
Binary files /dev/null and b/web_service/ws_data/vitis/vmap_admin_map_vmap_services/documents/9/thumbnail/outdoors-294.png differ